Home | History | Annotate | Download | only in eh
      1 /***********************************************************************************
      2   Prefix.h
      3 
      4  * Copyright (c) 1997
      5  * Mark of the Unicorn, Inc.
      6  *
      7  * Permission to use, copy, modify, distribute and sell this software
      8  * and its documentation for any purpose is hereby granted without fee,
      9  * provided that the above copyright notice appear in all copies and
     10  * that both that copyright notice and this permission notice appear
     11  * in supporting documentation.  Mark of the Unicorn makes no
     12  * representations about the suitability of this software for any
     13  * purpose.  It is provided "as is" without express or implied warranty.
     14 
     15     SUMMARY: Configuration #defines for STL EH test suite
     16 
     17 ***********************************************************************************/
     18 
     19 #ifndef INCLUDED_MOTU_Prefix
     20 #define INCLUDED_MOTU_Prefix 1
     21 
     22 // Gives much more thorough checking, but may slow the tests
     23 // considerably if your malloc is slow.
     24 #define TESTCLASS_DEEP_DATA 1
     25 
     26 # ifndef NO_FAST_ALLOCATOR
     27 // #  define NO_FAST_ALLOCATOR
     28 # endif
     29 
     30 // Define this to use the SGI STL. Undefine it to test a different installation
     31 #ifndef EH_NO_SGI_STL
     32 # define EH_USE_SGI_STL 1
     33 #endif
     34 
     35 #if EH_USE_SGI_STL
     36 
     37 #define EH_ASSERT _STLP_ASSERT
     38 
     39 //=========================================================================
     40 // SGI STL-specific #defines
     41 //  These control the behavior of the test suite when used with the SGI
     42 //  STL. They have no effect when testing other STL implementations.
     43 //=========================================================================
     44 
     45 #ifndef _STLP_USE_NEWALLOC
     46 #  define _STLP_USE_NEWALLOC
     47 #endif
     48 
     49 #if 0 // !defined  (_STLP_NO_CUSTOM_IO) && ! defined (__BORLANDC__)
     50 #  define _STLP_NO_CUSTOM_IO
     51 #endif
     52 
     53 // Just include something to get whatever configuration header we're using.
     54 #include <utility>
     55 
     56 #ifndef _STLP_CALL
     57 #  define _STLP_CALL
     58 #endif
     59 
     60 #if defined(_STLP_USE_NAMESPACES)
     61 #  define EH_USE_NAMESPACES _STLP_USE_NAMESPACES
     62 #endif
     63 
     64 #define EH_BEGIN_NAMESPACE _STLP_BEGIN_NAMESPACE
     65 #define EH_END_NAMESPACE _STLP_END_NAMESPACE
     66 
     67 #define EH_NEW_HEADERS 1
     68 
     69 //#if defined (_STLP_USE_NEW_IOSTREAMS)
     70 #define EH_NEW_IOSTREAMS 1
     71 //#endif
     72 
     73 #if !defined (_STLP_USE_EXCEPTIONS)
     74 #  define EH_NO_EXCEPTIONS
     75 #endif
     76 
     77 #if defined (_STLP_TEMPLATE_PARAM_SUBTYPE_BUG)
     78 #  define EH_TEMPLATE_PARAM_SUBTYPE_BUG _STLP_TEMPLATE_PARAM_SUBTYPE_BUG
     79 #endif
     80 
     81 #if defined(_STLP_MULTI_CONST_TEMPLATE_ARG_BUG)
     82 #  define EH_MULTI_CONST_TEMPLATE_ARG_BUG _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
     83 #endif
     84 
     85 #if defined (STLPORT)
     86 #  define EH_STD STLPORT
     87 #elif defined(__STD)
     88 #  define EH_STD __STD
     89 #endif
     90 
     91 // we want to be portable here, so std:: won't work.
     92 #if defined(STLPORT_CSTD)
     93 #  define EH_CSTD STLPORT_CSTD
     94 #else
     95 #  define EH_CSTD std
     96 #endif
     97 
     98 #define EH_DISTANCE(a, b, result) EH_STD::distance(a, b, result)
     99 
    100 #define EH_HASHED_CONTAINERS_IMPLEMENTED 1
    101 #define EH_HASH_CONTAINERS_SUPPORT_RESIZE 1
    102 #define EH_HASH_CONTAINERS_SUPPORT_ITERATOR_CONSTRUCTION 1
    103 #define EH_SLIST_IMPLEMENTED 1
    104 #define EH_SELECT1ST_HINT __select1st_hint
    105 // fbp : DEC cxx is unable to compile it for some reason
    106 #if !(defined (__DECCXX)  || defined (__amigaos__) || \
    107       (defined (__GNUC__) && (__GNUC__ <= 2) && (__GNUC_MINOR__ < 8)))
    108 #  define EH_ROPE_IMPLEMENTED 1
    109 #endif
    110 #define EH_STRING_IMPLEMENTED 1
    111 // # define EH_BITSET_IMPLEMENTED 1
    112 //# define EH_VALARRAY_IMPLEMENTED 1  - we have no tests yet for valarray
    113 
    114 #define stl_destroy EH_STD::destroy
    115 #include <memory>
    116 
    117 template <class _Tp>
    118 class /*_STLP_CLASS_DECLSPEC*/ EH_allocator;
    119 
    120 template <class _Tp>
    121 class /*_STLP_CLASS_DECLSPEC*/ EH_allocator {
    122 public:
    123 
    124   typedef _Tp        value_type;
    125   typedef value_type *       pointer;
    126   typedef const _Tp* const_pointer;
    127   typedef _Tp&       reference;
    128   typedef const _Tp& const_reference;
    129   typedef EH_CSTD::size_t     size_type;
    130   typedef EH_CSTD::ptrdiff_t  difference_type;
    131 # if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
    132   template <class _Tp1> struct rebind {
    133     typedef EH_allocator<_Tp1> other;
    134   };
    135 # endif
    136   EH_allocator() _STLP_NOTHROW {}
    137  # if defined (_STLP_MEMBER_TEMPLATES)
    138   template <class _Tp1> EH_allocator(const EH_allocator<_Tp1>&) _STLP_NOTHROW {}
    139  # endif
    140   EH_allocator(const EH_allocator<_Tp>&) _STLP_NOTHROW {}
    141   ~EH_allocator() _STLP_NOTHROW {}
    142   pointer address(reference __x) { return &__x; }
    143   const_pointer address(const_reference __x) const { return &__x; }
    144   // __n is permitted to be 0.  The C++ standard says nothing about what the return value is when __n == 0.
    145   _Tp* allocate(size_type __n, const void* = 0) const {
    146     return __n != 0 ? __REINTERPRET_CAST(value_type*,EH_STD::__new_alloc::allocate(__n * sizeof(value_type))) : 0;
    147   }
    148   // __p is permitted to be a null pointer, only if n==0.
    149   void deallocate(pointer __p, size_type __n) const {
    150     _STLP_ASSERT( (__p == 0) == (__n == 0) )
    151       if (__p != 0) EH_STD::__new_alloc::deallocate((void*)__p, __n * sizeof(value_type));
    152   }
    153   // backwards compatibility
    154   void deallocate(pointer __p) const {  if (__p != 0) EH_STD::__new_alloc::deallocate((void*)__p, sizeof(value_type)); }
    155   size_type max_size() const _STLP_NOTHROW  { return size_t(-1) / sizeof(value_type); }
    156   void construct(pointer __p, const _Tp& __val) const { stlport::construct(__p, __val); }
    157   void destroy(pointer __p) const { stlport::destroy(__p); }
    158 };
    159 
    160 template <class _T1> inline bool  _STLP_CALL operator==(const EH_allocator<_T1>&, const EH_allocator<_T1>&)  { return true; }
    161 template <class _T1> inline bool  _STLP_CALL operator!=(const EH_allocator<_T1>&, const EH_allocator<_T1>&) { return false; }
    162 
    163 _STLP_BEGIN_NAMESPACE
    164 // If custom allocators are being used without member template classes support :
    165 // user (on purpose) is forced to define rebind/get operations !!!
    166 template <class _Tp1, class _Tp2>
    167 inline EH_allocator<_Tp2>& _STLP_CALL
    168 __stl_alloc_rebind(EH_allocator<_Tp1>& __a, const _Tp2*) {  return (EH_allocator<_Tp2>&)(__a); }
    169 template <class _Tp1, class _Tp2>
    170 inline EH_allocator<_Tp2> _STLP_CALL
    171 __stl_alloc_create(const EH_allocator<_Tp1>&, const _Tp2*) { return EH_allocator<_Tp2>(); }
    172 _STLP_END_NAMESPACE
    173 
    174 # define eh_allocator(T) ::EH_allocator<T>
    175 
    176 # define EH_BIT_VECTOR_IMPLEMENTED
    177 
    178 # if defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined(_STLP_NO_BOOL)
    179 #  define EH_BIT_VECTOR EH_STD::vector<bool, eh_allocator(bool) >
    180 # else
    181 #  ifdef _STLP_NO_BOOL
    182 #  undef   EH_BIT_VECTOR_IMPLEMENTED
    183 #  else
    184 #   define EH_BIT_VECTOR EH_STD::vector<bool, eh_allocator(bool) >
    185 #  endif
    186 # endif
    187 
    188 #else // !USE_SGI_STL
    189 //=========================================================================
    190 // Configuration for testing other non-SGI STL implementations
    191 //=========================================================================
    192 
    193 // Metrowerks configuration
    194 # ifdef __MWERKS__
    195 
    196 # define EH_ASSERT assert
    197 // Get MSL configuration header
    198 #  include <ansi_parms.h>
    199 
    200 #  if __MSL__ >= 24
    201 
    202 #   define EH_NEW_HEADERS 1
    203 #   if defined (_MSL_USING_NAMESPACE)
    204 #    define EH_USE_NAMESPACES 1
    205 #   endif
    206 #  define EH_BIT_VECTOR vector<bool>
    207 #   define EH_DISTANCE( a, b, result ) do { result = distance( a, b ); } while (0)
    208 
    209 #  else
    210 
    211 #   error No configuration for earlier versions of MSL
    212 
    213 #  endif  // __MSL__ >= 24
    214 
    215 // Bugs fixed in CWPro3
    216 #  if __MWERKS__ < 0x2100
    217 #   define EH_TEMPLATE_PARAM_SUBTYPE_BUG 1
    218 #  endif
    219 
    220 // Bugs in CWPro3
    221 #  if __MWERKS__ <= 0x2110
    222 #   define EH_MULTI_CONST_TEMPLATE_ARG_BUG 1
    223 #  else
    224 #   pragma warning not sure the above bug is fixed yet
    225 #  endif
    226 
    227 #  define EH_SLIST_IMPLEMENTED 1
    228 //#  define EH_HASHED_CONTAINERS_IMPLEMENTED 1
    229 
    230 #  define EH_NEW_IOSTREAMS 1
    231 #  define EH_USE_NOTHROW 1
    232 # endif // Metrowerks configuration
    233 
    234 #if defined (__SUNPRO_CC)
    235 # define stl_destroy __RWSTD::__destroy
    236 # define EH_DISTANCE( a, b, result ) distance( a, b, result )
    237 # define EH_BIT_VECTOR EH_STD::vector<bool>
    238 # define EH_NEW_HEADERS 1
    239 # define EH_USE_NAMESPACES 1
    240 # define EH_NEW_IOSTREAMS 1
    241 # define EH_ASSERT assert
    242 # define EH_STRING_IMPLEMENTED 1
    243 # elif defined (__KCC)
    244 # define stl_destroy EH_STD::destroy
    245 # define EH_DISTANCE( a, b, result ) do { result = distance( a, b ); } while (0)
    246 # define EH_BIT_VECTOR EH_STD::vector<bool>
    247 # define EH_NEW_HEADERS 1
    248 # define EH_USE_NAMESPACES 1
    249 # define EH_NEW_IOSTREAMS 1
    250 # define EH_ASSERT assert
    251 # define EH_CSTD
    252 # define EH_STRING_IMPLEMENTED 1
    253 # define EH_MULTI_CONST_TEMPLATE_ARG_BUG 1
    254 # define EH_SELECT1ST_HINT select1st
    255 # else
    256 # define stl_destroy destroy
    257 #endif
    258 
    259 //
    260 // Compiler-independent configuration
    261 //
    262 # ifdef EH_USE_NAMESPACES
    263 # ifdef STLPORT
    264 #  define EH_STD STLPORT
    265 # else
    266 #  define EH_STD std
    267 # endif
    268 # ifdef STLPORT_CSTD
    269 #  define EH_STD STLPORT_CSTD
    270 # else
    271 #  define EH_STD std
    272 # endif
    273 #  define EH_BEGIN_NAMESPACE namespace EH_STD {
    274 #  define EH_END_NAMESPACE   }
    275 # else
    276 #  define EH_BEGIN_NAMESPACE
    277 #  define EH_END_NAMESPACE
    278 #  define EH_STD
    279 # endif
    280 
    281 # ifndef EH_CSTD
    282 #  define EH_CSTD EH_STD
    283 # endif
    284 
    285 #endif // !USE_SGI_STL
    286 
    287 
    288 //
    289 // Library-independent configuration.
    290 //
    291 #if defined( EH_MULTI_CONST_TEMPLATE_ARG_BUG) && !defined( EH_SELECT1ST_HINT )
    292 template <class Pair, class U>
    293 // JDJ (CW Pro1 doesn't like const when first_type is also const)
    294 struct eh_select1st_hint : public unary_function<Pair, U> {
    295     const U& operator () (const Pair& x) const { return x.first; }
    296 };
    297 # define EH_SELECT1ST_HINT eh_select1st_hint
    298 #endif
    299 
    300 
    301 #if EH_USE_NAMESPACES
    302 # define EH_USE_STD using namespace EH_STD;
    303 #else
    304 # define EH_USE_STD
    305 #endif
    306 
    307 #if defined (EH_USE_NAMESPACES) && !defined(_STLP_VENDOR_GLOBAL_CSTD)
    308 # define USING_CSTD_NAME(name) using EH_CSTD :: name;
    309 #else
    310 # define USING_CSTD_NAME(name)
    311 #endif
    312 
    313 #endif // INCLUDED_MOTU_Prefix
    314