epoc32/include/stdapis/stlport/stl/concept_checks.h
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
equal deleted inserted replaced
1:666f914201fb 2:2fe1408b6811
     1 concept_checks.h
     1 /*
       
     2  * Copyright (c) 1999
       
     3  * Silicon Graphics Computer Systems, Inc.
       
     4  *
       
     5  * Permission to use, copy, modify, distribute and sell this software
       
     6  * and its documentation for any purpose is hereby granted without fee,
       
     7  * provided that the above copyright notice appear in all copies and
       
     8  * that both that copyright notice and this permission notice appear
       
     9  * in supporting documentation.  Silicon Graphics makes no
       
    10  * representations about the suitability of this software for any
       
    11  * purpose.  It is provided "as is" without express or implied warranty.
       
    12  */
       
    13 
       
    14 #ifndef __CONCEPT_CHECKS_H
       
    15 #define __CONCEPT_CHECKS_H
       
    16 
       
    17 /*
       
    18   Use these macro like assertions, but they assert properties
       
    19   on types (usually template arguments). In technical terms they
       
    20   verify whether a type "models" a "concept".
       
    21 
       
    22   This set of requirements and the terminology used here is derived
       
    23   from the book "Generic Programming and the STL" by Matt Austern
       
    24   (Addison Wesley). For further information please consult that
       
    25   book. The requirements also are intended to match the ANSI/ISO C++
       
    26   standard.
       
    27 
       
    28   This file covers the basic concepts and the iterator concepts.
       
    29   There are several other files that provide the requirements
       
    30   for the STL containers:
       
    31     container_concepts.h
       
    32     sequence_concepts.h
       
    33     assoc_container_concepts.h
       
    34 
       
    35   Jeremy Siek, 1999
       
    36 
       
    37   TO DO:
       
    38     - some issues with regards to concept classification and mutability
       
    39       including AssociativeContianer -> ForwardContainer
       
    40       and SortedAssociativeContainer -> ReversibleContainer
       
    41     - HashedAssociativeContainer
       
    42     - Allocator
       
    43     - Function Object Concepts
       
    44 
       
    45   */
       
    46 
       
    47 #ifndef _STLP_USE_CONCEPT_CHECKS
       
    48 
       
    49 // Some compilers lack the features that are necessary for concept checks.
       
    50 // On those compilers we define the concept check macros to do nothing.
       
    51 #define _STLP_REQUIRES(__type_var, __concept) do {} while(0)
       
    52 #define _STLP_CLASS_REQUIRES(__type_var, __concept) \
       
    53   static int  __##__type_var##_##__concept
       
    54 #define _STLP_CONVERTIBLE(__type_x, __type_y) do {} while(0)
       
    55 #define _STLP_REQUIRES_SAME_TYPE(__type_x, __type_y) do {} while(0)
       
    56 #define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
       
    57   static int  __##__type_x##__type_y##_require_same_type
       
    58 #define _STLP_GENERATOR_CHECK(__func, __ret) do {} while(0)
       
    59 #define _STLP_CLASS_GENERATOR_CHECK(__func, __ret) \
       
    60   static int  __##__func##__ret##_generator_check
       
    61 #define _STLP_UNARY_FUNCTION_CHECK(__func, __ret, __arg) do {} while(0)
       
    62 #define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
       
    63   static int  __##__func##__ret##__arg##_unary_function_check
       
    64 #define _STLP_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
       
    65   do {} while(0)
       
    66 #define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
       
    67   static int  __##__func##__ret##__first##__second##_binary_function_check
       
    68 #define _STLP_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
       
    69   do {} while(0)
       
    70 #define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
       
    71   static int __##__opname##__ret##__first##__second##_require_binary_op
       
    72 
       
    73 #else /* _STLP_USE_CONCEPT_CHECKS */
       
    74 
       
    75 // This macro tests whether the template argument "__type_var"
       
    76 // satisfies the requirements of "__concept".  Here is a list of concepts
       
    77 // that we know how to check:
       
    78 //       _Allocator
       
    79 //       _Assignable
       
    80 //       _DefaultConstructible
       
    81 //       _EqualityComparable
       
    82 //       _LessThanComparable
       
    83 //       _TrivialIterator
       
    84 //       _InputIterator
       
    85 //       _OutputIterator
       
    86 //       _ForwardIterator
       
    87 //       _BidirectionalIterator
       
    88 //       _RandomAccessIterator
       
    89 //       _Mutable_TrivialIterator
       
    90 //       _Mutable_ForwardIterator
       
    91 //       _Mutable_BidirectionalIterator
       
    92 //       _Mutable_RandomAccessIterator
       
    93 
       
    94 #define _STLP_REQUIRES(__type_var, __concept) \
       
    95 do { \
       
    96   void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\
       
    97     ::##__concept##_requirement_violation; __x = __x; } while (0)
       
    98 
       
    99 // Use this to check whether type X is convertible to type Y
       
   100 #define _STLP_CONVERTIBLE(__type_x, __type_y) \
       
   101 do { \
       
   102   void (*__x)( __type_x , __type_y ) = _STL_CONVERT_ERROR< __type_x , \
       
   103   __type_y >::__type_X_is_not_convertible_to_type_Y; \
       
   104   __x = __x; } while (0)
       
   105 
       
   106 // Use this to test whether two template arguments are the same type
       
   107 #define _STLP_REQUIRES_SAME_TYPE(__type_x, __type_y) \
       
   108 do { \
       
   109   void (*__x)( __type_x , __type_y ) = _STL_SAME_TYPE_ERROR< __type_x, \
       
   110     __type_y  >::__type_X_not_same_as_type_Y; \
       
   111   __x = __x; } while (0)
       
   112 
       
   113 
       
   114 // function object checks
       
   115 #define _STLP_GENERATOR_CHECK(__func, __ret) \
       
   116 do { \
       
   117   __ret (*__x)( __func&) = \
       
   118      _STL_GENERATOR_ERROR< \
       
   119   __func, __ret>::__generator_requirement_violation; \
       
   120   __x = __x; } while (0)
       
   121 
       
   122 
       
   123 #define _STLP_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
       
   124 do { \
       
   125   __ret (*__x)( __func&, const __arg& ) = \
       
   126      _STL_UNARY_FUNCTION_ERROR< \
       
   127   __func, __ret, __arg>::__unary_function_requirement_violation; \
       
   128   __x = __x; } while (0)
       
   129 
       
   130 
       
   131 #define _STLP_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
       
   132 do { \
       
   133   __ret (*__x)( __func&, const __first&, const __second& ) = \
       
   134      _STL_BINARY_FUNCTION_ERROR< \
       
   135   __func, __ret, __first, __second>::__binary_function_requirement_violation; \
       
   136   __x = __x; } while (0)
       
   137 
       
   138 
       
   139 #define _STLP_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
       
   140     do { \
       
   141   __ret (*__x)( __first&, __second& ) = _STL_BINARY##__opname##_ERROR< \
       
   142     __ret, __first, __second>::__binary_operator_requirement_violation; \
       
   143   __ret (*__y)( const __first&, const __second& ) = \
       
   144     _STL_BINARY##__opname##_ERROR< __ret, __first, __second>:: \
       
   145       __const_binary_operator_requirement_violation; \
       
   146   __y = __y; __x = __x; } while (0)
       
   147 
       
   148 
       
   149 #ifdef _STLP_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
       
   150 
       
   151 #define _STLP_CLASS_REQUIRES(__type_var, __concept)
       
   152 #define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y)
       
   153 #define _STLP_CLASS_GENERATOR_CHECK(__func, __ret)
       
   154 #define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg)
       
   155 #define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second)
       
   156 #define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second)
       
   157 
       
   158 #else
       
   159 
       
   160 // Use this macro inside of template classes, where you would
       
   161 // like to place requirements on the template arguments to the class
       
   162 // Warning: do not pass pointers and such (e.g. T*) in as the __type_var,
       
   163 // since the type_var is used to construct identifiers. Instead typedef
       
   164 // the pointer type, then use the typedef name for the __type_var.
       
   165 #define _STLP_CLASS_REQUIRES(__type_var, __concept) \
       
   166   typedef void (* __func##__type_var##__concept)( __type_var ); \
       
   167   template <__func##__type_var##__concept _Tp1> \
       
   168   struct __dummy_struct_##__type_var##__concept { }; \
       
   169   static __dummy_struct_##__type_var##__concept< \
       
   170     __concept##_concept_specification< \
       
   171       __type_var>::__concept##_requirement_violation>  \
       
   172   __dummy_ptr_##__type_var##__concept
       
   173 
       
   174 
       
   175 #define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
       
   176   typedef void (* __func_##__type_x##__type_y##same_type)( __type_x, \
       
   177                                                             __type_y ); \
       
   178   template < __func_##__type_x##__type_y##same_type _Tp1> \
       
   179   struct __dummy_struct_##__type_x##__type_y##_same_type { }; \
       
   180   static __dummy_struct_##__type_x##__type_y##_same_type< \
       
   181     _STL_SAME_TYPE_ERROR<__type_x, __type_y>::__type_X_not_same_as_type_Y>  \
       
   182   __dummy_ptr_##__type_x##__type_y##_same_type
       
   183 
       
   184 
       
   185 #define _STLP_CLASS_GENERATOR_CHECK(__func, __ret) \
       
   186   typedef __ret (* __f_##__func##__ret##_generator)( __func& ); \
       
   187   template <__f_##__func##__ret##_generator _Tp1> \
       
   188   struct __dummy_struct_##__func##__ret##_generator { }; \
       
   189   static __dummy_struct_##__func##__ret##_generator< \
       
   190     _STL_GENERATOR_ERROR< \
       
   191       __func, __ret>::__generator_requirement_violation>  \
       
   192   __dummy_ptr_##__func##__ret##_generator
       
   193 
       
   194 
       
   195 #define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
       
   196   typedef __ret (* __f_##__func##__ret##__arg##_unary_check)( __func&, \
       
   197                                                          const __arg& ); \
       
   198   template <__f_##__func##__ret##__arg##_unary_check _Tp1> \
       
   199   struct __dummy_struct_##__func##__ret##__arg##_unary_check { }; \
       
   200   static __dummy_struct_##__func##__ret##__arg##_unary_check< \
       
   201     _STL_UNARY_FUNCTION_ERROR< \
       
   202       __func, __ret, __arg>::__unary_function_requirement_violation>  \
       
   203   __dummy_ptr_##__func##__ret##__arg##_unary_check
       
   204 
       
   205 
       
   206 #define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
       
   207   typedef __ret (* __f_##__func##__ret##__first##__second##_binary_check)( __func&, const __first&,\
       
   208                                                     const __second& ); \
       
   209   template <__f_##__func##__ret##__first##__second##_binary_check _Tp1> \
       
   210   struct __dummy_struct_##__func##__ret##__first##__second##_binary_check { }; \
       
   211   static __dummy_struct_##__func##__ret##__first##__second##_binary_check< \
       
   212     _STL_BINARY_FUNCTION_ERROR<__func, __ret, __first, __second>:: \
       
   213   __binary_function_requirement_violation>  \
       
   214   __dummy_ptr_##__func##__ret##__first##__second##_binary_check
       
   215 
       
   216 
       
   217 #define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
       
   218   typedef __ret (* __f_##__func##__ret##__first##__second##_binary_op)(const __first&, \
       
   219                                                     const __second& ); \
       
   220   template <__f_##__func##__ret##__first##__second##_binary_op _Tp1> \
       
   221   struct __dummy_struct_##__func##__ret##__first##__second##_binary_op { }; \
       
   222   static __dummy_struct_##__func##__ret##__first##__second##_binary_op< \
       
   223     _STL_BINARY##__opname##_ERROR<__ret, __first, __second>:: \
       
   224   __binary_operator_requirement_violation>  \
       
   225   __dummy_ptr_##__func##__ret##__first##__second##_binary_op
       
   226 
       
   227 #endif
       
   228 
       
   229 /* helper class for finding non-const version of a type. Need to have
       
   230    something to assign to etc. when testing constant iterators. */
       
   231 
       
   232 template <class _Tp>
       
   233 struct _Mutable_trait {
       
   234   typedef _Tp _Type;
       
   235 };
       
   236 template <class _Tp>
       
   237 struct _Mutable_trait<const _Tp> {
       
   238   typedef _Tp _Type;
       
   239 };
       
   240 
       
   241 
       
   242 /* helper function for avoiding compiler warnings about unused variables */
       
   243 template <class _Type>
       
   244 void __sink_unused_warning(_Type) { }
       
   245 
       
   246 template <class _TypeX, class _TypeY>
       
   247 struct _STL_CONVERT_ERROR {
       
   248   static void
       
   249   __type_X_is_not_convertible_to_type_Y(_TypeX __x, _TypeY) {
       
   250     _TypeY __y = __x;
       
   251     __sink_unused_warning(__y);
       
   252   }
       
   253 };
       
   254 
       
   255 
       
   256 template <class _Type> struct __check_equal { };
       
   257 
       
   258 template <class _TypeX, class _TypeY>
       
   259 struct _STL_SAME_TYPE_ERROR {
       
   260   static void
       
   261   __type_X_not_same_as_type_Y(_TypeX , _TypeY ) { 
       
   262     __check_equal<_TypeX> t1 = __check_equal<_TypeY>();
       
   263   }
       
   264 };
       
   265 
       
   266 
       
   267 // Some Functon Object Checks
       
   268 
       
   269 template <class _Func, class _Ret>
       
   270 struct _STL_GENERATOR_ERROR {
       
   271   static _Ret __generator_requirement_violation(_Func& __f) {
       
   272     return __f();
       
   273   }
       
   274 };
       
   275 
       
   276 template <class _Func>
       
   277 struct _STL_GENERATOR_ERROR<_Func, void> {
       
   278   static void __generator_requirement_violation(_Func& __f) {
       
   279     __f();
       
   280   }
       
   281 };
       
   282 
       
   283 
       
   284 template <class _Func, class _Ret, class _Arg>
       
   285 struct _STL_UNARY_FUNCTION_ERROR {
       
   286   static _Ret
       
   287   __unary_function_requirement_violation(_Func& __f,
       
   288                                           const _Arg& __arg) {
       
   289     return __f(__arg);
       
   290   }
       
   291 };
       
   292 
       
   293 template <class _Func, class _Arg>
       
   294 struct _STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg> {
       
   295   static void
       
   296   __unary_function_requirement_violation(_Func& __f,
       
   297                                           const _Arg& __arg) {
       
   298     __f(__arg);
       
   299   }
       
   300 };
       
   301 
       
   302 template <class _Func, class _Ret, class _First, class _Second>
       
   303 struct _STL_BINARY_FUNCTION_ERROR {
       
   304   static _Ret
       
   305   __binary_function_requirement_violation(_Func& __f,
       
   306                                           const _First& __first, 
       
   307                                           const _Second& __second) {
       
   308     return __f(__first, __second);
       
   309   }
       
   310 };
       
   311 
       
   312 template <class _Func, class _First, class _Second>
       
   313 struct _STL_BINARY_FUNCTION_ERROR<_Func, void, _First, _Second> {
       
   314   static void
       
   315   __binary_function_requirement_violation(_Func& __f,
       
   316                                           const _First& __first, 
       
   317                                           const _Second& __second) {
       
   318     __f(__first, __second);
       
   319   }
       
   320 };
       
   321 
       
   322 
       
   323 #define _STLP_DEFINE_BINARY_OP_CHECK(_OP, _NAME) \
       
   324 template <class _Ret, class _First, class _Second> \
       
   325 struct _STL_BINARY##_NAME##_ERROR { \
       
   326   static _Ret \
       
   327   __const_binary_operator_requirement_violation(const _First& __first,  \
       
   328                                                 const _Second& __second) { \
       
   329     return __first _OP __second; \
       
   330   } \
       
   331   static _Ret \
       
   332   __binary_operator_requirement_violation(_First& __first,  \
       
   333                                           _Second& __second) { \
       
   334     return __first _OP __second; \
       
   335   } \
       
   336 }
       
   337 
       
   338 _STLP_DEFINE_BINARY_OP_CHECK(==, _OP_EQUAL);
       
   339 _STLP_DEFINE_BINARY_OP_CHECK(!=, _OP_NOT_EQUAL);
       
   340 _STLP_DEFINE_BINARY_OP_CHECK(<, _OP_LESS_THAN);
       
   341 _STLP_DEFINE_BINARY_OP_CHECK(<=, _OP_LESS_EQUAL);
       
   342 _STLP_DEFINE_BINARY_OP_CHECK(>, _OP_GREATER_THAN);
       
   343 _STLP_DEFINE_BINARY_OP_CHECK(>=, _OP_GREATER_EQUAL);
       
   344 _STLP_DEFINE_BINARY_OP_CHECK(+, _OP_PLUS);
       
   345 _STLP_DEFINE_BINARY_OP_CHECK(*, _OP_TIMES);
       
   346 _STLP_DEFINE_BINARY_OP_CHECK(/, _OP_DIVIDE);
       
   347 _STLP_DEFINE_BINARY_OP_CHECK(-, _OP_SUBTRACT);
       
   348 _STLP_DEFINE_BINARY_OP_CHECK(%, _OP_MOD);
       
   349 // ...
       
   350 
       
   351 // TODO, add unary operators (prefix and postfix)
       
   352 
       
   353 /*
       
   354   The presence of this class is just to trick EDG into displaying
       
   355   these error messages before any other errors. Without the
       
   356   classes, the errors in the functions get reported after
       
   357   other class errors deep inside the library. The name
       
   358   choice just makes for an eye catching error message :)
       
   359  */
       
   360 struct _STL_ERROR {
       
   361 
       
   362   template <class _Type>
       
   363   static _Type
       
   364   __default_constructor_requirement_violation(_Type) {
       
   365     return _Type();
       
   366   }
       
   367   template <class _Type>
       
   368   static _Type
       
   369   __assignment_operator_requirement_violation(_Type __a) {
       
   370     __a = __a;
       
   371     return __a;
       
   372   }
       
   373   template <class _Type>
       
   374   static _Type
       
   375   __copy_constructor_requirement_violation(_Type __a) {
       
   376     _Type __c(__a);
       
   377     return __c;
       
   378   }
       
   379   template <class _Type>
       
   380   static _Type
       
   381   __const_parameter_required_for_copy_constructor(_Type /* __a */, 
       
   382                                                   const _Type& __b) {
       
   383     _Type __c(__b);
       
   384     return __c;
       
   385   }
       
   386   template <class _Type>
       
   387   static _Type
       
   388   __const_parameter_required_for_assignment_operator(_Type __a, 
       
   389                                                      const _Type& __b) {
       
   390     __a = __b;
       
   391     return __a;
       
   392   }
       
   393   template <class _Type>
       
   394   static _Type
       
   395   __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
       
   396     if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
       
   397     return __b;
       
   398   }
       
   399   template <class _Type>
       
   400   static _Type
       
   401   __equality_comparable_requirement_violation(_Type __a, _Type __b) {
       
   402     if (__a == __b || __a != __b) return __a;
       
   403     return __b;
       
   404   }
       
   405   template <class _Iterator>
       
   406   static void
       
   407   __dereference_operator_requirement_violation(_Iterator __i) {
       
   408     __sink_unused_warning(*__i);
       
   409   }
       
   410   template <class _Iterator>
       
   411   static void
       
   412   __dereference_operator_and_assignment_requirement_violation(_Iterator __i) {
       
   413     *__i = *__i;
       
   414   }
       
   415   template <class _Iterator>
       
   416   static void
       
   417   __preincrement_operator_requirement_violation(_Iterator __i) {
       
   418     ++__i;
       
   419   }
       
   420   template <class _Iterator>
       
   421   static void
       
   422   __postincrement_operator_requirement_violation(_Iterator __i) {
       
   423     __i++;
       
   424   }
       
   425   template <class _Iterator>
       
   426   static void
       
   427   __predecrement_operator_requirement_violation(_Iterator __i) {
       
   428     --__i;
       
   429   }
       
   430   template <class _Iterator>
       
   431   static void
       
   432   __postdecrement_operator_requirement_violation(_Iterator __i) {
       
   433     __i--;
       
   434   }
       
   435   template <class _Iterator, class _Type>
       
   436   static void
       
   437   __postincrement_operator_and_assignment_requirement_violation(_Iterator __i,
       
   438                                                                 _Type __t) {
       
   439     *__i++ = __t;
       
   440   }
       
   441   template <class _Iterator, class _Distance>
       
   442   static _Iterator
       
   443   __iterator_addition_assignment_requirement_violation(_Iterator __i, 
       
   444                                                        _Distance __n) {
       
   445     __i += __n;
       
   446     return __i;
       
   447   }
       
   448   template <class _Iterator, class _Distance>
       
   449   static _Iterator
       
   450   __iterator_addition_requirement_violation(_Iterator __i, _Distance __n) {
       
   451     __i = __i + __n;
       
   452     __i = __n + __i;
       
   453     return __i;
       
   454   }
       
   455   template <class _Iterator, class _Distance>
       
   456   static _Iterator
       
   457   __iterator_subtraction_assignment_requirement_violation(_Iterator __i,
       
   458                                                           _Distance __n) {
       
   459     __i -= __n;
       
   460     return __i;
       
   461   }
       
   462   template <class _Iterator, class _Distance>
       
   463   static _Iterator
       
   464   __iterator_subtraction_requirement_violation(_Iterator __i, _Distance __n) {
       
   465     __i = __i - __n;
       
   466     return __i;
       
   467   }
       
   468   template <class _Iterator, class _Distance>
       
   469   static _Distance
       
   470   __difference_operator_requirement_violation(_Iterator __i, _Iterator __j,
       
   471                                               _Distance __n) {
       
   472     __n = __i - __j;
       
   473     return __n;
       
   474   }
       
   475   template <class _Exp, class _Type, class _Distance>
       
   476   static _Type
       
   477   __element_access_operator_requirement_violation(_Exp __x, _Type*,
       
   478                                                   _Distance __n) {
       
   479     return __x[__n];
       
   480   }
       
   481   template <class _Exp, class _Type, class _Distance>
       
   482   static void
       
   483   __element_assignment_operator_requirement_violation(_Exp __x,
       
   484                                                       _Type* __t,
       
   485                                                       _Distance __n) {
       
   486     __x[__n] = *__t;
       
   487   }
       
   488 
       
   489 }; /* _STL_ERROR */
       
   490 
       
   491 /* Associated Type Requirements */
       
   492 
       
   493 _STLP_BEGIN_NAMESPACE
       
   494 template <class _Iterator> struct iterator_traits;
       
   495 _STLP_END_NAMESPACE
       
   496 
       
   497 template <class _Iter> 
       
   498 struct __value_type_type_definition_requirement_violation {
       
   499   typedef typename __STD::iterator_traits<_Iter>::value_type value_type;
       
   500 };
       
   501 
       
   502 template <class _Iter> 
       
   503 struct __difference_type_type_definition_requirement_violation {
       
   504   typedef typename __STD::iterator_traits<_Iter>::difference_type
       
   505           difference_type;
       
   506 };
       
   507 
       
   508 template <class _Iter> 
       
   509 struct __reference_type_definition_requirement_violation {
       
   510   typedef typename __STD::iterator_traits<_Iter>::reference reference;
       
   511 };
       
   512 
       
   513 template <class _Iter> 
       
   514 struct __pointer_type_definition_requirement_violation {
       
   515   typedef typename __STD::iterator_traits<_Iter>::pointer pointer;
       
   516 };
       
   517 
       
   518 template <class _Iter> 
       
   519 struct __iterator_category_type_definition_requirement_violation {
       
   520   typedef typename __STD::iterator_traits<_Iter>::iterator_category 
       
   521           iterator_category;
       
   522 };
       
   523 
       
   524 /* Assignable Requirements */
       
   525 
       
   526 
       
   527 template <class _Type>
       
   528 struct _Assignable_concept_specification {
       
   529   static void _Assignable_requirement_violation(_Type __a) {
       
   530     _STL_ERROR::__assignment_operator_requirement_violation(__a);
       
   531     _STL_ERROR::__copy_constructor_requirement_violation(__a);
       
   532     _STL_ERROR::__const_parameter_required_for_copy_constructor(__a,__a);
       
   533     _STL_ERROR::__const_parameter_required_for_assignment_operator(__a,__a);
       
   534   }
       
   535 };
       
   536 
       
   537 /* DefaultConstructible Requirements */
       
   538 
       
   539 
       
   540 template <class _Type>
       
   541 struct _DefaultConstructible_concept_specification {
       
   542   static void _DefaultConstructible_requirement_violation(_Type __a) {
       
   543     _STL_ERROR::__default_constructor_requirement_violation(__a);
       
   544   }
       
   545 };
       
   546 
       
   547 /* EqualityComparable Requirements */
       
   548 
       
   549 template <class _Type>
       
   550 struct _EqualityComparable_concept_specification {
       
   551   static void _EqualityComparable_requirement_violation(_Type __a) {
       
   552     _STL_ERROR::__equality_comparable_requirement_violation(__a, __a);
       
   553   }
       
   554 };
       
   555 
       
   556 /* LessThanComparable Requirements */
       
   557 template <class _Type>
       
   558 struct _LessThanComparable_concept_specification {
       
   559   static void _LessThanComparable_requirement_violation(_Type __a) {
       
   560     _STL_ERROR::__less_than_comparable_requirement_violation(__a, __a);
       
   561   }
       
   562 };
       
   563 
       
   564 /* TrivialIterator Requirements */
       
   565 
       
   566 template <class _TrivialIterator>
       
   567 struct _TrivialIterator_concept_specification {
       
   568 static void
       
   569 _TrivialIterator_requirement_violation(_TrivialIterator __i) {
       
   570   typedef typename
       
   571     __value_type_type_definition_requirement_violation<_TrivialIterator>::
       
   572     value_type __T;
       
   573   // Refinement of Assignable
       
   574   _Assignable_concept_specification<_TrivialIterator>::
       
   575     _Assignable_requirement_violation(__i);
       
   576   // Refinement of DefaultConstructible
       
   577   _DefaultConstructible_concept_specification<_TrivialIterator>::
       
   578     _DefaultConstructible_requirement_violation(__i);
       
   579   // Refinement of EqualityComparable
       
   580   _EqualityComparable_concept_specification<_TrivialIterator>::
       
   581     _EqualityComparable_requirement_violation(__i);
       
   582   // Valid Expressions
       
   583   _STL_ERROR::__dereference_operator_requirement_violation(__i);
       
   584 }
       
   585 };
       
   586 
       
   587 template <class _TrivialIterator>
       
   588 struct _Mutable_TrivialIterator_concept_specification {
       
   589 static void
       
   590 _Mutable_TrivialIterator_requirement_violation(_TrivialIterator __i) {
       
   591   _TrivialIterator_concept_specification<_TrivialIterator>::
       
   592     _TrivialIterator_requirement_violation(__i);
       
   593   // Valid Expressions
       
   594   _STL_ERROR::__dereference_operator_and_assignment_requirement_violation(__i);
       
   595 }
       
   596 };
       
   597 
       
   598 /* InputIterator Requirements */
       
   599 
       
   600 template <class _InputIterator>
       
   601 struct _InputIterator_concept_specification {
       
   602 static void
       
   603 _InputIterator_requirement_violation(_InputIterator __i) {
       
   604   // Refinement of TrivialIterator
       
   605   _TrivialIterator_concept_specification<_InputIterator>::
       
   606     _TrivialIterator_requirement_violation(__i);
       
   607   // Associated Types
       
   608   __difference_type_type_definition_requirement_violation<_InputIterator>();
       
   609   __reference_type_definition_requirement_violation<_InputIterator>();
       
   610   __pointer_type_definition_requirement_violation<_InputIterator>();
       
   611   __iterator_category_type_definition_requirement_violation<_InputIterator>();
       
   612   // Valid Expressions
       
   613   _STL_ERROR::__preincrement_operator_requirement_violation(__i);
       
   614   _STL_ERROR::__postincrement_operator_requirement_violation(__i);
       
   615 }
       
   616 };
       
   617 
       
   618 /* OutputIterator Requirements */
       
   619 
       
   620 template <class _OutputIterator>
       
   621 struct _OutputIterator_concept_specification {
       
   622 static void
       
   623 _OutputIterator_requirement_violation(_OutputIterator __i) {
       
   624   // Refinement of Assignable
       
   625   _Assignable_concept_specification<_OutputIterator>::
       
   626     _Assignable_requirement_violation(__i);
       
   627   // Associated Types
       
   628   __iterator_category_type_definition_requirement_violation<_OutputIterator>();
       
   629   // Valid Expressions
       
   630   _STL_ERROR::__dereference_operator_requirement_violation(__i);
       
   631   _STL_ERROR::__preincrement_operator_requirement_violation(__i);
       
   632   _STL_ERROR::__postincrement_operator_requirement_violation(__i);
       
   633   _STL_ERROR::
       
   634     __postincrement_operator_and_assignment_requirement_violation(__i, *__i);
       
   635 }
       
   636 };
       
   637 
       
   638 /* ForwardIterator Requirements */
       
   639 
       
   640 template <class _ForwardIterator>
       
   641 struct _ForwardIterator_concept_specification {
       
   642 static void
       
   643 _ForwardIterator_requirement_violation(_ForwardIterator __i) {
       
   644   // Refinement of InputIterator
       
   645   _InputIterator_concept_specification<_ForwardIterator>::
       
   646     _InputIterator_requirement_violation(__i);
       
   647 }
       
   648 };
       
   649 
       
   650 template <class _ForwardIterator>
       
   651 struct _Mutable_ForwardIterator_concept_specification {
       
   652 static void
       
   653 _Mutable_ForwardIterator_requirement_violation(_ForwardIterator __i) {
       
   654   _ForwardIterator_concept_specification<_ForwardIterator>::
       
   655     _ForwardIterator_requirement_violation(__i);
       
   656   // Refinement of OutputIterator
       
   657   _OutputIterator_concept_specification<_ForwardIterator>::
       
   658     _OutputIterator_requirement_violation(__i);
       
   659 }
       
   660 };
       
   661 
       
   662 /* BidirectionalIterator Requirements */
       
   663 
       
   664 template <class _BidirectionalIterator>
       
   665 struct _BidirectionalIterator_concept_specification {
       
   666 static void
       
   667 _BidirectionalIterator_requirement_violation(_BidirectionalIterator __i) {
       
   668   // Refinement of ForwardIterator
       
   669   _ForwardIterator_concept_specification<_BidirectionalIterator>::
       
   670     _ForwardIterator_requirement_violation(__i);
       
   671   // Valid Expressions
       
   672   _STL_ERROR::__predecrement_operator_requirement_violation(__i);
       
   673   _STL_ERROR::__postdecrement_operator_requirement_violation(__i);
       
   674 }
       
   675 };
       
   676 
       
   677 template <class _BidirectionalIterator>
       
   678 struct _Mutable_BidirectionalIterator_concept_specification {
       
   679 static void
       
   680 _Mutable_BidirectionalIterator_requirement_violation(
       
   681        _BidirectionalIterator __i)
       
   682 {
       
   683   _BidirectionalIterator_concept_specification<_BidirectionalIterator>::
       
   684     _BidirectionalIterator_requirement_violation(__i);
       
   685   // Refinement of mutable_ForwardIterator
       
   686   _Mutable_ForwardIterator_concept_specification<_BidirectionalIterator>::
       
   687     _Mutable_ForwardIterator_requirement_violation(__i);
       
   688   typedef typename
       
   689     __value_type_type_definition_requirement_violation<
       
   690     _BidirectionalIterator>::value_type __T;
       
   691   typename _Mutable_trait<__T>::_Type* __tmp_ptr = 0;
       
   692   // Valid Expressions
       
   693   _STL_ERROR::
       
   694     __postincrement_operator_and_assignment_requirement_violation(__i,
       
   695                                                                   *__tmp_ptr);
       
   696 }
       
   697 };
       
   698 
       
   699 /* RandomAccessIterator Requirements */
       
   700 
       
   701 template <class _RandAccIter>
       
   702 struct _RandomAccessIterator_concept_specification {
       
   703 static void
       
   704 _RandomAccessIterator_requirement_violation(_RandAccIter __i) {
       
   705   // Refinement of BidirectionalIterator
       
   706   _BidirectionalIterator_concept_specification<_RandAccIter>::
       
   707     _BidirectionalIterator_requirement_violation(__i);
       
   708   // Refinement of LessThanComparable
       
   709   _LessThanComparable_concept_specification<_RandAccIter>::
       
   710     _LessThanComparable_requirement_violation(__i);
       
   711   typedef typename 
       
   712         __value_type_type_definition_requirement_violation<_RandAccIter>
       
   713         ::value_type
       
   714     value_type;
       
   715   typedef typename
       
   716         __difference_type_type_definition_requirement_violation<_RandAccIter>
       
   717         ::difference_type 
       
   718     _Dist;
       
   719   typedef typename _Mutable_trait<_Dist>::_Type _MutDist;
       
   720 
       
   721   // Valid Expressions
       
   722   _STL_ERROR::__iterator_addition_assignment_requirement_violation(__i,
       
   723                                                                    _MutDist());
       
   724   _STL_ERROR::__iterator_addition_requirement_violation(__i,
       
   725                                                         _MutDist());
       
   726   _STL_ERROR::
       
   727     __iterator_subtraction_assignment_requirement_violation(__i,
       
   728                                                             _MutDist());
       
   729   _STL_ERROR::__iterator_subtraction_requirement_violation(__i,
       
   730                                                            _MutDist());
       
   731   _STL_ERROR::__difference_operator_requirement_violation(__i, __i,
       
   732                                                           _MutDist());
       
   733   typename _Mutable_trait<value_type>::_Type* __dummy_ptr = 0;
       
   734   _STL_ERROR::__element_access_operator_requirement_violation(__i,
       
   735                                                               __dummy_ptr,
       
   736                                                               _MutDist());
       
   737 }
       
   738 };
       
   739 
       
   740 template <class _RandAccIter>
       
   741 struct _Mutable_RandomAccessIterator_concept_specification {
       
   742 static void
       
   743 _Mutable_RandomAccessIterator_requirement_violation(_RandAccIter __i)
       
   744 {
       
   745   _RandomAccessIterator_concept_specification<_RandAccIter>::
       
   746     _RandomAccessIterator_requirement_violation(__i);
       
   747   // Refinement of mutable_BidirectionalIterator
       
   748   _Mutable_BidirectionalIterator_concept_specification<_RandAccIter>::
       
   749     _Mutable_BidirectionalIterator_requirement_violation(__i);
       
   750   typedef typename
       
   751         __value_type_type_definition_requirement_violation<_RandAccIter>
       
   752         ::value_type
       
   753     value_type;
       
   754   typedef typename
       
   755         __difference_type_type_definition_requirement_violation<_RandAccIter>
       
   756         ::difference_type
       
   757     _Dist;
       
   758 
       
   759   typename _Mutable_trait<value_type>::_Type* __tmp_ptr = 0;
       
   760   // Valid Expressions
       
   761   _STL_ERROR::__element_assignment_operator_requirement_violation(__i,
       
   762                   __tmp_ptr, _Dist());
       
   763 }
       
   764 };
       
   765 
       
   766 #define _STLP_TYPEDEF_REQUIREMENT(__REQUIREMENT) \
       
   767 template <class Type> \
       
   768 struct __##__REQUIREMENT##__typedef_requirement_violation { \
       
   769   typedef typename Type::__REQUIREMENT __REQUIREMENT; \
       
   770 };
       
   771 
       
   772 _STLP_TYPEDEF_REQUIREMENT(value_type);
       
   773 _STLP_TYPEDEF_REQUIREMENT(difference_type);
       
   774 _STLP_TYPEDEF_REQUIREMENT(size_type);
       
   775 _STLP_TYPEDEF_REQUIREMENT(reference);
       
   776 _STLP_TYPEDEF_REQUIREMENT(const_reference);
       
   777 _STLP_TYPEDEF_REQUIREMENT(pointer);
       
   778 _STLP_TYPEDEF_REQUIREMENT(const_pointer);
       
   779 
       
   780 
       
   781 template <class _Alloc>
       
   782 struct _Allocator_concept_specification {
       
   783 static void
       
   784 _Allocator_requirement_violation(_Alloc __a) {
       
   785   // Refinement of DefaultConstructible
       
   786   _DefaultConstructible_concept_specification<_Alloc>::
       
   787     _DefaultConstructible_requirement_violation(__a);
       
   788   // Refinement of EqualityComparable
       
   789   _EqualityComparable_concept_specification<_Alloc>::
       
   790     _EqualityComparable_requirement_violation(__a);
       
   791   // Associated Types
       
   792   __value_type__typedef_requirement_violation<_Alloc>();
       
   793   __difference_type__typedef_requirement_violation<_Alloc>();
       
   794   __size_type__typedef_requirement_violation<_Alloc>();
       
   795   __reference__typedef_requirement_violation<_Alloc>();
       
   796   __const_reference__typedef_requirement_violation<_Alloc>();
       
   797   __pointer__typedef_requirement_violation<_Alloc>();
       
   798   __const_pointer__typedef_requirement_violation<_Alloc>();
       
   799   typedef typename _Alloc::value_type _Type;
       
   800   _STLP_REQUIRES_SAME_TYPE(typename _Alloc::rebind<_Type>::other, _Alloc);
       
   801 }
       
   802 };
       
   803 
       
   804 #endif /* _STLP_USE_CONCEPT_CHECKS */
       
   805 
       
   806 #endif /* __CONCEPT_CHECKS_H */
       
   807 
       
   808 // Local Variables:
       
   809 // mode:C++
       
   810 // End: