Whole document tree boost_concept_check.hGo to the documentation of this file.00001 // 00002 // (C) Copyright Jeremy Siek 2000. Permission to copy, use, modify, 00003 // sell and distribute this software is granted provided this 00004 // copyright notice appears in all copies. This software is provided 00005 // "as is" without express or implied warranty, and with no claim as 00006 // to its suitability for any purpose. 00007 // 00008 00009 // GCC Note: based on version 1.12.0 of the Boost library. 00010 #ifndef _GLIBCPP_BOOST_CONCEPT_CHECK 00011 #define _GLIBCPP_BOOST_CONCEPT_CHECK 1 00012 00013 #pragma GCC system_header 00014 #include <bits/stl_iterator_base_types.h> // for traits and tags 00015 #include <utility> // for pair<> 00016 00017 00018 namespace __gnu_cxx 00019 { 00020 00021 #define _IsUnused __attribute__ ((__unused__)) 00022 00023 template <class _Concept> 00024 void __function_requires() 00025 { 00026 void (_Concept::*__x)() _IsUnused = &_Concept::__constraints; 00027 } 00028 00029 00030 // ??? Should the "concept_checking*" structs begin with more than _ ? 00031 #define _GLIBCPP_CLASS_REQUIRES(_type_var, _ns, _concept) \ 00032 typedef void (_ns::_concept <_type_var>::* _func##_type_var##_concept)(); \ 00033 template <_func##_type_var##_concept _Tp1> \ 00034 struct _concept_checking##_type_var##_concept { }; \ 00035 typedef _concept_checking##_type_var##_concept< \ 00036 &_ns::_concept <_type_var>::__constraints> \ 00037 _concept_checking_typedef##_type_var##_concept 00038 00039 #define _GLIBCPP_CLASS_REQUIRES2(_type_var1, _type_var2, _ns, _concept) \ 00040 typedef void (_ns::_concept <_type_var1,_type_var2>::* _func##_type_var1##_type_var2##_concept)(); \ 00041 template <_func##_type_var1##_type_var2##_concept _Tp1> \ 00042 struct _concept_checking##_type_var1##_type_var2##_concept { }; \ 00043 typedef _concept_checking##_type_var1##_type_var2##_concept< \ 00044 &_ns::_concept <_type_var1,_type_var2>::__constraints> \ 00045 _concept_checking_typedef##_type_var1##_type_var2##_concept 00046 00047 #define _GLIBCPP_CLASS_REQUIRES3(_type_var1, _type_var2, _type_var3, _ns, _concept) \ 00048 typedef void (_ns::_concept <_type_var1,_type_var2,_type_var3>::* _func##_type_var1##_type_var2##_type_var3##_concept)(); \ 00049 template <_func##_type_var1##_type_var2##_type_var3##_concept _Tp1> \ 00050 struct _concept_checking##_type_var1##_type_var2##_type_var3##_concept { }; \ 00051 typedef _concept_checking##_type_var1##_type_var2##_type_var3##_concept< \ 00052 &_ns::_concept <_type_var1,_type_var2,_type_var3>::__constraints> \ 00053 _concept_checking_typedef##_type_var1##_type_var2##_type_var3##_concept 00054 00055 #define _GLIBCPP_CLASS_REQUIRES4(_type_var1, _type_var2, _type_var3, _type_var4, _ns, _concept) \ 00056 typedef void (_ns::_concept <_type_var1,_type_var2,_type_var3,_type_var4>::* _func##_type_var1##_type_var2##_type_var3##_type_var4##_concept)(); \ 00057 template <_func##_type_var1##_type_var2##_type_var3##_type_var4##_concept _Tp1> \ 00058 struct _concept_checking##_type_var1##_type_var2##_type_var3##_type_var4##_concept { }; \ 00059 typedef _concept_checking##_type_var1##_type_var2##_type_var3##_type_var4##_concept< \ 00060 &_ns::_concept <_type_var1,_type_var2,_type_var3,_type_var4>::__constraints> \ 00061 _concept_checking_typedef##_type_var1##_type_var2##_type_var3##_type_var4##_concept 00062 00063 00064 template <class _Tp1, class _Tp2> 00065 struct _Aux_require_same { }; 00066 00067 template <class _Tp> 00068 struct _Aux_require_same<_Tp,_Tp> { typedef _Tp _Type; }; 00069 00070 template <class _Tp1, class _Tp2> 00071 struct _SameTypeConcept 00072 { 00073 void __constraints() { 00074 typedef typename _Aux_require_same<_Tp1, _Tp2>::_Type _Required; 00075 } 00076 }; 00077 00078 template <class _Tp> 00079 struct _IntegerConcept { 00080 void __constraints() { 00081 __error_type_must_be_an_integer_type(); 00082 } 00083 }; 00084 template <> struct _IntegerConcept<short> { void __constraints() {} }; 00085 template <> struct _IntegerConcept<unsigned short> { void __constraints(){} }; 00086 template <> struct _IntegerConcept<int> { void __constraints() {} }; 00087 template <> struct _IntegerConcept<unsigned int> { void __constraints() {} }; 00088 template <> struct _IntegerConcept<long> { void __constraints() {} }; 00089 template <> struct _IntegerConcept<unsigned long> { void __constraints() {} }; 00090 template <> struct _IntegerConcept<long long> { void __constraints() {} }; 00091 template <> struct _IntegerConcept<unsigned long long> 00092 { void __constraints() {} }; 00093 00094 template <class _Tp> 00095 struct _SignedIntegerConcept { 00096 void __constraints() { 00097 __error_type_must_be_a_signed_integer_type(); 00098 } 00099 }; 00100 template <> struct _SignedIntegerConcept<short> { void __constraints() {} }; 00101 template <> struct _SignedIntegerConcept<int> { void __constraints() {} }; 00102 template <> struct _SignedIntegerConcept<long> { void __constraints() {} }; 00103 template <> struct _SignedIntegerConcept<long long> { void __constraints(){}}; 00104 00105 template <class _Tp> 00106 struct _UnsignedIntegerConcept { 00107 void __constraints() { 00108 __error_type_must_be_an_unsigned_integer_type(); 00109 } 00110 }; 00111 template <> struct _UnsignedIntegerConcept<unsigned short> 00112 { void __constraints() {} }; 00113 template <> struct _UnsignedIntegerConcept<unsigned int> 00114 { void __constraints() {} }; 00115 template <> struct _UnsignedIntegerConcept<unsigned long> 00116 { void __constraints() {} }; 00117 template <> struct _UnsignedIntegerConcept<unsigned long long> 00118 { void __constraints() {} }; 00119 00120 //=========================================================================== 00121 // Basic Concepts 00122 00123 template <class _Tp> 00124 struct _DefaultConstructibleConcept 00125 { 00126 void __constraints() { 00127 _Tp __a _IsUnused; // require default constructor 00128 } 00129 }; 00130 00131 template <class _Tp> 00132 struct _AssignableConcept 00133 { 00134 void __constraints() { 00135 __a = __a; // require assignment operator 00136 __const_constraints(__a); 00137 } 00138 void __const_constraints(const _Tp& __b) { 00139 __a = __b; // const required for argument to assignment 00140 } 00141 _Tp __a; 00142 }; 00143 00144 template <class _Tp> 00145 struct _CopyConstructibleConcept 00146 { 00147 void __constraints() { 00148 _Tp __a(__b); // require copy constructor 00149 _Tp* __ptr _IsUnused = &__a; // require address of operator 00150 __const_constraints(__a); 00151 } 00152 void __const_constraints(const _Tp& __a) { 00153 _Tp __c(__a) _IsUnused; // require const copy constructor 00154 const _Tp* __ptr _IsUnused = &__a; // require const address of operator 00155 } 00156 _Tp __b; 00157 }; 00158 00159 // The SGI STL version of Assignable requires copy constructor and operator= 00160 template <class _Tp> 00161 struct _SGIAssignableConcept 00162 { 00163 void __constraints() { 00164 _Tp __b(__a) _IsUnused; 00165 __a = __a; // require assignment operator 00166 __const_constraints(__a); 00167 } 00168 void __const_constraints(const _Tp& __b) { 00169 _Tp __c(__b) _IsUnused; 00170 __a = __b; // const required for argument to assignment 00171 } 00172 _Tp __a; 00173 }; 00174 00175 template <class _From, class _To> 00176 struct _ConvertibleConcept 00177 { 00178 void __constraints() { 00179 _To __y _IsUnused = __x; 00180 } 00181 _From __x; 00182 }; 00183 00184 // The C++ standard requirements for many concepts talk about return 00185 // types that must be "convertible to bool". The problem with this 00186 // requirement is that it leaves the door open for evil proxies that 00187 // define things like operator|| with strange return types. Two 00188 // possible solutions are: 00189 // 1) require the return type to be exactly bool 00190 // 2) stay with convertible to bool, and also 00191 // specify stuff about all the logical operators. 00192 // For now we just test for convertible to bool. 00193 template <class _Tp> 00194 void __aux_require_boolean_expr(const _Tp& __t) { 00195 bool __x _IsUnused = __t; 00196 } 00197 00198 // FIXME 00199 template <class _Tp> 00200 struct _EqualityComparableConcept 00201 { 00202 void __constraints() { 00203 __aux_require_boolean_expr(__a == __b); 00204 __aux_require_boolean_expr(__a != __b); 00205 } 00206 _Tp __a, __b; 00207 }; 00208 00209 template <class _Tp> 00210 struct _LessThanComparableConcept 00211 { 00212 void __constraints() { 00213 __aux_require_boolean_expr(__a < __b); 00214 } 00215 _Tp __a, __b; 00216 }; 00217 00218 // This is equivalent to SGI STL's LessThanComparable. 00219 template <class _Tp> 00220 struct _ComparableConcept 00221 { 00222 void __constraints() { 00223 __aux_require_boolean_expr(__a < __b); 00224 __aux_require_boolean_expr(__a > __b); 00225 __aux_require_boolean_expr(__a <= __b); 00226 __aux_require_boolean_expr(__a >= __b); 00227 } 00228 _Tp __a, __b; 00229 }; 00230 00231 #define _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(_OP,_NAME) \ 00232 template <class _First, class _Second> \ 00233 struct _NAME { \ 00234 void __constraints() { (void)__constraints_(); } \ 00235 bool __constraints_() { \ 00236 return __a _OP __b; \ 00237 } \ 00238 _First __a; \ 00239 _Second __b; \ 00240 } 00241 00242 #define _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT(_OP,_NAME) \ 00243 template <class _Ret, class _First, class _Second> \ 00244 struct _NAME { \ 00245 void __constraints() { (void)__constraints_(); } \ 00246 _Ret __constraints_() { \ 00247 return __a _OP __b; \ 00248 } \ 00249 _First __a; \ 00250 _Second __b; \ 00251 } 00252 00253 _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(==, _EqualOpConcept); 00254 _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(!=, _NotEqualOpConcept); 00255 _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<, _LessThanOpConcept); 00256 _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<=, _LessEqualOpConcept); 00257 _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>, _GreaterThanOpConcept); 00258 _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>=, _GreaterEqualOpConcept); 00259 00260 _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT(+, _PlusOpConcept); 00261 _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT(*, _TimesOpConcept); 00262 _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT(/, _DivideOpConcept); 00263 _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT(-, _SubtractOpConcept); 00264 _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT(%, _ModOpConcept); 00265 00266 #undef _GLIBCPP_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT 00267 #undef _GLIBCPP_DEFINE_BINARY_OPERATOR_CONSTRAINT 00268 00269 //=========================================================================== 00270 // Function Object Concepts 00271 00272 template <class _Func, class _Return> 00273 struct _GeneratorConcept 00274 { 00275 void __constraints() { 00276 const _Return& __r _IsUnused = __f();// require operator() member function 00277 } 00278 _Func __f; 00279 }; 00280 00281 00282 template <class _Func> 00283 struct _GeneratorConcept<_Func,void> 00284 { 00285 void __constraints() { 00286 __f(); // require operator() member function 00287 } 00288 _Func __f; 00289 }; 00290 00291 template <class _Func, class _Return, class _Arg> 00292 struct _UnaryFunctionConcept 00293 { 00294 void __constraints() { 00295 __r = __f(__arg); // require operator() 00296 } 00297 _Func __f; 00298 _Arg __arg; 00299 _Return __r; 00300 }; 00301 00302 template <class _Func, class _Arg> 00303 struct _UnaryFunctionConcept<_Func, void, _Arg> { 00304 void __constraints() { 00305 __f(__arg); // require operator() 00306 } 00307 _Func __f; 00308 _Arg __arg; 00309 }; 00310 00311 template <class _Func, class _Return, class _First, class _Second> 00312 struct _BinaryFunctionConcept 00313 { 00314 void __constraints() { 00315 __r = __f(__first, __second); // require operator() 00316 } 00317 _Func __f; 00318 _First __first; 00319 _Second __second; 00320 _Return __r; 00321 }; 00322 00323 template <class _Func, class _First, class _Second> 00324 struct _BinaryFunctionConcept<_Func, void, _First, _Second> 00325 { 00326 void __constraints() { 00327 __f(__first, __second); // require operator() 00328 } 00329 _Func __f; 00330 _First __first; 00331 _Second __second; 00332 }; 00333 00334 template <class _Func, class _Arg> 00335 struct _UnaryPredicateConcept 00336 { 00337 void __constraints() { 00338 __aux_require_boolean_expr(__f(__arg)); // require op() returning bool 00339 } 00340 _Func __f; 00341 _Arg __arg; 00342 }; 00343 00344 template <class _Func, class _First, class _Second> 00345 struct _BinaryPredicateConcept 00346 { 00347 void __constraints() { 00348 __aux_require_boolean_expr(__f(__a, __b)); // require op() returning bool 00349 } 00350 _Func __f; 00351 _First __a; 00352 _Second __b; 00353 }; 00354 00355 // use this when functor is used inside a container class like std::set 00356 template <class _Func, class _First, class _Second> 00357 struct _Const_BinaryPredicateConcept { 00358 void __constraints() { 00359 __const_constraints(__f); 00360 } 00361 void __const_constraints(const _Func& __fun) { 00362 __function_requires<_BinaryPredicateConcept<_Func, _First, _Second> >(); 00363 // operator() must be a const member function 00364 __aux_require_boolean_expr(__fun(__a, __b)); 00365 } 00366 _Func __f; 00367 _First __a; 00368 _Second __b; 00369 }; 00370 00371 //=========================================================================== 00372 // Iterator Concepts 00373 00374 template <class _Tp> 00375 struct _TrivialIteratorConcept 00376 { 00377 void __constraints() { 00378 __function_requires< _DefaultConstructibleConcept<_Tp> >(); 00379 __function_requires< _AssignableConcept<_Tp> >(); 00380 __function_requires< _EqualityComparableConcept<_Tp> >(); 00381 typedef typename std::iterator_traits<_Tp>::value_type _V; 00382 (void)*__i; // require dereference operator 00383 } 00384 _Tp __i; 00385 }; 00386 00387 template <class _Tp> 00388 struct _Mutable_TrivialIteratorConcept 00389 { 00390 void __constraints() { 00391 __function_requires< _TrivialIteratorConcept<_Tp> >(); 00392 *__i = *__j; // require dereference and assignment 00393 } 00394 _Tp __i, __j; 00395 }; 00396 00397 template <class _Tp> 00398 struct _InputIteratorConcept 00399 { 00400 void __constraints() { 00401 __function_requires< _TrivialIteratorConcept<_Tp> >(); 00402 // require iterator_traits typedef's 00403 typedef typename std::iterator_traits<_Tp>::difference_type _D; 00404 __function_requires< _SignedIntegerConcept<_D> >(); 00405 typedef typename std::iterator_traits<_Tp>::reference _R; 00406 typedef typename std::iterator_traits<_Tp>::pointer _Pt; 00407 typedef typename std::iterator_traits<_Tp>::iterator_category _Cat; 00408 __function_requires< _ConvertibleConcept< 00409 typename std::iterator_traits<_Tp>::iterator_category, 00410 std::input_iterator_tag> >(); 00411 ++__i; // require preincrement operator 00412 __i++; // require postincrement operator 00413 } 00414 _Tp __i; 00415 }; 00416 00417 template <class _Tp, class _ValueT> 00418 struct _OutputIteratorConcept 00419 { 00420 void __constraints() { 00421 __function_requires< _AssignableConcept<_Tp> >(); 00422 ++__i; // require preincrement operator 00423 __i++; // require postincrement operator 00424 *__i++ = __t; // require postincrement and assignment 00425 } 00426 _Tp __i; 00427 _ValueT __t; 00428 }; 00429 00430 template <class _Tp> 00431 struct _ForwardIteratorConcept 00432 { 00433 void __constraints() { 00434 __function_requires< _InputIteratorConcept<_Tp> >(); 00435 __function_requires< _ConvertibleConcept< 00436 typename std::iterator_traits<_Tp>::iterator_category, 00437 std::forward_iterator_tag> >(); 00438 typedef typename std::iterator_traits<_Tp>::reference _R; 00439 _R __r _IsUnused = *__i; 00440 } 00441 _Tp __i; 00442 }; 00443 00444 template <class _Tp> 00445 struct _Mutable_ForwardIteratorConcept 00446 { 00447 void __constraints() { 00448 __function_requires< _ForwardIteratorConcept<_Tp> >(); 00449 *__i++ = *__i; // require postincrement and assignment 00450 } 00451 _Tp __i; 00452 }; 00453 00454 template <class _Tp> 00455 struct _BidirectionalIteratorConcept 00456 { 00457 void __constraints() { 00458 __function_requires< _ForwardIteratorConcept<_Tp> >(); 00459 __function_requires< _ConvertibleConcept< 00460 typename std::iterator_traits<_Tp>::iterator_category, 00461 std::bidirectional_iterator_tag> >(); 00462 --__i; // require predecrement operator 00463 __i--; // require postdecrement operator 00464 } 00465 _Tp __i; 00466 }; 00467 00468 template <class _Tp> 00469 struct _Mutable_BidirectionalIteratorConcept 00470 { 00471 void __constraints() { 00472 __function_requires< _BidirectionalIteratorConcept<_Tp> >(); 00473 __function_requires< _Mutable_ForwardIteratorConcept<_Tp> >(); 00474 *__i-- = *__i; // require postdecrement and assignment 00475 } 00476 _Tp __i; 00477 }; 00478 00479 00480 template <class _Tp> 00481 struct _RandomAccessIteratorConcept 00482 { 00483 void __constraints() { 00484 __function_requires< _BidirectionalIteratorConcept<_Tp> >(); 00485 __function_requires< _ComparableConcept<_Tp> >(); 00486 __function_requires< _ConvertibleConcept< 00487 typename std::iterator_traits<_Tp>::iterator_category, 00488 std::random_access_iterator_tag> >(); 00489 // ??? We don't use _R, are we just checking for "referenceability"? 00490 typedef typename std::iterator_traits<_Tp>::reference _R; 00491 00492 __i += __n; // require assignment addition operator 00493 __i = __i + __n; __i = __n + __i; // require addition with difference type 00494 __i -= __n; // require assignment subtraction op 00495 __i = __i - __n; // require subtraction with 00496 // difference type 00497 __n = __i - __j; // require difference operator 00498 (void)__i[__n]; // require element access operator 00499 } 00500 _Tp __a, __b; 00501 _Tp __i, __j; 00502 typename std::iterator_traits<_Tp>::difference_type __n; 00503 }; 00504 00505 template <class _Tp> 00506 struct _Mutable_RandomAccessIteratorConcept 00507 { 00508 void __constraints() { 00509 __function_requires< _RandomAccessIteratorConcept<_Tp> >(); 00510 __function_requires< _Mutable_BidirectionalIteratorConcept<_Tp> >(); 00511 __i[__n] = *__i; // require element access and assignment 00512 } 00513 _Tp __i; 00514 typename std::iterator_traits<_Tp>::difference_type __n; 00515 }; 00516 00517 //=========================================================================== 00518 // Container Concepts 00519 00520 template <class _Container> 00521 struct _ContainerConcept 00522 { 00523 typedef typename _Container::value_type _Value_type; 00524 typedef typename _Container::difference_type _Difference_type; 00525 typedef typename _Container::size_type _Size_type; 00526 typedef typename _Container::const_reference _Const_reference; 00527 typedef typename _Container::const_pointer _Const_pointer; 00528 typedef typename _Container::const_iterator _Const_iterator; 00529 00530 void __constraints() { 00531 __function_requires< _InputIteratorConcept<_Const_iterator> >(); 00532 __function_requires< _AssignableConcept<_Container> >(); 00533 const _Container __c; 00534 __i = __c.begin(); 00535 __i = __c.end(); 00536 __n = __c.size(); 00537 __n = __c.max_size(); 00538 __b = __c.empty(); 00539 } 00540 bool __b; 00541 _Const_iterator __i; 00542 _Size_type __n; 00543 }; 00544 00545 template <class _Container> 00546 struct _Mutable_ContainerConcept 00547 { 00548 typedef typename _Container::value_type _Value_type; 00549 typedef typename _Container::reference _Reference; 00550 typedef typename _Container::iterator _Iterator; 00551 typedef typename _Container::pointer _Pointer; 00552 00553 void __constraints() { 00554 __function_requires< _ContainerConcept<_Container> >(); 00555 __function_requires< _AssignableConcept<_Value_type> >(); 00556 __function_requires< _InputIteratorConcept<_Iterator> >(); 00557 00558 __i = __c.begin(); 00559 __i = __c.end(); 00560 __c.swap(__c2); 00561 } 00562 _Iterator __i; 00563 _Container __c, __c2; 00564 }; 00565 00566 template <class _ForwardContainer> 00567 struct _ForwardContainerConcept 00568 { 00569 void __constraints() { 00570 __function_requires< _ContainerConcept<_ForwardContainer> >(); 00571 typedef typename _ForwardContainer::const_iterator _Const_iterator; 00572 __function_requires< _ForwardIteratorConcept<_Const_iterator> >(); 00573 } 00574 }; 00575 00576 template <class _ForwardContainer> 00577 struct _Mutable_ForwardContainerConcept 00578 { 00579 void __constraints() { 00580 __function_requires< _ForwardContainerConcept<_ForwardContainer> >(); 00581 __function_requires< _Mutable_ContainerConcept<_ForwardContainer> >(); 00582 typedef typename _ForwardContainer::iterator _Iterator; 00583 __function_requires< _Mutable_ForwardIteratorConcept<_Iterator> >(); 00584 } 00585 }; 00586 00587 template <class _ReversibleContainer> 00588 struct _ReversibleContainerConcept 00589 { 00590 typedef typename _ReversibleContainer::const_iterator _Const_iterator; 00591 typedef typename _ReversibleContainer::const_reverse_iterator 00592 _Const_reverse_iterator; 00593 00594 void __constraints() { 00595 __function_requires< _ForwardContainerConcept<_ReversibleContainer> >(); 00596 __function_requires< _BidirectionalIteratorConcept<_Const_iterator> >(); 00597 __function_requires< 00598 _BidirectionalIteratorConcept<_Const_reverse_iterator> >(); 00599 00600 const _ReversibleContainer __c; 00601 _Const_reverse_iterator __i = __c.rbegin(); 00602 __i = __c.rend(); 00603 } 00604 }; 00605 00606 template <class _ReversibleContainer> 00607 struct _Mutable_ReversibleContainerConcept 00608 { 00609 typedef typename _ReversibleContainer::iterator _Iterator; 00610 typedef typename _ReversibleContainer::reverse_iterator _Reverse_iterator; 00611 00612 void __constraints() { 00613 __function_requires<_ReversibleContainerConcept<_ReversibleContainer> >(); 00614 __function_requires< 00615 _Mutable_ForwardContainerConcept<_ReversibleContainer> >(); 00616 __function_requires<_Mutable_BidirectionalIteratorConcept<_Iterator> >(); 00617 __function_requires< 00618 _Mutable_BidirectionalIteratorConcept<_Reverse_iterator> >(); 00619 00620 _Reverse_iterator __i = __c.rbegin(); 00621 __i = __c.rend(); 00622 } 00623 _ReversibleContainer __c; 00624 }; 00625 00626 template <class _RandomAccessContainer> 00627 struct _RandomAccessContainerConcept 00628 { 00629 typedef typename _RandomAccessContainer::size_type _Size_type; 00630 typedef typename _RandomAccessContainer::const_reference _Const_reference; 00631 typedef typename _RandomAccessContainer::const_iterator _Const_iterator; 00632 typedef typename _RandomAccessContainer::const_reverse_iterator 00633 _Const_reverse_iterator; 00634 00635 void __constraints() { 00636 __function_requires< 00637 _ReversibleContainerConcept<_RandomAccessContainer> >(); 00638 __function_requires< _RandomAccessIteratorConcept<_Const_iterator> >(); 00639 __function_requires< 00640 _RandomAccessIteratorConcept<_Const_reverse_iterator> >(); 00641 00642 const _RandomAccessContainer __c; 00643 _Const_reference __r _IsUnused = __c[__n]; 00644 } 00645 _Size_type __n; 00646 }; 00647 00648 template <class _RandomAccessContainer> 00649 struct _Mutable_RandomAccessContainerConcept 00650 { 00651 typedef typename _RandomAccessContainer::size_type _Size_type; 00652 typedef typename _RandomAccessContainer::reference _Reference; 00653 typedef typename _RandomAccessContainer::iterator _Iterator; 00654 typedef typename _RandomAccessContainer::reverse_iterator _Reverse_iterator; 00655 00656 void __constraints() { 00657 __function_requires< 00658 _RandomAccessContainerConcept<_RandomAccessContainer> >(); 00659 __function_requires< 00660 _Mutable_ReversibleContainerConcept<_RandomAccessContainer> >(); 00661 __function_requires< _Mutable_RandomAccessIteratorConcept<_Iterator> >(); 00662 __function_requires< 00663 _Mutable_RandomAccessIteratorConcept<_Reverse_iterator> >(); 00664 00665 _Reference __r _IsUnused = __c[__i]; 00666 } 00667 _Size_type __i; 00668 _RandomAccessContainer __c; 00669 }; 00670 00671 // A Sequence is inherently mutable 00672 template <class _Sequence> 00673 struct _SequenceConcept 00674 { 00675 typedef typename _Sequence::reference _Reference; 00676 typedef typename _Sequence::const_reference _Const_reference; 00677 00678 void __constraints() { 00679 // Matt Austern's book puts DefaultConstructible here, the C++ 00680 // standard places it in Container 00681 // function_requires< DefaultConstructible<Sequence> >(); 00682 __function_requires< _Mutable_ForwardContainerConcept<_Sequence> >(); 00683 __function_requires< _DefaultConstructibleConcept<_Sequence> >(); 00684 00685 _Sequence 00686 __c(__n) _IsUnused, 00687 __c2(__n, __t) _IsUnused, 00688 __c3(__first, __last) _IsUnused; 00689 00690 __c.insert(__p, __t); 00691 __c.insert(__p, __n, __t); 00692 __c.insert(__p, __first, __last); 00693 00694 __c.erase(__p); 00695 __c.erase(__p, __q); 00696 00697 _Reference __r _IsUnused = __c.front(); 00698 00699 __const_constraints(__c); 00700 } 00701 void __const_constraints(const _Sequence& __c) { 00702 _Const_reference __r _IsUnused = __c.front(); 00703 } 00704 typename _Sequence::value_type __t; 00705 typename _Sequence::size_type __n; 00706 typename _Sequence::value_type *__first, *__last; 00707 typename _Sequence::iterator __p, __q; 00708 }; 00709 00710 template <class _FrontInsertionSequence> 00711 struct _FrontInsertionSequenceConcept 00712 { 00713 void __constraints() { 00714 __function_requires< _SequenceConcept<_FrontInsertionSequence> >(); 00715 00716 __c.push_front(__t); 00717 __c.pop_front(); 00718 } 00719 _FrontInsertionSequence __c; 00720 typename _FrontInsertionSequence::value_type __t; 00721 }; 00722 00723 template <class _BackInsertionSequence> 00724 struct _BackInsertionSequenceConcept 00725 { 00726 typedef typename _BackInsertionSequence::reference _Reference; 00727 typedef typename _BackInsertionSequence::const_reference _Const_reference; 00728 00729 void __constraints() { 00730 __function_requires< _SequenceConcept<_BackInsertionSequence> >(); 00731 00732 __c.push_back(__t); 00733 __c.pop_back(); 00734 _Reference __r _IsUnused = __c.back(); 00735 } 00736 void __const_constraints(const _BackInsertionSequence& __c) { 00737 _Const_reference __r _IsUnused = __c.back(); 00738 }; 00739 _BackInsertionSequence __c; 00740 typename _BackInsertionSequence::value_type __t; 00741 }; 00742 00743 template <class _AssociativeContainer> 00744 struct _AssociativeContainerConcept 00745 { 00746 void __constraints() { 00747 __function_requires< _ForwardContainerConcept<_AssociativeContainer> >(); 00748 __function_requires< 00749 _DefaultConstructibleConcept<_AssociativeContainer> >(); 00750 00751 __i = __c.find(__k); 00752 __r = __c.equal_range(__k); 00753 __c.erase(__k); 00754 __c.erase(__i); 00755 __c.erase(__r.first, __r.second); 00756 __const_constraints(__c); 00757 } 00758 void __const_constraints(const _AssociativeContainer& __c) { 00759 __ci = __c.find(__k); 00760 __n = __c.count(__k); 00761 __cr = __c.equal_range(__k); 00762 } 00763 typedef typename _AssociativeContainer::iterator _Iterator; 00764 typedef typename _AssociativeContainer::const_iterator _Const_iterator; 00765 00766 _AssociativeContainer __c; 00767 _Iterator __i; 00768 std::pair<_Iterator,_Iterator> __r; 00769 _Const_iterator __ci; 00770 std::pair<_Const_iterator,_Const_iterator> __cr; 00771 typename _AssociativeContainer::key_type __k; 00772 typename _AssociativeContainer::size_type __n; 00773 }; 00774 00775 template <class _UniqueAssociativeContainer> 00776 struct _UniqueAssociativeContainerConcept 00777 { 00778 void __constraints() { 00779 __function_requires< 00780 _AssociativeContainerConcept<_UniqueAssociativeContainer> >(); 00781 00782 _UniqueAssociativeContainer __c(__first, __last); 00783 00784 __pos_flag = __c.insert(__t); 00785 __c.insert(__first, __last); 00786 } 00787 std::pair<typename _UniqueAssociativeContainer::iterator, bool> __pos_flag; 00788 typename _UniqueAssociativeContainer::value_type __t; 00789 typename _UniqueAssociativeContainer::value_type *__first, *__last; 00790 }; 00791 00792 template <class _MultipleAssociativeContainer> 00793 struct _MultipleAssociativeContainerConcept 00794 { 00795 void __constraints() { 00796 __function_requires< 00797 _AssociativeContainerConcept<_MultipleAssociativeContainer> >(); 00798 00799 _MultipleAssociativeContainer __c(__first, __last); 00800 00801 __pos = __c.insert(__t); 00802 __c.insert(__first, __last); 00803 00804 } 00805 typename _MultipleAssociativeContainer::iterator __pos _IsUnused; 00806 typename _MultipleAssociativeContainer::value_type __t; 00807 typename _MultipleAssociativeContainer::value_type *__first, *__last; 00808 }; 00809 00810 template <class _SimpleAssociativeContainer> 00811 struct _SimpleAssociativeContainerConcept 00812 { 00813 void __constraints() { 00814 __function_requires< 00815 _AssociativeContainerConcept<_SimpleAssociativeContainer> >(); 00816 typedef typename _SimpleAssociativeContainer::key_type _Key_type; 00817 typedef typename _SimpleAssociativeContainer::value_type _Value_type; 00818 typedef typename _Aux_require_same<_Key_type, _Value_type>::_Type 00819 _Requqired; 00820 } 00821 }; 00822 00823 template <class _SimpleAssociativeContainer> 00824 struct _PairAssociativeContainerConcept 00825 { 00826 void __constraints() { 00827 __function_requires< 00828 _AssociativeContainerConcept<_SimpleAssociativeContainer> >(); 00829 typedef typename _SimpleAssociativeContainer::key_type _Key_type; 00830 typedef typename _SimpleAssociativeContainer::value_type _Value_type; 00831 typedef typename _SimpleAssociativeContainer::mapped_type _Mapped_type; 00832 typedef std::pair<const _Key_type, _Mapped_type> _Required_value_type; 00833 typedef typename _Aux_require_same<_Value_type, 00834 _Required_value_type>::_Type _Required; 00835 } 00836 }; 00837 00838 template <class _SortedAssociativeContainer> 00839 struct _SortedAssociativeContainerConcept 00840 { 00841 void __constraints() { 00842 __function_requires< 00843 _AssociativeContainerConcept<_SortedAssociativeContainer> >(); 00844 __function_requires< 00845 _ReversibleContainerConcept<_SortedAssociativeContainer> >(); 00846 00847 _SortedAssociativeContainer 00848 __c(__kc) _IsUnused, 00849 __c2(__first, __last) _IsUnused, 00850 __c3(__first, __last, __kc) _IsUnused; 00851 00852 __p = __c.upper_bound(__k); 00853 __p = __c.lower_bound(__k); 00854 __r = __c.equal_range(__k); 00855 00856 __c.insert(__p, __t); 00857 } 00858 void __const_constraints(const _SortedAssociativeContainer& __c) { 00859 __kc = __c.key_comp(); 00860 __vc = __c.value_comp(); 00861 00862 __cp = __c.upper_bound(__k); 00863 __cp = __c.lower_bound(__k); 00864 __cr = __c.equal_range(__k); 00865 } 00866 typename _SortedAssociativeContainer::key_compare __kc; 00867 typename _SortedAssociativeContainer::value_compare __vc; 00868 typename _SortedAssociativeContainer::value_type __t; 00869 typename _SortedAssociativeContainer::key_type __k; 00870 typedef typename _SortedAssociativeContainer::iterator _Iterator; 00871 typedef typename _SortedAssociativeContainer::const_iterator 00872 _Const_iterator; 00873 00874 _Iterator __p; 00875 _Const_iterator __cp; 00876 std::pair<_Iterator,_Iterator> __r; 00877 std::pair<_Const_iterator,_Const_iterator> __cr; 00878 typename _SortedAssociativeContainer::value_type *__first, *__last; 00879 }; 00880 00881 // HashedAssociativeContainer 00882 00883 } // namespace __gnu_cxx 00884 00885 #undef _IsUnused 00886 00887 #endif // _GLIBCPP_BOOST_CONCEPT_CHECK 00888 00889 Generated on Mon Apr 8 03:11:23 2002 for libstdc++-v3 Source by ![]() |