F4MP/f4mp_originalcode/F4MPServer/include/minbase/minbase_decls.h

206 lines
5.9 KiB
C
Raw Normal View History

//====== Copyright 1996-2012, Valve Corporation, All rights reserved. ======//
//
// Portable declaration decorations.
//
//==========================================================================//
#ifndef MINBASE_DECLS_H
#define MINBASE_DECLS_H
#pragma once
// Identification is needed everywhere but we don't want to include
// it over and over again so just make sure it was already included.
#ifndef MINBASE_IDENTIFY_H
#error Must include minbase_identify.h
#endif
// Use this to specify that a function is an override of a virtual function.
// This lets the compiler catch cases where you meant to override a virtual
// function but you accidentally changed the function signature and created
// an overloaded function. Usage in function declarations is like this:
// int GetData() const OVERRIDE;
#ifndef OVERRIDE
#define OVERRIDE override
#endif
// This can be used to ensure the size of pointers to members when declaring
// a pointer type for a class that has only been forward declared
#ifdef _MSC_VER
#define SINGLE_INHERITANCE __single_inheritance
#define MULTIPLE_INHERITANCE __multiple_inheritance
#else
#define SINGLE_INHERITANCE
#define MULTIPLE_INHERITANCE
#endif
#ifdef _MSC_VER
#define NO_VTABLE __declspec( novtable )
#else
#define NO_VTABLE
#endif
// This can be used to declare an abstract (interface only) class.
// Classes marked abstract should not be instantiated. If they are, and access violation will occur.
//
// Example of use:
//
// abstract_class CFoo
// {
// ...
// }
//
// MSDN __declspec(novtable) documentation: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_langref_novtable.asp
//
// Note: NJS: This is not enabled for regular PC, due to not knowing the implications of exporting a class with no no vtable.
// It's probable that this shouldn't be an issue, but an experiment should be done to verify this.
//
#ifndef _XBOX
#define abstract_class class
#else
#define abstract_class class NO_VTABLE
#endif
// C functions for external declarations that call the appropriate C++ methods
#ifndef EXPORT
#ifdef _WIN32
#define EXPORT _declspec( dllexport )
#else
#define EXPORT /* */
#endif
#endif
#if _MSC_VER >= 1400
#define NOALIAS __declspec(noalias)
#define RESTRICT __restrict
#define RESTRICT_FUNC __declspec(restrict)
#else // _MSC_VER >= 1400
#define NOALIAS
#define RESTRICT
#define RESTRICT_FUNC
#endif // _MSC_VER >= 1400
// Linux had a few areas where it didn't construct objects in the same order that Windows does.
// So when CVProfile::CVProfile() would access g_pMemAlloc, it would crash because the allocator wasn't initalized yet.
#if defined( GNUC ) || defined ( COMPILER_GCC ) || defined( COMPILER_SNC )
#define CONSTRUCT_EARLY __attribute__((init_priority(101)))
#else
#define CONSTRUCT_EARLY
#endif
#ifdef _WIN32
#define SELECTANY __declspec(selectany)
#elif defined(GNUC) || defined ( COMPILER_GCC ) || defined( COMPILER_SNC )
#define SELECTANY __attribute__((weak))
#else
#define SELECTANY static
#endif
#undef DLL_EXPORT
#undef DLL_IMPORT
#if defined(_WIN32) && !defined(_XBOX)
#define PLAT_DECL_EXPORT __declspec( dllexport )
#define PLAT_DECL_IMPORT __declspec( dllimport )
#elif defined(GNUC) || defined(COMPILER_GCC)
#define PLAT_DECL_EXPORT __attribute__((visibility("default")))
#define PLAT_DECL_IMPORT
#elif defined(_XBOX) || defined(COMPILER_SNC)
#define PLAT_DECL_EXPORT
#define PLAT_DECL_IMPORT
#else
#error "Unsupported Platform."
#endif
#if defined(_XBOX)
#define DLL_EXPORT extern
#define DLL_IMPORT extern
#define DLL_CLASS_EXPORT
#define DLL_CLASS_IMPORT
#define DLL_GLOBAL_EXPORT
#define DLL_GLOBAL_IMPORT
#else
// Used for dll exporting and importing
#define DLL_EXPORT extern "C" PLAT_DECL_EXPORT
#define DLL_IMPORT extern "C" PLAT_DECL_IMPORT
// Can't use extern "C" when DLL exporting a class
#define DLL_CLASS_EXPORT PLAT_DECL_EXPORT
#define DLL_CLASS_IMPORT PLAT_DECL_IMPORT
#define DLL_GLOBAL_EXPORT PLAT_DECL_EXPORT
#define DLL_GLOBAL_IMPORT extern PLAT_DECL_IMPORT
#endif
#ifdef FASTCALL
#undef FASTCALL
#endif
// Used for standard calling conventions
#if defined(_WIN32)
#define STDCALL __stdcall
#define FASTCALL __fastcall
#elif defined(_PS3)
#if defined( COMPILER_SNC )
#define STDCALL
#define __stdcall
#elif (CROSS_PLATFORM_VERSION >= 1) && !defined( PLATFORM_64BITS ) && !defined( COMPILER_PS3 )
#define STDCALL __attribute__ ((__stdcall__))
#else
#define STDCALL
#define __stdcall __attribute__ ((__stdcall__))
#endif
#define FASTCALL
#elif defined(POSIX)
#define __stdcall
#define __cdecl
#define STDCALL
#define FASTCALL
#endif
#if defined(_WIN32)
#define NOINLINE __declspec(noinline)
#define NORETURN __declspec(noreturn)
#define FORCEINLINE __forceinline
#elif defined(GNUC) || defined(COMPILER_GCC) || defined(COMPILER_SNC)
#define NOINLINE __attribute__ ((noinline))
#define NORETURN __attribute__ ((noreturn))
#if defined(COMPILER_GCC) || defined(COMPILER_SNC)
#define FORCEINLINE inline __attribute__ ((always_inline))
// GCC 3.4.1 has a bug in supporting forced inline of templated functions
// this macro lets us not force inlining in that case
#define FORCEINLINE_TEMPLATE inline
#else
#define FORCEINLINE inline
#define FORCEINLINE_TEMPLATE inline
#endif
#endif
// We have some template functions declared in header files that
// only need static scope. Older MSVC version lets you use 'static' qualifiers
// but GCC and new MSVC does not, where we need to use 'inline' to avoid multiple definitions.
#ifdef COMPILER_MSVC32
#if _MSC_VER <= 1910
#define STATIC_TEMPLATE_INLINE static
#else
#define STATIC_TEMPLATE_INLINE inline
#endif
#else
#define STATIC_TEMPLATE_INLINE inline
#endif
#if !defined(UNALIGNED)
#if defined(_M_IA64) || defined(_M_AMD64)
#define UNALIGNED __unaligned
#else
#define UNALIGNED
#endif
#endif
#endif // #ifndef MINBASE_DECLS_H