39 #ifndef _BOOST_CONCEPT_CHECK_H 
   40 #define _BOOST_CONCEPT_CHECK_H 1 
   42 #pragma GCC system_header 
   47 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
 
   49 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   51 #define _IsUnused __attribute__ ((__unused__)) 
   56 template <
class _Concept>
 
   57 inline void __function_requires()
 
   59   void (_Concept::*__x)() _IsUnused = &_Concept::__constraints;
 
   65 void __error_type_must_be_an_integer_type();
 
   66 void __error_type_must_be_an_unsigned_integer_type();
 
   67 void __error_type_must_be_a_signed_integer_type();
 
   70 #define _GLIBCXX_CLASS_REQUIRES(_type_var, _ns, _concept) \ 
   71   typedef void (_ns::_concept <_type_var>::* _func##_type_var##_concept)(); \ 
   72   template <_func##_type_var##_concept _Tp1> \ 
   73   struct _concept_checking##_type_var##_concept { }; \ 
   74   typedef _concept_checking##_type_var##_concept< \ 
   75     &_ns::_concept <_type_var>::__constraints> \ 
   76     _concept_checking_typedef##_type_var##_concept 
   78 #define _GLIBCXX_CLASS_REQUIRES2(_type_var1, _type_var2, _ns, _concept) \ 
   79   typedef void (_ns::_concept <_type_var1,_type_var2>::* _func##_type_var1##_type_var2##_concept)(); \ 
   80   template <_func##_type_var1##_type_var2##_concept _Tp1> \ 
   81   struct _concept_checking##_type_var1##_type_var2##_concept { }; \ 
   82   typedef _concept_checking##_type_var1##_type_var2##_concept< \ 
   83     &_ns::_concept <_type_var1,_type_var2>::__constraints> \ 
   84     _concept_checking_typedef##_type_var1##_type_var2##_concept 
   86 #define _GLIBCXX_CLASS_REQUIRES3(_type_var1, _type_var2, _type_var3, _ns, _concept) \ 
   87   typedef void (_ns::_concept <_type_var1,_type_var2,_type_var3>::* _func##_type_var1##_type_var2##_type_var3##_concept)(); \ 
   88   template <_func##_type_var1##_type_var2##_type_var3##_concept _Tp1> \ 
   89   struct _concept_checking##_type_var1##_type_var2##_type_var3##_concept { }; \ 
   90   typedef _concept_checking##_type_var1##_type_var2##_type_var3##_concept< \ 
   91     &_ns::_concept <_type_var1,_type_var2,_type_var3>::__constraints>  \ 
   92   _concept_checking_typedef##_type_var1##_type_var2##_type_var3##_concept 
   94 #define _GLIBCXX_CLASS_REQUIRES4(_type_var1, _type_var2, _type_var3, _type_var4, _ns, _concept) \ 
   95   typedef void (_ns::_concept <_type_var1,_type_var2,_type_var3,_type_var4>::* _func##_type_var1##_type_var2##_type_var3##_type_var4##_concept)(); \ 
   96   template <_func##_type_var1##_type_var2##_type_var3##_type_var4##_concept _Tp1> \ 
   97   struct _concept_checking##_type_var1##_type_var2##_type_var3##_type_var4##_concept { }; \ 
   98   typedef _concept_checking##_type_var1##_type_var2##_type_var3##_type_var4##_concept< \ 
   99   &_ns::_concept <_type_var1,_type_var2,_type_var3,_type_var4>::__constraints> \ 
  100     _concept_checking_typedef##_type_var1##_type_var2##_type_var3##_type_var4##_concept 
  103 template <
class _Tp1, 
class _Tp2>
 
  104 struct _Aux_require_same { };
 
  107 struct _Aux_require_same<_Tp,_Tp> { 
typedef _Tp _Type; };
 
  109   template <
class _Tp1, 
class _Tp2>
 
  110   struct _SameTypeConcept
 
  112     void __constraints() {
 
  113       typedef typename _Aux_require_same<_Tp1, _Tp2>::_Type _Required;
 
  118   struct _IntegerConcept {
 
  119     void __constraints() {
 
  120       __error_type_must_be_an_integer_type();
 
  123   template <> 
struct _IntegerConcept<short> { 
void __constraints() {} };
 
  124   template <> 
struct _IntegerConcept<unsigned short> { 
void __constraints(){} };
 
  125   template <> 
struct _IntegerConcept<int> { 
void __constraints() {} };
 
  126   template <> 
struct _IntegerConcept<unsigned int> { 
void __constraints() {} };
 
  127   template <> 
struct _IntegerConcept<long> { 
void __constraints() {} };
 
  128   template <> 
struct _IntegerConcept<unsigned long> { 
void __constraints() {} };
 
  129   template <> 
struct _IntegerConcept<long long> { 
void __constraints() {} };
 
  130   template <> 
struct _IntegerConcept<unsigned long long>
 
  131                                                 { 
void __constraints() {} };
 
  134   struct _SignedIntegerConcept {
 
  135     void __constraints() {
 
  136       __error_type_must_be_a_signed_integer_type();
 
  139   template <> 
struct _SignedIntegerConcept<short> { 
void __constraints() {} };
 
  140   template <> 
struct _SignedIntegerConcept<int> { 
void __constraints() {} };
 
  141   template <> 
struct _SignedIntegerConcept<long> { 
void __constraints() {} };
 
  142   template <> 
struct _SignedIntegerConcept<long long> { 
void __constraints(){}};
 
  145   struct _UnsignedIntegerConcept {
 
  146     void __constraints() {
 
  147       __error_type_must_be_an_unsigned_integer_type();
 
  150   template <> 
struct _UnsignedIntegerConcept<unsigned short>
 
  151     { 
void __constraints() {} };
 
  152   template <> 
struct _UnsignedIntegerConcept<unsigned int>
 
  153     { 
void __constraints() {} };
 
  154   template <> 
struct _UnsignedIntegerConcept<unsigned long>
 
  155     { 
void __constraints() {} };
 
  156   template <> 
struct _UnsignedIntegerConcept<unsigned long long>
 
  157     { 
void __constraints() {} };
 
  163   struct _DefaultConstructibleConcept
 
  165     void __constraints() {
 
  171   struct _AssignableConcept
 
  173     void __constraints() {
 
  175       __const_constraints(__a);
 
  177     void __const_constraints(
const _Tp& __b) {
 
  186   struct _CopyConstructibleConcept
 
  188     void __constraints() {
 
  190       _Tp* __ptr _IsUnused = &__a;      
 
  191       __const_constraints(__a);
 
  193     void __const_constraints(
const _Tp& __a) {
 
  194       _Tp __c _IsUnused(__a);           
 
  195       const _Tp* __ptr _IsUnused = &__a; 
 
  202   struct _SGIAssignableConcept
 
  204     void __constraints() {
 
  205       _Tp __b _IsUnused(__a);
 
  207       __const_constraints(__a);
 
  209     void __const_constraints(
const _Tp& __b) {
 
  210       _Tp __c _IsUnused(__b);
 
  216   template <
class _From, 
class _To>
 
  217   struct _ConvertibleConcept
 
  219     void __constraints() {
 
  220       _To __y _IsUnused = __x;
 
  235   void __aux_require_boolean_expr(
const _Tp& __t) {
 
  236     bool __x _IsUnused = __t;
 
  241   struct _EqualityComparableConcept
 
  243     void __constraints() {
 
  244       __aux_require_boolean_expr(__a == __b);
 
  250   struct _LessThanComparableConcept
 
  252     void __constraints() {
 
  253       __aux_require_boolean_expr(__a < __b);
 
  260   struct _ComparableConcept
 
  262     void __constraints() {
 
  263       __aux_require_boolean_expr(__a < __b);
 
  264       __aux_require_boolean_expr(__a > __b);
 
  265       __aux_require_boolean_expr(__a <= __b);
 
  266       __aux_require_boolean_expr(__a >= __b);
 
  271 #define _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(_OP,_NAME) \ 
  272   template <class _First, class _Second> \ 
  274     void __constraints() { (void)__constraints_(); } \ 
  275     bool __constraints_() {  \ 
  276       return  __a _OP __b; \ 
  282 #define _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(_OP,_NAME) \ 
  283   template <class _Ret, class _First, class _Second> \ 
  285     void __constraints() { (void)__constraints_(); } \ 
  286     _Ret __constraints_() {  \ 
  287       return __a _OP __b; \ 
  293   _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(==, _EqualOpConcept);
 
  294   _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(!=, _NotEqualOpConcept);
 
  295   _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<, _LessThanOpConcept);
 
  296   _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<=, _LessEqualOpConcept);
 
  297   _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>, _GreaterThanOpConcept);
 
  298   _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>=, _GreaterEqualOpConcept);
 
  300   _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(+, _PlusOpConcept);
 
  301   _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(*, _TimesOpConcept);
 
  302   _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(/, _DivideOpConcept);
 
  303   _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(-, _SubtractOpConcept);
 
  304   _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT(%, _ModOpConcept);
 
  306 #undef _GLIBCXX_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT 
  307 #undef _GLIBCXX_DEFINE_BINARY_OPERATOR_CONSTRAINT 
  312   template <
class _Func, 
class _Return>
 
  313   struct _GeneratorConcept
 
  315     void __constraints() {
 
  316       const _Return& __r _IsUnused = __f();
 
  322   template <
class _Func>
 
  323   struct _GeneratorConcept<_Func,void>
 
  325     void __constraints() {
 
  331   template <
class _Func, 
class _Return, 
class _Arg>
 
  332   struct _UnaryFunctionConcept
 
  334     void __constraints() {
 
  342   template <
class _Func, 
class _Arg>
 
  343   struct _UnaryFunctionConcept<_Func, void, _Arg> {
 
  344     void __constraints() {
 
  351   template <
class _Func, 
class _Return, 
class _First, 
class _Second>
 
  352   struct _BinaryFunctionConcept
 
  354     void __constraints() {
 
  355       __r = __f(__first, __second);     
 
  363   template <
class _Func, 
class _First, 
class _Second>
 
  364   struct _BinaryFunctionConcept<_Func, void, _First, _Second>
 
  366     void __constraints() {
 
  367       __f(__first, __second);           
 
  374   template <
class _Func, 
class _Arg>
 
  375   struct _UnaryPredicateConcept
 
  377     void __constraints() {
 
  378       __aux_require_boolean_expr(__f(__arg)); 
 
  384   template <
class _Func, 
class _First, 
class _Second>
 
  385   struct _BinaryPredicateConcept
 
  387     void __constraints() {
 
  388       __aux_require_boolean_expr(__f(__a, __b)); 
 
  396   template <
class _Func, 
class _First, 
class _Second>
 
  397   struct _Const_BinaryPredicateConcept {
 
  398     void __constraints() {
 
  399       __const_constraints(__f);
 
  401     void __const_constraints(
const _Func& __fun) {
 
  402       __function_requires<_BinaryPredicateConcept<_Func, _First, _Second> >();
 
  404       __aux_require_boolean_expr(__fun(__a, __b));
 
  415   struct _TrivialIteratorConcept
 
  417     void __constraints() {
 
  419       __function_requires< _AssignableConcept<_Tp> >();
 
  420       __function_requires< _EqualityComparableConcept<_Tp> >();
 
  428   struct _Mutable_TrivialIteratorConcept
 
  430     void __constraints() {
 
  431       __function_requires< _TrivialIteratorConcept<_Tp> >();
 
  438   struct _InputIteratorConcept
 
  440     void __constraints() {
 
  441       __function_requires< _TrivialIteratorConcept<_Tp> >();
 
  443       typedef typename std::iterator_traits<_Tp>::difference_type _Diff;
 
  445       typedef typename std::iterator_traits<_Tp>::reference _Ref;
 
  446       typedef typename std::iterator_traits<_Tp>::pointer _Pt;
 
  447       typedef typename std::iterator_traits<_Tp>::iterator_category _Cat;
 
  448       __function_requires< _ConvertibleConcept<
 
  449         typename std::iterator_traits<_Tp>::iterator_category,
 
  457   template <
class _Tp, 
class _ValueT>
 
  458   struct _OutputIteratorConcept
 
  460     void __constraints() {
 
  461       __function_requires< _AssignableConcept<_Tp> >();
 
  471   struct _ForwardIteratorConcept
 
  473     void __constraints() {
 
  474       __function_requires< _InputIteratorConcept<_Tp> >();
 
  475       __function_requires< _DefaultConstructibleConcept<_Tp> >();
 
  476       __function_requires< _ConvertibleConcept<
 
  477         typename std::iterator_traits<_Tp>::iterator_category,
 
  479       typedef typename std::iterator_traits<_Tp>::reference _Ref;
 
  480       _Ref __r _IsUnused = *__i;
 
  486   struct _Mutable_ForwardIteratorConcept
 
  488     void __constraints() {
 
  489       __function_requires< _ForwardIteratorConcept<_Tp> >();
 
  496   struct _BidirectionalIteratorConcept
 
  498     void __constraints() {
 
  499       __function_requires< _ForwardIteratorConcept<_Tp> >();
 
  500       __function_requires< _ConvertibleConcept<
 
  501         typename std::iterator_traits<_Tp>::iterator_category,
 
  510   struct _Mutable_BidirectionalIteratorConcept
 
  512     void __constraints() {
 
  513       __function_requires< _BidirectionalIteratorConcept<_Tp> >();
 
  514       __function_requires< _Mutable_ForwardIteratorConcept<_Tp> >();
 
  522   struct _RandomAccessIteratorConcept
 
  524     void __constraints() {
 
  525       __function_requires< _BidirectionalIteratorConcept<_Tp> >();
 
  526       __function_requires< _ComparableConcept<_Tp> >();
 
  527       __function_requires< _ConvertibleConcept<
 
  528         typename std::iterator_traits<_Tp>::iterator_category,
 
  531       typedef typename std::iterator_traits<_Tp>::reference _Ref;
 
  534       __i = __i + __n; __i = __n + __i; 
 
  543     typename std::iterator_traits<_Tp>::difference_type __n;
 
  547   struct _Mutable_RandomAccessIteratorConcept
 
  549     void __constraints() {
 
  550       __function_requires< _RandomAccessIteratorConcept<_Tp> >();
 
  551       __function_requires< _Mutable_BidirectionalIteratorConcept<_Tp> >();
 
  555     typename std::iterator_traits<_Tp>::difference_type __n;
 
  561   template <
class _Container>
 
  562   struct _ContainerConcept
 
  564     typedef typename _Container::value_type _Value_type;
 
  565     typedef typename _Container::difference_type _Difference_type;
 
  566     typedef typename _Container::size_type _Size_type;
 
  567     typedef typename _Container::const_reference _Const_reference;
 
  568     typedef typename _Container::const_pointer _Const_pointer;
 
  569     typedef typename _Container::const_iterator _Const_iterator;
 
  571     void __constraints() {
 
  572       __function_requires< _InputIteratorConcept<_Const_iterator> >();
 
  573       __function_requires< _AssignableConcept<_Container> >();
 
  574       const _Container __c;
 
  578       __n = __c.max_size();
 
  586   template <
class _Container>
 
  587   struct _Mutable_ContainerConcept
 
  589     typedef typename _Container::value_type _Value_type;
 
  590     typedef typename _Container::reference _Reference;
 
  591     typedef typename _Container::iterator _Iterator;
 
  592     typedef typename _Container::pointer _Pointer;
 
  594     void __constraints() {
 
  595       __function_requires< _ContainerConcept<_Container> >();
 
  596       __function_requires< _AssignableConcept<_Value_type> >();
 
  597       __function_requires< _InputIteratorConcept<_Iterator> >();
 
  604     _Container __c, __c2;
 
  607   template <
class _ForwardContainer>
 
  608   struct _ForwardContainerConcept
 
  610     void __constraints() {
 
  611       __function_requires< _ContainerConcept<_ForwardContainer> >();
 
  612       typedef typename _ForwardContainer::const_iterator _Const_iterator;
 
  613       __function_requires< _ForwardIteratorConcept<_Const_iterator> >();
 
  617   template <
class _ForwardContainer>
 
  618   struct _Mutable_ForwardContainerConcept
 
  620     void __constraints() {
 
  621       __function_requires< _ForwardContainerConcept<_ForwardContainer> >();
 
  622       __function_requires< _Mutable_ContainerConcept<_ForwardContainer> >();
 
  623       typedef typename _ForwardContainer::iterator _Iterator;
 
  624       __function_requires< _Mutable_ForwardIteratorConcept<_Iterator> >();
 
  628   template <
class _ReversibleContainer>
 
  629   struct _ReversibleContainerConcept
 
  631     typedef typename _ReversibleContainer::const_iterator _Const_iterator;
 
  632     typedef typename _ReversibleContainer::const_reverse_iterator
 
  633       _Const_reverse_iterator;
 
  635     void __constraints() {
 
  636       __function_requires< _ForwardContainerConcept<_ReversibleContainer> >();
 
  637       __function_requires< _BidirectionalIteratorConcept<_Const_iterator> >();
 
  639         _BidirectionalIteratorConcept<_Const_reverse_iterator> >();
 
  641       const _ReversibleContainer __c;
 
  642       _Const_reverse_iterator __i = __c.rbegin();
 
  647   template <
class _ReversibleContainer>
 
  648   struct _Mutable_ReversibleContainerConcept
 
  650     typedef typename _ReversibleContainer::iterator _Iterator;
 
  651     typedef typename _ReversibleContainer::reverse_iterator _Reverse_iterator;
 
  653     void __constraints() {
 
  654       __function_requires<_ReversibleContainerConcept<_ReversibleContainer> >();
 
  656         _Mutable_ForwardContainerConcept<_ReversibleContainer> >();
 
  657       __function_requires<_Mutable_BidirectionalIteratorConcept<_Iterator> >();
 
  659         _Mutable_BidirectionalIteratorConcept<_Reverse_iterator> >();
 
  661       _Reverse_iterator __i = __c.rbegin();
 
  664     _ReversibleContainer __c;
 
  667   template <
class _RandomAccessContainer>
 
  668   struct _RandomAccessContainerConcept
 
  670     typedef typename _RandomAccessContainer::size_type _Size_type;
 
  671     typedef typename _RandomAccessContainer::const_reference _Const_reference;
 
  672     typedef typename _RandomAccessContainer::const_iterator _Const_iterator;
 
  673     typedef typename _RandomAccessContainer::const_reverse_iterator
 
  674       _Const_reverse_iterator;
 
  676     void __constraints() {
 
  678         _ReversibleContainerConcept<_RandomAccessContainer> >();
 
  679       __function_requires< _RandomAccessIteratorConcept<_Const_iterator> >();
 
  681         _RandomAccessIteratorConcept<_Const_reverse_iterator> >();
 
  683       const _RandomAccessContainer __c;
 
  684       _Const_reference __r _IsUnused = __c[__n];
 
  689   template <
class _RandomAccessContainer>
 
  690   struct _Mutable_RandomAccessContainerConcept
 
  692     typedef typename _RandomAccessContainer::size_type _Size_type;
 
  693     typedef typename _RandomAccessContainer::reference _Reference;
 
  694     typedef typename _RandomAccessContainer::iterator _Iterator;
 
  695     typedef typename _RandomAccessContainer::reverse_iterator _Reverse_iterator;
 
  697     void __constraints() {
 
  699         _RandomAccessContainerConcept<_RandomAccessContainer> >();
 
  701         _Mutable_ReversibleContainerConcept<_RandomAccessContainer> >();
 
  702       __function_requires< _Mutable_RandomAccessIteratorConcept<_Iterator> >();
 
  704         _Mutable_RandomAccessIteratorConcept<_Reverse_iterator> >();
 
  706       _Reference __r _IsUnused = __c[__i];
 
  709     _RandomAccessContainer __c;
 
  713   template <
class _Sequence>
 
  714   struct _SequenceConcept
 
  716     typedef typename _Sequence::reference _Reference;
 
  717     typedef typename _Sequence::const_reference _Const_reference;
 
  719     void __constraints() {
 
  723       __function_requires< _Mutable_ForwardContainerConcept<_Sequence> >();
 
  724       __function_requires< _DefaultConstructibleConcept<_Sequence> >();
 
  727     __c _IsUnused(__n, __t),
 
  728         __c2 _IsUnused(__first, __last);
 
  730       __c.insert(__p, __t);
 
  731       __c.insert(__p, __n, __t);
 
  732       __c.insert(__p, __first, __last);
 
  737       _Reference __r _IsUnused = __c.front();
 
  739       __const_constraints(__c);
 
  741     void __const_constraints(
const _Sequence& __c) {
 
  742       _Const_reference __r _IsUnused = __c.front();
 
  744     typename _Sequence::value_type __t;
 
  745     typename _Sequence::size_type __n;
 
  746     typename _Sequence::value_type *__first, *__last;
 
  747     typename _Sequence::iterator __p, __q;
 
  750   template <
class _FrontInsertionSequence>
 
  751   struct _FrontInsertionSequenceConcept
 
  753     void __constraints() {
 
  754       __function_requires< _SequenceConcept<_FrontInsertionSequence> >();
 
  759     _FrontInsertionSequence __c;
 
  760     typename _FrontInsertionSequence::value_type __t;
 
  763   template <
class _BackInsertionSequence>
 
  764   struct _BackInsertionSequenceConcept
 
  766     typedef typename _BackInsertionSequence::reference _Reference;
 
  767     typedef typename _BackInsertionSequence::const_reference _Const_reference;
 
  769     void __constraints() {
 
  770       __function_requires< _SequenceConcept<_BackInsertionSequence> >();
 
  774       _Reference __r _IsUnused = __c.back();
 
  776     void __const_constraints(
const _BackInsertionSequence& __c) {
 
  777       _Const_reference __r _IsUnused = __c.back();
 
  779     _BackInsertionSequence __c;
 
  780     typename _BackInsertionSequence::value_type __t;
 
  783 _GLIBCXX_END_NAMESPACE_VERSION
 
  788 #endif // _GLIBCXX_BOOST_CONCEPT_CHECK 
GNU extensions for public use. 
Forward iterators support a superset of input iterator operations. 
Bidirectional iterators support a superset of forward iterator operations. 
Random-access iterators support a superset of bidirectional iterator operations.