X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fcompiler.h;h=372f571d9d7dd1fa5e0fb4a15d87bf2d2fef8cee;hb=3d109f9c4c5f0249b75e7a79db64d53b1bbcfb93;hp=27665fc18d016abbc12b0f2fe3a71c7682f574ee;hpb=a86868526e163812eb286ea71fe9600df7deea4a;p=simgear.git diff --git a/simgear/compiler.h b/simgear/compiler.h index 27665fc1..372f571d 100644 --- a/simgear/compiler.h +++ b/simgear/compiler.h @@ -11,179 +11,66 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $Id$ + * **************************************************************************/ -#ifndef _COMPILER_H -#define _COMPILER_H - -// What this file does. -// (1) Defines macros for some STL includes which may be affected -// by file name length limitations. -// (2) Defines macros for some features not supported by all C++ compilers. -// (3) Defines 'explicit' as a null macro if the compiler doesn't support -// the explicit keyword. -// (4) Defines 'typename' as a null macro if the compiler doesn't support -// the typename keyword. -// (5) Defines bool, true and false if the compiler doesn't do so. -// (6) Defines FG_EXPLICIT_FUNCTION_TMPL_ARGS if the compiler -// supports calling a function template by providing its template -// arguments explicitly. -// (7) Defines FG_NEED_AUTO_PTR if STL doesn't provide auto_ptr<>. -// (8) Defines FG_NO_ARROW_OPERATOR if the compiler is unable -// to support operator->() for iterators. -// (9) Defines FG_USE_EXCEPTIONS if the compiler supports exceptions. -// Note: no FlightGear code uses exceptions. -// (10) Define FG_NAMESPACES if the compiler supports namespaces. -// (11) FG_MATH_FN_IN_NAMESPACE_STD -- not used?? -// (12) Define FG_HAVE_STD if std namespace is supported. -// (13) Defines FG_CLASS_PARTIAL_SPECIALIZATION if the compiler -// supports partial specialization of class templates. -// (14) Defines FG_HAVE_STD_INCLUDES to use ISO C++ Standard headers. -// (15) Defines FG_HAVE_STREAMBUF if of are present. -// (16) Define FG_MATH_EXCEPTION_CLASH if math.h defines an exception class -// that clashes with the one defined in . +/** \file compiler.h + * A set of defines to encapsulate compiler and platform differences. + * Please refer to the source code for full documentation on this file. + * + * This file is useful to set compiler-specific options in every file - for + * example, disabling warnings. + * + */ -#ifdef __GNUC__ -# if __GNUC__ == 2 -# if __GNUC_MINOR__ < 8 - - // g++-2.7.x -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM - -# define FG_NEED_AUTO_PTR -# define FG_NO_DEFAULT_TEMPLATE_ARGS -# define FG_INCOMPLETE_FUNCTIONAL -# define FG_NO_ARROW_OPERATOR - -# elif __GNUC_MINOR__ >= 8 - - // g++-2.8.x and egcs-1.x -# define FG_EXPLICIT_FUNCTION_TMPL_ARGS -# define FG_NEED_AUTO_PTR -# define FG_MEMBER_TEMPLATES -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_HAVE_STREAMBUF -# define FG_CLASS_PARTIAL_SPECIALIZATION - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM +#ifndef _SG_COMPILER_H +#define _SG_COMPILER_H -# endif -# else -# error Time to upgrade. GNU compilers < 2.7 not supported +/* + * Helper macro SG_STRINGIZE: + * Converts the parameter X to a string after macro replacement + * on X has been performed. + */ +#define SG_STRINGIZE(X) SG_DO_STRINGIZE(X) +#define SG_DO_STRINGIZE(X) #X + +#ifdef __GNUC__ +# if __GNUC__ < 3 +# error Time to upgrade. GNU compilers < 3.0 not supported +# elif (__GNUC__ == 3) && (__GNUC_MINOR__ < 4) +# warning GCC compilers prior to 3.4 are suspect # endif -#endif + +# define SG_COMPILER_STR "GNU C++ version " SG_STRINGIZE(__GNUC__) "." SG_STRINGIZE(__GNUC_MINOR__) +#endif // __GNUC__ /* KAI C++ */ #if defined(__KCC) - -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_HAVE_STREAMBUF -# define FG_HAVE_TRAITS -# define FG_HAVE_STD_INCLUDES - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM -#endif - -// -// Metrowerks -// -#if defined(__MWERKS__) -/* - CodeWarrior compiler from Metrowerks, Inc. -*/ -# define FG_HAVE_TRAITS -# define FG_HAVE_STD_INCLUDES -# define FG_HAVE_STD -# define FG_NAMESPACES - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING - -// Temp: -# define bcopy(from, to, n) memcpy(to, from, n) - -// -rp- please use FG_MEM_COPY everywhere ! -// #define FG_MEM_COPY(to,from,n) memcpy(to, from, n) - -// -dw- currently used glut has no game mode stuff -# define GLUT_WRONG_VERSION -#endif +# define SG_COMPILER_STR "Kai C++ version " SG_STRINGIZE(__KCC_VERSION) +#endif // __KCC // // Microsoft compilers. // #ifdef _MSC_VER # define bcopy(from, to, n) memcpy(to, from, n) -# define FG_MEM_COPY(to,from,n) memcpy(to, from, n) - -# if _MSC_VER == 1200 // msvc++ 6.0 -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_HAVE_STD_INCLUDES -# define FG_HAVE_STREAMBUF - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM -# pragma warning(disable: 4786) // identifier was truncated to '255' characters -# pragma warning(disable: 4244) // conversion from double to float -# pragma warning(disable: 4305) // +# if _MSC_VER >= 1200 // msvc++ 6.0 or greater +# define isnan _isnan +# define snprintf _snprintf +# if _MSC_VER < 1500 +# define vsnprintf _vsnprintf +# endif +# define copysign _copysign +# define strcasecmp stricmp -# elif _MSC_VER == 1100 // msvc++ 5.0 -# define NEEDNAMESPACESTD -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_HAVE_STD_INCLUDES -# define FG_HAVE_STREAMBUF - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM +# undef min +# undef max # pragma warning(disable: 4786) // identifier was truncated to '255' characters # pragma warning(disable: 4244) // conversion from double to float @@ -192,67 +79,37 @@ # else # error What version of MSVC++ is this? # endif -#endif - -#ifdef __BORLANDC__ -# if defined(HAVE_SGI_STL_PORT) - -// Use quotes around long file names to get around Borland's include hackery - -# define STL_ALGORITHM "algorithm" -# define STL_FUNCTIONAL "functional" -# define FG_MATH_EXCEPTION_CLASH +# define SG_COMPILER_STR "Microsoft Visual C++ version " SG_STRINGIZE(_MSC_VER) -# else - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_STDEXCEPT -# define STL_STRSTREAM - -# define FG_INCOMPLETE_FUNCTIONAL - -# endif // HAVE_SGI_STL_PORT - -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STRING -# define FG_NO_DEFAULT_TEMPLATE_ARGS -# define FG_NAMESPACES -// # define FG_HAVE_STD - -#endif // __BORLANDC__ +#endif // _MSC_VER // // Native SGI compilers // #if defined ( sgi ) && !defined( __GNUC__ ) -# define FG_HAVE_NATIVE_SGI_COMPILERS - -# define FG_EXPLICIT_FUNCTION_TMPL_ARGS -# define FG_NEED_AUTO_PTR -# define FG_MEMBER_TEMPLATES -# define FG_NAMESPACES -# define FG_HAVE_STD -# define FG_CLASS_PARTIAL_SPECIALIZATION -# define FG_HAVE_TRAITS - -# define STL_ALGORITHM -# define STL_FUNCTIONAL -# define STL_IOMANIP -# define STL_IOSTREAM -# define STL_FSTREAM -# define STL_STDEXCEPT -# define STL_STRING -# define STL_STRSTREAM +# if (_COMPILER_VERSION < 740) +# error Need MipsPro 7.4.0 or higher now +# endif + +#define SG_HAVE_NATIVE_SGI_COMPILERS + +#pragma set woff 1001,1012,1014,1116,1155,1172,1174 +#pragma set woff 1401,1460,1551,1552,1681 + +#ifdef __cplusplus +# pragma set woff 1682,3303 +# pragma set woff 3624 +#endif + +# define SG_COMPILER_STR "SGI MipsPro compiler version " SG_STRINGIZE(_COMPILER_VERSION) #endif // Native SGI compilers -#if defined ( sun ) +#if defined (__sun) +# define SG_UNIX # include # include # if defined ( __cplusplus ) @@ -263,83 +120,70 @@ # else extern void *memmove(void *, const void *, size_t); # endif // __cplusplus + +# if !defined( __GNUC__ ) +# define SG_COMPILER_STR "Sun compiler version " SG_STRINGIZE(__SUNPRO_CC) +# endif + #endif // sun // -// No user modifiable definitions beyond here. +// Intel C++ Compiler // +#if defined(__ICC) || defined (__ECC) +# define SG_COMPILER_STR "Intel C++ version " SG_STRINGIZE(__ICC) +#endif // __ICC -#ifdef FG_NEED_EXPLICIT -# define explicit -#endif +// +// Platform dependent gl.h and glut.h definitions +// -#ifdef FG_NEED_TYPENAME -# define typename +#ifdef __APPLE__ +# define SG_MAC +# define SG_UNIX +# ifdef __GNUC__ +# if ( __GNUC__ > 3 ) || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 3 ) +inline int (isnan)(double r) { return !(r <= 0 || r >= 0); } +# else + // any C++ header file undefines isinf and isnan + // so this should be included before + // the functions are STILL in libm (libSystem on mac os x) +extern "C" int (isnan)(double); +extern "C" int (isinf)(double); +# endif +# else +inline int (isnan)(double r) { return !(r <= 0 || r >= 0); } +# endif #endif -#ifdef FG_NEED_MUTABLE -# define mutable +#if defined (__FreeBSD__) +# define SG_UNIX +#include +# if __FreeBSD_version < 500000 + extern "C" { + inline int isnan(double r) { return !(r <= 0 || r >= 0); } + } +# endif #endif -#ifdef FG_NEED_BOOL - typedef int bool; -# define true 1 -# define false 0 +#if defined (__CYGWIN__) +# define SG_WINDOWS +# define SG_UNIX +# include // isnan #endif -#ifdef FG_EXPLICIT_FUNCTION_TMPL_ARGS -# define FG_NULL_TMPL_ARGS <> -#else -# define FG_NULL_TMPL_ARGS +// includes both MSVC and mingw compilers +#if defined(_WIN32) || defined(__WIN32__) +# define SG_WINDOWS #endif -#ifdef FG_CLASS_PARTIAL_SPECIALIZATION -# define FG_TEMPLATE_NULL template<> -#else -# define FG_TEMPLATE_NULL +#if defined(__linux__) || defined(_AIX) || defined ( sgi ) +# define SG_UNIX #endif -// FG_NO_NAMESPACES is a hook so that users can disable namespaces -// without having to edit library headers. -#if defined(FG_NAMESPACES) && !defined(FG_NO_NAMESPACES) -# define FG_NAMESPACE(X) namespace X { -# define FG_NAMESPACE_END } -# define FG_USING_NAMESPACE(X) using namespace X -# else -# define FG_NAMESPACE(X) -# define FG_NAMESPACE_END -# define FG_USING_NAMESPACE(X) -#endif +// +// No user modifiable definitions beyond here. +// -# ifdef FG_HAVE_STD -# define FG_USING_STD(X) using std::X -# define STD std -# else -# define FG_USING_STD(X) -# define STD -# endif +#endif // _SG_COMPILER_H -// Additional implementation from SGI STL 3.11 -// Adapter function objects: pointers to member functions -#ifdef FG_INCOMPLETE_FUNCTIONAL - -template -class const_mem_fun_ref_t -#ifndef __BORLANDC__ - : public unary_function<_Tp,_Ret> -#endif // __BORLANDC__ -{ -public: - explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {} - _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); } -private: - _Ret (_Tp::*_M_f)() const; -}; - -template -inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const) - { return const_mem_fun_ref_t<_Ret,_Tp>(__f); } - -#endif // FG_INCOMPLETE_FUNCTIONAL - -#endif // _COMPILER_H