/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * Copyright (c) 1997 * Silicon Graphics * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * */ #ifndef __STL_CONFIG_H # define __STL_CONFIG_H // Flags: // * __STL_NO_BOOL: defined if the compiler doesn't have bool as a builtin // type. // * __STL_HAS_WCHAR_T: defined if the compier has wchar_t as a builtin type. // * __STL_NO_DRAND48: defined if the compiler doesn't have the drand48 // function. // * __STL_STATIC_TEMPLATE_MEMBER_BUG: defined if the compiler can't handle // static members of template classes. // * __STL_STATIC_CONST_INIT_BUG: defined if the compiler can't handle a // constant-initializer in the declaration of a static const data member // of integer type. (See section 9.4.2, paragraph 4, of the C++ standard.) // * __STL_CLASS_PARTIAL_SPECIALIZATION: defined if the compiler supports // partial specialization of template classes. // * __STL_PARTIAL_SPECIALIZATION_SYNTAX: defined if the compiler // supports partial specialization syntax for full specialization of // class templates. (Even if it doesn't actually support partial // specialization itself.) // * __STL_FUNCTION_TMPL_PARTIAL_ORDER: defined if the compiler supports // partial ordering of function templates. (a.k.a partial specialization // of function templates.) // * __STL_MEMBER_TEMPLATES: defined if the compiler supports template // member functions of classes. // * __STL_MEMBER_TEMPLATE_CLASSES: defined if the compiler supports // nested classes that are member templates of other classes. // * __STL_TEMPLATE_FRIENDS: defined if the compiler supports templatized // friend declarations. // * __STL_EXPLICIT_FUNCTION_TMPL_ARGS: defined if the compiler // supports calling a function template by providing its template // arguments explicitly. // * __STL_LIMITED_DEFAULT_TEMPLATES: defined if the compiler is unable // to handle default template parameters that depend on previous template // parameters. // * __STL_NON_TYPE_TMPL_PARAM_BUG: defined if the compiler has trouble with // function template argument deduction for non-type template parameters. // * __SGI_STL_NO_ARROW_OPERATOR: defined if the compiler is unable // to support the -> operator for iterators. // * __STL_DEFAULT_CONSTRUCTOR_BUG: defined if T() does not work properly // when T is a builtin type. // * __STL_USE_EXCEPTIONS: defined if the compiler (in the current compilation // mode) supports exceptions. // * __STL_USE_NAMESPACES: defined if the compiler has the necessary // support for namespaces. // * __STL_NO_EXCEPTION_HEADER: defined if the compiler does not have a // standard-conforming header . // * __STL_NO_BAD_ALLOC: defined if the compiler does not have a // header, or if does not contain a bad_alloc class. If a bad_alloc // class exists, it is assumed to be in namespace std. // * __STL_SGI_THREADS: defined if this is being compiled for an SGI IRIX // system in multithreaded mode, using native SGI threads instead of // pthreads. // * __STL_WIN32THREADS: defined if this is being compiled on a WIN32 // compiler in multithreaded mode. // * __STL_PTHREADS: defined if we should use portable pthreads // synchronization. // * __STL_UITHREADS: defined if we should use UI / solaris / UnixWare threads // synchronization. UIthreads are similar to pthreads, but are based // on an earlier version of the Posix threads standard. // * __STL_LONG_LONG if the compiler has long long and unsigned long long // types. (They're not in the C++ standard, but they are expected to be // included in the forthcoming C9X standard.) // * __STL_THREADS is defined if thread safety is needed. // * __STL_VOLATILE is defined to be "volatile" if threads are being // used, and the empty string otherwise. // * __STL_USE_CONCEPT_CHECKS enables some extra compile-time error // checking to make sure that user-defined template arguments satisfy // all of the appropriate requirements. This may result in more // comprehensible error messages. It incurs no runtime overhead. This // feature requires member templates and partial specialization. // * __STL_NO_USING_CLAUSE_IN_CLASS: The compiler does not handle "using" // clauses inside of class definitions. // * __STL_NO_FRIEND_TEMPLATE_CLASS: The compiler does not handle friend // declaractions where the friend is a template class. // * __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE: The compiler does not // support the use of a function pointer type as the argument // for a template. // * __STL_MEMBER_TEMPLATE_KEYWORD: standard C++ requires the template // keyword in a few new places (14.2.4). This flag is set for // compilers that support (and require) this usage. // User-settable macros that control compilation: // * __STL_USE_SGI_ALLOCATORS: if defined, then the STL will use older // SGI-style allocators, instead of standard-conforming allocators, // even if the compiler supports all of the language features needed // for standard-conforming allocators. // * __STL_NO_NAMESPACES: if defined, don't put the library in namespace // std, even if the compiler supports namespaces. // * __STL_NO_RELOPS_NAMESPACE: if defined, don't put the relational // operator templates (>, <=. >=, !=) in namespace std::rel_ops, even // if the compiler supports namespaces and partial ordering of // function templates. // * __STL_ASSERTIONS: if defined, then enable runtime checking through the // __stl_assert macro. // * _PTHREADS: if defined, use Posix threads for multithreading support. // * _UITHREADS:if defined, use SCO/Solaris/UI threads for multithreading // support // * _NOTHREADS: if defined, don't use any multithreading support. // * _STL_NO_CONCEPT_CHECKS: if defined, disables the error checking that // we get from __STL_USE_CONCEPT_CHECKS. // * __STL_USE_NEW_IOSTREAMS: if defined, then the STL will use new, // standard-conforming iostreams (e.g. the header). If not // defined, the STL will use old cfront-style iostreams (e.g. the // header). // Other macros defined by this file: // * bool, true, and false, if __STL_NO_BOOL is defined. // * typename, as a null macro if it's not already a keyword. // * explicit, as a null macro if it's not already a keyword. // * namespace-related macros (__STD, __STL_BEGIN_NAMESPACE, etc.) // * exception-related macros (__STL_TRY, __STL_UNWIND, etc.) // * __stl_assert, either as a test or as a null macro, depending on // whether or not __STL_ASSERTIONS is defined. # if defined(_PTHREADS) && !defined(_NOTHREADS) # define __STL_PTHREADS # endif # if defined(_UITHREADS) && !defined(_PTHREADS) && !defined(_NOTHREADS) # define __STL_UITHREADS # endif # if defined(__sgi) && !defined(__GNUC__) # include # if !defined(_BOOL) # define __STL_NO_BOOL # endif # if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32 # define __STL_STATIC_CONST_INIT_BUG # endif # if defined(_WCHAR_T_IS_KEYWORD) # define __STL_HAS_WCHAR_T # endif # if !defined(_TYPENAME_IS_KEYWORD) # define __STL_NEED_TYPENAME # endif # ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES # define __STL_CLASS_PARTIAL_SPECIALIZATION # endif # if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32 # define __STL_FUNCTION_TMPL_PARTIAL_ORDER # endif # ifdef _MEMBER_TEMPLATES # define __STL_MEMBER_TEMPLATES # define __STL_TEMPLATE_FRIENDS # define __STL_MEMBER_TEMPLATE_CLASSES # endif # if defined(_MEMBER_TEMPLATE_KEYWORD) # define __STL_MEMBER_TEMPLATE_KEYWORD # endif # if defined(_STANDARD_C_PLUS_PLUS) # define __STL_EXPLICIT_FUNCTION_TMPL_ARGS # endif # if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32 # define __STL_MEMBER_TEMPLATE_KEYWORD # endif # if COMPILER_VERSION < 720 || (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) # define __STL_DEFAULT_CONSTRUCTOR_BUG # endif # if !defined(_EXPLICIT_IS_KEYWORD) # define __STL_NEED_EXPLICIT # endif # ifdef __EXCEPTIONS # define __STL_USE_EXCEPTIONS # endif # if (_COMPILER_VERSION >= 721) && defined(_NAMESPACES) # define __STL_HAS_NAMESPACES # endif # if (_COMPILER_VERSION < 721) || \ !defined(__STL_HAS_NAMESPACES) || defined(__STL_NO_NAMESPACES) # define __STL_NO_EXCEPTION_HEADER # endif # if _COMPILER_VERSION < 730 || !defined(_STANDARD_C_PLUS_PLUS) || \ !defined(_NAMESPACES) # define __STL_NO_BAD_ALLOC # endif # if !defined(_NOTHREADS) && !defined(__STL_PTHREADS) # define __STL_SGI_THREADS # endif # if defined(_LONGLONG) && defined(_SGIAPI) && _SGIAPI # define __STL_LONG_LONG # endif # if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) # define __STL_USE_NEW_IOSTREAMS # endif # if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) # define __STL_CAN_THROW_RANGE_ERRORS # endif # if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS) # define __SGI_STL_USE_AUTO_PTR_CONVERSIONS # endif # endif /* * Jochen Schlick '1999 - added new #defines (__STL)_UITHREADS (for * providing SCO / Solaris / UI thread support) * - added the necessary defines for the SCO UDK 7 * compiler (and its template friend behavior) * - all UDK7 specific STL changes are based on the * macro __USLC__ being defined */ // SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x) # if defined(__USLC__) # define __STL_HAS_WCHAR_T # define __STL_CLASS_PARTIAL_SPECIALIZATION # define __STL_PARTIAL_SPECIALIZATION_SYNTAX # define __STL_FUNCTION_TMPL_PARTIAL_ORDER # define __STL_MEMBER_TEMPLATES # define __STL_MEMBER_TEMPLATE_CLASSES # define __STL_USE_EXCEPTIONS # define __STL_HAS_NAMESPACES # define __STL_USE_NAMESPACES # define __STL_LONG_LONG # if defined(_REENTRANT) # define _UITHREADS /* if UnixWare < 7.0.1 */ # define __STL_UITHREADS // use the following defines instead of the UI threads defines when // you want to use POSIX threads //# define _PTHREADS /* only if UnixWare >=7.0.1 */ //# define __STL_PTHREADS # endif # endif # ifdef __GNUC__ # if __GNUC__ == 2 && __GNUC_MINOR__ <= 7 # define __STL_STATIC_TEMPLATE_MEMBER_BUG # endif # if __GNUC__ < 2 # define __STL_NEED_TYPENAME # define __STL_NEED_EXPLICIT # endif # if __GNUC__ == 2 && __GNUC_MINOR__ <= 8 # define __STL_NO_EXCEPTION_HEADER # define __STL_NO_BAD_ALLOC # endif # if __GNUC__ == 2 && __GNUC_MINOR__ >= 8 # define __STL_CLASS_PARTIAL_SPECIALIZATION # define __STL_FUNCTION_TMPL_PARTIAL_ORDER # define __STL_EXPLICIT_FUNCTION_TMPL_ARGS # define __STL_MEMBER_TEMPLATES # define __STL_CAN_THROW_RANGE_ERRORS // g++ 2.8.1 supports member template functions, but not member // template nested classes. # if __GNUC_MINOR__ >= 9 # define __STL_MEMBER_TEMPLATE_CLASSES # define __STL_TEMPLATE_FRIENDS # define __SGI_STL_USE_AUTO_PTR_CONVERSIONS # define __STL_HAS_NAMESPACES //# define __STL_USE_NEW_IOSTREAMS # endif # endif # define __STL_DEFAULT_CONSTRUCTOR_BUG # ifdef __EXCEPTIONS # define __STL_USE_EXCEPTIONS # endif # ifdef _REENTRANT # define __STL_PTHREADS # endif # if (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 95) # define __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE # endif # endif # if defined(__SUNPRO_CC) # define __STL_NO_BOOL # define __STL_NEED_TYPENAME # define __STL_NEED_EXPLICIT # define __STL_USE_EXCEPTIONS # ifdef _REENTRANT # define __STL_PTHREADS # endif # define __SGI_STL_NO_ARROW_OPERATOR # define __STL_PARTIAL_SPECIALIZATION_SYNTAX # define __STL_NO_EXCEPTION_HEADER # define __STL_NO_BAD_ALLOC # endif # if defined(__COMO__) # define __STL_MEMBER_TEMPLATES # define __STL_MEMBER_TEMPLATE_CLASSES # define __STL_TEMPLATE_FRIENDS # define __STL_CLASS_PARTIAL_SPECIALIZATION # define __STL_USE_EXCEPTIONS # define __STL_HAS_NAMESPACES # endif // Intel compiler, which uses the EDG front end. # if defined(__ICL) # define __STL_LONG_LONG # define __STL_MEMBER_TEMPLATES # define __STL_MEMBER_TEMPLATE_CLASSES # define __STL_TEMPLATE_FRIENDS # define __STL_FUNCTION_TMPL_PARTIAL_ORDER # define __STL_CLASS_PARTIAL_SPECIALIZATION # define __STL_NO_DRAND48 # define __STL_HAS_NAMESPACES # define __STL_USE_EXCEPTIONS # define __STL_MEMBER_TEMPLATE_KEYWORD # ifdef _CPPUNWIND # define __STL_USE_EXCEPTIONS # endif # ifdef _MT # define __STL_WIN32THREADS # endif # endif // Mingw32, egcs compiler using the Microsoft C runtime # if defined(__MINGW32__) # define __STL_NO_DRAND48 # ifdef _MT # define __STL_WIN32THREADS # endif # endif // Cygwin32, egcs compiler on MS Windows # if defined(__CYGWIN__) # define __STL_NO_DRAND48 # endif // Microsoft compiler. # if defined(_MSC_VER) && !defined(__ICL) && !defined(__MWERKS__) # define __STL_NO_DRAND48 # define __STL_STATIC_CONST_INIT_BUG # define __STL_NEED_TYPENAME # define __STL_NO_USING_CLAUSE_IN_CLASS # define __STL_NO_FRIEND_TEMPLATE_CLASS # if _MSC_VER < 1100 /* 1000 is version 4.0, 1100 is 5.0, 1200 is 6.0. */ # define __STL_NEED_EXPLICIT # define __STL_NO_BOOL # define __STL_NO_BAD_ALLOC # endif # if _MSC_VER > 1000 # include # define __STL_DONT_USE_BOOL_TYPEDEF # endif # define __STL_NON_TYPE_TMPL_PARAM_BUG # define __SGI_STL_NO_ARROW_OPERATOR # define __STL_DEFAULT_CONSTRUCTOR_BUG # ifdef _CPPUNWIND # define __STL_USE_EXCEPTIONS # endif # ifdef _MT # define __STL_WIN32THREADS # endif # if _MSC_VER >= 1200 # define __STL_PARTIAL_SPECIALIZATION_SYNTAX # define __STL_HAS_NAMESPACES # define __STL_CAN_THROW_RANGE_ERRORS # define NOMINMAX # undef min # undef max // disable warning 'initializers put in unrecognized initialization area' # pragma warning ( disable : 4075 ) // disable warning 'empty controlled statement found' # pragma warning ( disable : 4390 ) // disable warning 'debug symbol greater than 255 chars' # pragma warning ( disable : 4786 ) # endif # if _MSC_VER < 1100 # define __STL_NO_EXCEPTION_HEADER # define __STL_NO_BAD_ALLOC # endif // Because of a Microsoft front end bug, we must not provide a // namespace qualifier when declaring a friend function. # define __STD_QUALIFIER # endif # if defined(__BORLANDC__) # define __STL_NO_BAD_ALLOC # define __STL_NO_DRAND48 # define __STL_DEFAULT_CONSTRUCTOR_BUG # if __BORLANDC__ >= 0x540 /* C++ Builder 4.0 */ # define __STL_CLASS_PARTIAL_SPECIALIZATION # define __STL_FUNCTION_TMPL_PARTIAL_ORDER # define __STL_EXPLICIT_FUNCTION_TMPL_ARGS # define __STL_MEMBER_TEMPLATES # define __STL_TEMPLATE_FRIENDS # else # define __STL_NEED_TYPENAME # define __STL_LIMITED_DEFAULT_TEMPLATES # define __SGI_STL_NO_ARROW_OPERATOR # define __STL_NON_TYPE_TMPL_PARAM_BUG # endif # ifdef _CPPUNWIND # define __STL_USE_EXCEPTIONS # endif # ifdef __MT__ # define __STL_WIN32THREADS # endif # endif # if defined(__STL_NO_BOOL) && !defined(__STL_DONT_USE_BOOL_TYPEDEF) typedef int bool; # define true 1 # define false 0 # endif # ifdef __STL_NEED_TYPENAME # define typename # endif # ifdef __STL_LIMITED_DEFAULT_TEMPLATES # define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) # else # define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) = _Tp # endif # ifdef __STL_MEMBER_TEMPLATE_KEYWORD # define __STL_TEMPLATE template # else # define __STL_TEMPLATE # endif # ifdef __STL_NEED_EXPLICIT # define explicit # endif # ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS # define __STL_NULL_TMPL_ARGS <> # else # define __STL_NULL_TMPL_ARGS # endif # if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \ || defined (__STL_PARTIAL_SPECIALIZATION_SYNTAX) # define __STL_TEMPLATE_NULL template<> # else # define __STL_TEMPLATE_NULL # endif // Use standard-conforming allocators if we have the necessary language // features. __STL_USE_SGI_ALLOCATORS is a hook so that users can // disable new-style allocators, and continue to use the same kind of // allocators as before, without having to edit library headers. # if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && \ defined(__STL_MEMBER_TEMPLATES) && \ defined(__STL_MEMBER_TEMPLATE_CLASSES) && \ !defined(__STL_NO_BOOL) && \ !defined(__STL_NON_TYPE_TMPL_PARAM_BUG) && \ !defined(__STL_LIMITED_DEFAULT_TEMPLATES) && \ !defined(__STL_USE_SGI_ALLOCATORS) # define __STL_USE_STD_ALLOCATORS # endif # ifndef __STL_DEFAULT_ALLOCATOR # ifdef __STL_USE_STD_ALLOCATORS # define __STL_DEFAULT_ALLOCATOR(T) allocator< T > # else # define __STL_DEFAULT_ALLOCATOR(T) alloc # endif # endif // __STL_NO_NAMESPACES is a hook so that users can disable namespaces // without having to edit library headers. __STL_NO_RELOPS_NAMESPACE is // a hook so that users can disable the std::rel_ops namespace, keeping // the relational operator template in namespace std, without having to // edit library headers. # if defined(__STL_HAS_NAMESPACES) && !defined(__STL_NO_NAMESPACES) # define __STL_USE_NAMESPACES # define __STD std # define __STL_BEGIN_NAMESPACE namespace std { # define __STL_END_NAMESPACE } # if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) && \ !defined(__STL_NO_RELOPS_NAMESPACE) # define __STL_USE_NAMESPACE_FOR_RELOPS # define __STL_BEGIN_RELOPS_NAMESPACE namespace std { namespace rel_ops { # define __STL_END_RELOPS_NAMESPACE } } # define __STD_RELOPS std::rel_ops # else /* Use std::rel_ops namespace */ # define __STL_USE_NAMESPACE_FOR_RELOPS # define __STL_BEGIN_RELOPS_NAMESPACE namespace std { # define __STL_END_RELOPS_NAMESPACE } # define __STD_RELOPS std # endif /* Use std::rel_ops namespace */ # else # define __STD # define __STL_BEGIN_NAMESPACE # define __STL_END_NAMESPACE # undef __STL_USE_NAMESPACE_FOR_RELOPS # define __STL_BEGIN_RELOPS_NAMESPACE # define __STL_END_RELOPS_NAMESPACE # define __STD_RELOPS # undef __STL_USE_NAMESPACES # endif // Some versions of the EDG front end sometimes require an explicit // namespace spec where they shouldn't. This macro facilitates that. // If the bug becomes irrelevant, then all uses of __STD_QUALIFIER // should be removed. The 7.3 beta SGI compiler has this bug, but the // MR version is not expected to have it. # if defined(__STL_USE_NAMESPACES) && !defined(__STD_QUALIFIER) # define __STD_QUALIFIER std:: # else # define __STD_QUALIFIER # endif # ifdef __STL_USE_EXCEPTIONS # define __STL_TRY try # define __STL_CATCH_ALL catch(...) # define __STL_THROW(x) throw x # define __STL_RETHROW throw # define __STL_NOTHROW throw() # define __STL_UNWIND(action) catch(...) { action; throw; } # else # define __STL_TRY # define __STL_CATCH_ALL if (false) # define __STL_THROW(x) # define __STL_RETHROW # define __STL_NOTHROW # define __STL_UNWIND(action) # endif #ifdef __STL_ASSERTIONS # include # define __stl_assert(expr) \ if (!(expr)) { fprintf(stderr, "%s:%d STL assertion failure: %s\n", \ __FILE__, __LINE__, # expr); abort(); } #else # define __stl_assert(expr) #endif #if defined(__STL_WIN32THREADS) || defined(__STL_SGI_THREADS) \ || defined(__STL_PTHREADS) || defined(__STL_UITHREADS) # define __STL_THREADS # define __STL_VOLATILE volatile #else # define __STL_VOLATILE #endif #if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \ && defined(__STL_MEMBER_TEMPLATES) \ && !defined(_STL_NO_CONCEPT_CHECKS) # define __STL_USE_CONCEPT_CHECKS #endif #endif /* __STL_CONFIG_H */ // Local Variables: // mode:C++ // End: