![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** \file Compiler.hpp
00002 * \author Jason Kraftcheck
00003 * \date 2010-12-16
00004 *
00005 * Provide pre-processor macros for compiler-specific features. All
00006 * defined macros should expand to nothing if not supported by the
00007 * compiler.
00008 */
00009
00010 #ifndef moab_COMPILER_HPP
00011 #define moab_COMPILER_HPP
00012
00013 #ifdef IS_BUILDING_MB
00014
00015 /**\defgroup PRIVCOMP Private Compiler-Specifc Pre-Processor Macros */
00016 /*@{*/
00017
00018 /**\def __restrict__
00019 *\brief Provide functionality similar to C99 \c restrict keyword
00020 *
00021 * Tell the compiler that a pointer is not aliased. This means that
00022 * programmer guarantees that no other pointer will be used to reference
00023 * memory that is referenced through the designated pointer unless it
00024 * is obivous to the compiler in the relevant function. A typical use
00025 * for this is to specify that two pointer arguments to a function will
00026 * never be used to reference overlapping memory. For example:
00027 *\code
00028 * void* memcpy(void* __restrict__ dest, const void* __restrict__ src, size_t len);
00029 *\endcode
00030 * Says that the memory locations indicated by the \c dest and \c src pointers
00031 * will never be used to reference overlapping memory, including offsets up to
00032 * \c len.
00033 *
00034 * Notifying the compiler about lack of pointer aliasing allows it to make
00035 * better optimizations. However, the behavior is undefined (and probably
00036 * broken in platform-specific ways) if designated pointers are aliased.
00037 */
00038 #ifdef __cplusplus
00039 #if !defined __GNUC__ || __GNUC__ < 4 || __GNUC_MINOR__ < 5
00040 #define __restrict__
00041 #endif
00042 #endif
00043
00044 /*@}*/
00045
00046 #endif
00047
00048 /**\defgroup PUBCOMP Public Compiler-Specifc Pre-Processor Macros */
00049 /*@{*/
00050
00051 /**\def PRINT_FORMAT(start)
00052 *\brief Give a hint to the compiler the function is like \c printf
00053 *
00054 * Tell the compiler that the function involves a printf-style format
00055 * string and varargs list. This gives the compiler the opportunity
00056 * to warn if the argument types do not match the format string.
00057 * This macro should be inluded after the complete function declaration,
00058 * but before the closing semi-colon.
00059 *
00060 *\param START The position of the format string in the argument list, where
00061 * the first argument is 1.
00062 *\NOTE This macro is designed to be used with member functions of C++ classes,
00063 * and therefore explicitly accounts for the implicit \c this pointer
00064 * in the argument list. It will not work correctly with static or
00065 * non-member functions.
00066 *\NOTE This macro assumes that the arguments referenced in the format string
00067 * begin immediately after the format string itself.
00068 */
00069 #ifdef __GNUC__
00070 #define MB_PRINTF( START ) __attribute__( ( format( printf, ( START ) + 1, ( START ) + 2 ) ) )
00071 #else
00072 #define MB_PRINTF( START )
00073 #endif
00074
00075 /**\def MB_DLL_EXPORT
00076 *\brief Declare a function or class to be visible in shared library.
00077 */
00078 /**\def MB_DLL_HIDDEN
00079 *\brief Declare a function or class to be internal to a shared library.
00080 */
00081 #if defined _MSC_VER || defined __CYGWIN__ || defined __MINGW32__ || defined __MINGW64__ || defined _WIN32
00082 #if !defined IS_BUILDING_MB || !defined MB_EXPORTS
00083 #define MB_DLL_EXPORT __dllspec( dllexport )
00084 #elif !defined MB_WIN_DLL
00085 #define MB_DLL_EXPORT __dllspec( dllimport )
00086 #else
00087 #define MB_DLL_EXPORT
00088 #endif
00089 #define MB_DLL_HIDDEN
00090 #elif defined __GNUC__ && __GNUC__ > 3
00091 #define MB_DLL_EXPORT __attribute__( ( visibility( "default" ) ) )
00092 #define MB_DLL_HIDDEN __attribute__( ( visibility( "hidden" ) ) )
00093 #else
00094 #define MB_DLL_EXPORT
00095 #define MB_DLL_HIDDEN
00096 #endif
00097
00098 /**\def MB_DEPRECATED
00099 *\brief Mark function or API as deprecated
00100 */
00101 #if defined( __GNUC__ ) && ( 1000 * __GNUC__ + __GNUC_MINOR__ ) > 3000
00102 #define MB_DEPRECATED __attribute__( ( __deprecated__ ) )
00103 #else
00104 #define MB_DEPRECATED
00105 #endif
00106
00107 /*@}*/
00108
00109 #endif // moab_COMPILER_HPP