| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082 | //// (C) Copyright Jeremy Siek 2000.// Copyright 2002 The Trustees of Indiana University.//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// Revision History://   05 May   2001: Workarounds for HP aCC from Thomas Matelich. (Jeremy Siek)//   02 April 2001: Removed limits header altogether. (Jeremy Siek)//   01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock)//// See http://www.boost.org/libs/concept_check for documentation.#ifndef BOOST_CONCEPT_CHECKS_HPP# define BOOST_CONCEPT_CHECKS_HPP# include <boost/concept/assert.hpp># include <iterator># include <boost/type_traits/conversion_traits.hpp># include <utility># include <boost/type_traits/is_same.hpp># include <boost/type_traits/is_void.hpp># include <boost/static_assert.hpp># include <boost/type_traits/integral_constant.hpp># include <boost/config/workaround.hpp># include <boost/concept/usage.hpp># include <boost/concept/detail/concept_def.hpp>#if (defined _MSC_VER)# pragma warning( push )# pragma warning( disable : 4510 ) // default constructor could not be generated# pragma warning( disable : 4610 ) // object 'class' can never be instantiated - user-defined constructor required#endifnamespace boost{  //  // Backward compatibility  //  template <class Model>  inline void function_requires(Model* = 0)  {      BOOST_CONCEPT_ASSERT((Model));  }  template <class T> inline void ignore_unused_variable_warning(T const&) {}#  define BOOST_CLASS_REQUIRE(type_var, ns, concept)    \    BOOST_CONCEPT_ASSERT((ns::concept<type_var>))#  define BOOST_CLASS_REQUIRE2(type_var1, type_var2, ns, concept)   \    BOOST_CONCEPT_ASSERT((ns::concept<type_var1,type_var2>))#  define BOOST_CLASS_REQUIRE3(tv1, tv2, tv3, ns, concept)  \    BOOST_CONCEPT_ASSERT((ns::concept<tv1,tv2,tv3>))#  define BOOST_CLASS_REQUIRE4(tv1, tv2, tv3, tv4, ns, concept) \    BOOST_CONCEPT_ASSERT((ns::concept<tv1,tv2,tv3,tv4>))  //  // Begin concept definitions  //  BOOST_concept(Integer, (T))  {      BOOST_CONCEPT_USAGE(Integer)        {            x.error_type_must_be_an_integer_type();        }   private:      T x;  };  template <> struct Integer<char> {};  template <> struct Integer<signed char> {};  template <> struct Integer<unsigned char> {};  template <> struct Integer<short> {};  template <> struct Integer<unsigned short> {};  template <> struct Integer<int> {};  template <> struct Integer<unsigned int> {};  template <> struct Integer<long> {};  template <> struct Integer<unsigned long> {};# if defined(BOOST_HAS_LONG_LONG)  template <> struct Integer< ::boost::long_long_type> {};  template <> struct Integer< ::boost::ulong_long_type> {};# elif defined(BOOST_HAS_MS_INT64)  template <> struct Integer<__int64> {};  template <> struct Integer<unsigned __int64> {};# endif  BOOST_concept(SignedInteger,(T)) {    BOOST_CONCEPT_USAGE(SignedInteger) {      x.error_type_must_be_a_signed_integer_type();    }   private:    T x;  };  template <> struct SignedInteger<signed char> { };  template <> struct SignedInteger<short> {};  template <> struct SignedInteger<int> {};  template <> struct SignedInteger<long> {};# if defined(BOOST_HAS_LONG_LONG)  template <> struct SignedInteger< ::boost::long_long_type> {};# elif defined(BOOST_HAS_MS_INT64)  template <> struct SignedInteger<__int64> {};# endif  BOOST_concept(UnsignedInteger,(T)) {    BOOST_CONCEPT_USAGE(UnsignedInteger) {      x.error_type_must_be_an_unsigned_integer_type();    }   private:    T x;  };  template <> struct UnsignedInteger<unsigned char> {};  template <> struct UnsignedInteger<unsigned short> {};  template <> struct UnsignedInteger<unsigned int> {};  template <> struct UnsignedInteger<unsigned long> {};# if defined(BOOST_HAS_LONG_LONG)  template <> struct UnsignedInteger< ::boost::ulong_long_type> {};# elif defined(BOOST_HAS_MS_INT64)  template <> struct UnsignedInteger<unsigned __int64> {};# endif  //===========================================================================  // Basic Concepts  BOOST_concept(DefaultConstructible,(TT))  {    BOOST_CONCEPT_USAGE(DefaultConstructible) {      TT a;               // require default constructor      ignore_unused_variable_warning(a);    }  };  BOOST_concept(Assignable,(TT))  {    BOOST_CONCEPT_USAGE(Assignable) {#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL      a = b;             // require assignment operator#endif      const_constraints(b);    }   private:    void const_constraints(const TT& x) {#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL      a = x;              // const required for argument to assignment#else      ignore_unused_variable_warning(x);#endif    }   private:    TT a;    TT b;  };  BOOST_concept(CopyConstructible,(TT))  {    BOOST_CONCEPT_USAGE(CopyConstructible) {      TT a(b);            // require copy constructor      TT* ptr = &a;       // require address of operator      const_constraints(a);      ignore_unused_variable_warning(ptr);    }   private:    void const_constraints(const TT& a) {      TT c(a);            // require const copy constructor      const TT* ptr = &a; // require const address of operator      ignore_unused_variable_warning(c);      ignore_unused_variable_warning(ptr);    }    TT b;  };  // The SGI STL version of Assignable requires copy constructor and operator=  BOOST_concept(SGIAssignable,(TT))  {    BOOST_CONCEPT_USAGE(SGIAssignable) {      TT c(a);#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL      a = b;              // require assignment operator#endif      const_constraints(b);      ignore_unused_variable_warning(c);    }   private:    void const_constraints(const TT& x) {      TT c(x);#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL      a = x;              // const required for argument to assignment#endif      ignore_unused_variable_warning(c);    }    TT a;    TT b;  };  BOOST_concept(Convertible,(X)(Y))  {    BOOST_CONCEPT_USAGE(Convertible) {      Y y = x;      ignore_unused_variable_warning(y);    }   private:    X x;  };  // The C++ standard requirements for many concepts talk about return  // types that must be "convertible to bool".  The problem with this  // requirement is that it leaves the door open for evil proxies that  // define things like operator|| with strange return types.  Two  // possible solutions are:  // 1) require the return type to be exactly bool  // 2) stay with convertible to bool, and also  //    specify stuff about all the logical operators.  // For now we just test for convertible to bool.  template <class TT>  void require_boolean_expr(const TT& t) {    bool x = t;    ignore_unused_variable_warning(x);  }  BOOST_concept(EqualityComparable,(TT))  {    BOOST_CONCEPT_USAGE(EqualityComparable) {      require_boolean_expr(a == b);      require_boolean_expr(a != b);    }   private:    TT a, b;  };  BOOST_concept(LessThanComparable,(TT))  {    BOOST_CONCEPT_USAGE(LessThanComparable) {      require_boolean_expr(a < b);    }   private:    TT a, b;  };  // This is equivalent to SGI STL's LessThanComparable.  BOOST_concept(Comparable,(TT))  {    BOOST_CONCEPT_USAGE(Comparable) {      require_boolean_expr(a < b);      require_boolean_expr(a > b);      require_boolean_expr(a <= b);      require_boolean_expr(a >= b);    }   private:    TT a, b;  };#define BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(OP,NAME)    \  BOOST_concept(NAME, (First)(Second))                          \  {                                                             \      BOOST_CONCEPT_USAGE(NAME) { (void)constraints_(); }                         \     private:                                                   \        bool constraints_() { return a OP b; }                  \        First a;                                                \        Second b;                                               \  }#define BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(OP,NAME)    \  BOOST_concept(NAME, (Ret)(First)(Second))                 \  {                                                         \      BOOST_CONCEPT_USAGE(NAME) { (void)constraints_(); }                     \  private:                                                  \      Ret constraints_() { return a OP b; }                 \      First a;                                              \      Second b;                                             \  }  BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(==, EqualOp);  BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(!=, NotEqualOp);  BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<, LessThanOp);  BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<=, LessEqualOp);  BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>, GreaterThanOp);  BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>=, GreaterEqualOp);  BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(+, PlusOp);  BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(*, TimesOp);  BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(/, DivideOp);  BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(-, SubtractOp);  BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(%, ModOp);  //===========================================================================  // Function Object Concepts  BOOST_concept(Generator,(Func)(Return))  {      BOOST_CONCEPT_USAGE(Generator) { test(is_void<Return>()); }   private:      void test(boost::false_type)      {          // Do we really want a reference here?          const Return& r = f();          ignore_unused_variable_warning(r);      }      void test(boost::true_type)      {          f();      }      Func f;  };  BOOST_concept(UnaryFunction,(Func)(Return)(Arg))  {      BOOST_CONCEPT_USAGE(UnaryFunction) { test(is_void<Return>()); }   private:      void test(boost::false_type)      {          f(arg);               // "priming the pump" this way keeps msvc6 happy (ICE)          Return r = f(arg);          ignore_unused_variable_warning(r);      }      void test(boost::true_type)      {          f(arg);      }#if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \                      && BOOST_WORKAROUND(__GNUC__, > 3)))      // Declare a dummy constructor to make gcc happy.      // It seems the compiler can not generate a sensible constructor when this is instantiated with a reference type.      // (warning: non-static reference "const double& boost::UnaryFunction<YourClassHere>::arg"      // in class without a constructor [-Wuninitialized])      UnaryFunction();#endif      Func f;      Arg arg;  };  BOOST_concept(BinaryFunction,(Func)(Return)(First)(Second))  {      BOOST_CONCEPT_USAGE(BinaryFunction) { test(is_void<Return>()); }   private:      void test(boost::false_type)      {          f(first,second);          Return r = f(first, second); // require operator()          (void)r;      }      void test(boost::true_type)      {          f(first,second);      }#if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \                      && BOOST_WORKAROUND(__GNUC__, > 3)))      // Declare a dummy constructor to make gcc happy.      // It seems the compiler can not generate a sensible constructor when this is instantiated with a reference type.      // (warning: non-static reference "const double& boost::BinaryFunction<YourClassHere>::arg"      // in class without a constructor [-Wuninitialized])      BinaryFunction();#endif      Func f;      First first;      Second second;  };  BOOST_concept(UnaryPredicate,(Func)(Arg))  {    BOOST_CONCEPT_USAGE(UnaryPredicate) {      require_boolean_expr(f(arg)); // require operator() returning bool    }   private:#if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \                      && BOOST_WORKAROUND(__GNUC__, > 3)))      // Declare a dummy constructor to make gcc happy.      // It seems the compiler can not generate a sensible constructor when this is instantiated with a reference type.      // (warning: non-static reference "const double& boost::UnaryPredicate<YourClassHere>::arg"      // in class without a constructor [-Wuninitialized])      UnaryPredicate();#endif    Func f;    Arg arg;  };  BOOST_concept(BinaryPredicate,(Func)(First)(Second))  {    BOOST_CONCEPT_USAGE(BinaryPredicate) {      require_boolean_expr(f(a, b)); // require operator() returning bool    }   private:#if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \                      && BOOST_WORKAROUND(__GNUC__, > 3)))      // Declare a dummy constructor to make gcc happy.      // It seems the compiler can not generate a sensible constructor when this is instantiated with a reference type.      // (warning: non-static reference "const double& boost::BinaryPredicate<YourClassHere>::arg"      // in class without a constructor [-Wuninitialized])      BinaryPredicate();#endif    Func f;    First a;    Second b;  };  // use this when functor is used inside a container class like std::set  BOOST_concept(Const_BinaryPredicate,(Func)(First)(Second))    : BinaryPredicate<Func, First, Second>  {    BOOST_CONCEPT_USAGE(Const_BinaryPredicate) {      const_constraints(f);    }   private:    void const_constraints(const Func& fun) {      // operator() must be a const member function      require_boolean_expr(fun(a, b));    }#if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \                      && BOOST_WORKAROUND(__GNUC__, > 3)))      // Declare a dummy constructor to make gcc happy.      // It seems the compiler can not generate a sensible constructor when this is instantiated with a reference type.      // (warning: non-static reference "const double& boost::Const_BinaryPredicate<YourClassHere>::arg"      // in class without a constructor [-Wuninitialized])      Const_BinaryPredicate();#endif    Func f;    First a;    Second b;  };  BOOST_concept(AdaptableGenerator,(Func)(Return))    : Generator<Func, typename Func::result_type>  {      typedef typename Func::result_type result_type;      BOOST_CONCEPT_USAGE(AdaptableGenerator)      {          BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));      }  };  BOOST_concept(AdaptableUnaryFunction,(Func)(Return)(Arg))    : UnaryFunction<Func, typename Func::result_type, typename Func::argument_type>  {      typedef typename Func::argument_type argument_type;      typedef typename Func::result_type result_type;      ~AdaptableUnaryFunction()      {          BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));          BOOST_CONCEPT_ASSERT((Convertible<Arg, argument_type>));      }  };  BOOST_concept(AdaptableBinaryFunction,(Func)(Return)(First)(Second))    : BinaryFunction<          Func        , typename Func::result_type        , typename Func::first_argument_type        , typename Func::second_argument_type      >  {      typedef typename Func::first_argument_type first_argument_type;      typedef typename Func::second_argument_type second_argument_type;      typedef typename Func::result_type result_type;      ~AdaptableBinaryFunction()      {          BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));          BOOST_CONCEPT_ASSERT((Convertible<First, first_argument_type>));          BOOST_CONCEPT_ASSERT((Convertible<Second, second_argument_type>));      }  };  BOOST_concept(AdaptablePredicate,(Func)(Arg))    : UnaryPredicate<Func, Arg>    , AdaptableUnaryFunction<Func, bool, Arg>  {  };  BOOST_concept(AdaptableBinaryPredicate,(Func)(First)(Second))    : BinaryPredicate<Func, First, Second>    , AdaptableBinaryFunction<Func, bool, First, Second>  {  };  //===========================================================================  // Iterator Concepts  BOOST_concept(InputIterator,(TT))    : Assignable<TT>    , EqualityComparable<TT>  {      typedef typename std::iterator_traits<TT>::value_type value_type;      typedef typename std::iterator_traits<TT>::difference_type difference_type;      typedef typename std::iterator_traits<TT>::reference reference;      typedef typename std::iterator_traits<TT>::pointer pointer;      typedef typename std::iterator_traits<TT>::iterator_category iterator_category;      BOOST_CONCEPT_USAGE(InputIterator)      {        BOOST_CONCEPT_ASSERT((SignedInteger<difference_type>));        BOOST_CONCEPT_ASSERT((Convertible<iterator_category, std::input_iterator_tag>));        TT j(i);        (void)*i;           // require dereference operator        ++j;                // require preincrement operator        i++;                // require postincrement operator      }   private:    TT i;  };  BOOST_concept(OutputIterator,(TT)(ValueT))    : Assignable<TT>  {    BOOST_CONCEPT_USAGE(OutputIterator) {      ++i;                // require preincrement operator      i++;                // require postincrement operator      *i++ = t;           // require postincrement and assignment    }   private:    TT i, j;    ValueT t;  };  BOOST_concept(ForwardIterator,(TT))    : InputIterator<TT>  {      BOOST_CONCEPT_USAGE(ForwardIterator)      {          BOOST_CONCEPT_ASSERT((Convertible<              BOOST_DEDUCED_TYPENAME ForwardIterator::iterator_category            , std::forward_iterator_tag          >));          typename InputIterator<TT>::reference r = *i;          ignore_unused_variable_warning(r);      }   private:      TT i;  };  BOOST_concept(Mutable_ForwardIterator,(TT))    : ForwardIterator<TT>  {      BOOST_CONCEPT_USAGE(Mutable_ForwardIterator) {        *i++ = *j;         // require postincrement and assignment      }   private:      TT i, j;  };  BOOST_concept(BidirectionalIterator,(TT))    : ForwardIterator<TT>  {      BOOST_CONCEPT_USAGE(BidirectionalIterator)      {          BOOST_CONCEPT_ASSERT((Convertible<              BOOST_DEDUCED_TYPENAME BidirectionalIterator::iterator_category            , std::bidirectional_iterator_tag          >));          --i;                // require predecrement operator          i--;                // require postdecrement operator      }   private:      TT i;  };  BOOST_concept(Mutable_BidirectionalIterator,(TT))    : BidirectionalIterator<TT>    , Mutable_ForwardIterator<TT>  {      BOOST_CONCEPT_USAGE(Mutable_BidirectionalIterator)      {          *i-- = *j;                  // require postdecrement and assignment      }   private:      TT i, j;  };  BOOST_concept(RandomAccessIterator,(TT))    : BidirectionalIterator<TT>    , Comparable<TT>  {      BOOST_CONCEPT_USAGE(RandomAccessIterator)      {          BOOST_CONCEPT_ASSERT((Convertible<              BOOST_DEDUCED_TYPENAME BidirectionalIterator<TT>::iterator_category            , std::random_access_iterator_tag          >));          i += n;             // require assignment addition operator          i = i + n; i = n + i; // require addition with difference type          i -= n;             // require assignment subtraction operator          i = i - n;                  // require subtraction with difference type          n = i - j;                  // require difference operator          (void)i[n];                 // require element access operator      }   private:    TT a, b;    TT i, j;      typename std::iterator_traits<TT>::difference_type n;  };  BOOST_concept(Mutable_RandomAccessIterator,(TT))    : RandomAccessIterator<TT>    , Mutable_BidirectionalIterator<TT>  {      BOOST_CONCEPT_USAGE(Mutable_RandomAccessIterator)      {          i[n] = *i;                  // require element access and assignment      }   private:    TT i;    typename std::iterator_traits<TT>::difference_type n;  };  //===========================================================================  // Container s  BOOST_concept(Container,(C))    : Assignable<C>  {    typedef typename C::value_type value_type;    typedef typename C::difference_type difference_type;    typedef typename C::size_type size_type;    typedef typename C::const_reference const_reference;    typedef typename C::const_pointer const_pointer;    typedef typename C::const_iterator const_iterator;      BOOST_CONCEPT_USAGE(Container)      {          BOOST_CONCEPT_ASSERT((InputIterator<const_iterator>));          const_constraints(c);      }   private:      void const_constraints(const C& cc) {          i = cc.begin();          i = cc.end();          n = cc.size();          n = cc.max_size();          b = cc.empty();      }      C c;      bool b;      const_iterator i;      size_type n;  };  BOOST_concept(Mutable_Container,(C))    : Container<C>  {      typedef typename C::reference reference;      typedef typename C::iterator iterator;      typedef typename C::pointer pointer;      BOOST_CONCEPT_USAGE(Mutable_Container)      {          BOOST_CONCEPT_ASSERT((               Assignable<typename Mutable_Container::value_type>));          BOOST_CONCEPT_ASSERT((InputIterator<iterator>));          i = c.begin();          i = c.end();          c.swap(c2);      }   private:      iterator i;      C c, c2;  };  BOOST_concept(ForwardContainer,(C))    : Container<C>  {      BOOST_CONCEPT_USAGE(ForwardContainer)      {          BOOST_CONCEPT_ASSERT((               ForwardIterator<                    typename ForwardContainer::const_iterator               >));      }  };  BOOST_concept(Mutable_ForwardContainer,(C))    : ForwardContainer<C>    , Mutable_Container<C>  {      BOOST_CONCEPT_USAGE(Mutable_ForwardContainer)      {          BOOST_CONCEPT_ASSERT((               Mutable_ForwardIterator<                   typename Mutable_ForwardContainer::iterator               >));      }  };  BOOST_concept(ReversibleContainer,(C))    : ForwardContainer<C>  {      typedef typename        C::const_reverse_iterator      const_reverse_iterator;      BOOST_CONCEPT_USAGE(ReversibleContainer)      {          BOOST_CONCEPT_ASSERT((              BidirectionalIterator<                  typename ReversibleContainer::const_iterator>));          BOOST_CONCEPT_ASSERT((BidirectionalIterator<const_reverse_iterator>));          const_constraints(c);      }   private:      void const_constraints(const C& cc)      {          const_reverse_iterator _i = cc.rbegin();          _i = cc.rend();      }      C c;  };  BOOST_concept(Mutable_ReversibleContainer,(C))    : Mutable_ForwardContainer<C>    , ReversibleContainer<C>  {      typedef typename C::reverse_iterator reverse_iterator;      BOOST_CONCEPT_USAGE(Mutable_ReversibleContainer)      {          typedef typename Mutable_ForwardContainer<C>::iterator iterator;          BOOST_CONCEPT_ASSERT((Mutable_BidirectionalIterator<iterator>));          BOOST_CONCEPT_ASSERT((Mutable_BidirectionalIterator<reverse_iterator>));          reverse_iterator i = c.rbegin();          i = c.rend();      }   private:      C c;  };  BOOST_concept(RandomAccessContainer,(C))    : ReversibleContainer<C>  {      typedef typename C::size_type size_type;      typedef typename C::const_reference const_reference;      BOOST_CONCEPT_USAGE(RandomAccessContainer)      {          BOOST_CONCEPT_ASSERT((              RandomAccessIterator<                  typename RandomAccessContainer::const_iterator              >));          const_constraints(c);      }   private:      void const_constraints(const C& cc)      {          const_reference r = cc[n];          ignore_unused_variable_warning(r);      }      C c;      size_type n;  };  BOOST_concept(Mutable_RandomAccessContainer,(C))    : Mutable_ReversibleContainer<C>    , RandomAccessContainer<C>  {   private:      typedef Mutable_RandomAccessContainer self;   public:      BOOST_CONCEPT_USAGE(Mutable_RandomAccessContainer)      {          BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<typename self::iterator>));          BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<typename self::reverse_iterator>));          typename self::reference r = c[i];          ignore_unused_variable_warning(r);      }   private:      typename Mutable_ReversibleContainer<C>::size_type i;      C c;  };  // A Sequence is inherently mutable  BOOST_concept(Sequence,(S))    : Mutable_ForwardContainer<S>      // Matt Austern's book puts DefaultConstructible here, the C++      // standard places it in Container --JGS      // ... so why aren't we following the standard?  --DWA    , DefaultConstructible<S>  {      BOOST_CONCEPT_USAGE(Sequence)      {          S              c(n, t),              c2(first, last);          c.insert(p, t);          c.insert(p, n, t);          c.insert(p, first, last);          c.erase(p);          c.erase(p, q);          typename Sequence::reference r = c.front();          ignore_unused_variable_warning(c);          ignore_unused_variable_warning(c2);          ignore_unused_variable_warning(r);          const_constraints(c);      }   private:      void const_constraints(const S& c) {          typename Sequence::const_reference r = c.front();          ignore_unused_variable_warning(r);      }      typename S::value_type t;      typename S::size_type n;      typename S::value_type* first, *last;      typename S::iterator p, q;  };  BOOST_concept(FrontInsertionSequence,(S))    : Sequence<S>  {      BOOST_CONCEPT_USAGE(FrontInsertionSequence)      {          c.push_front(t);          c.pop_front();      }   private:      S c;      typename S::value_type t;  };  BOOST_concept(BackInsertionSequence,(S))    : Sequence<S>  {      BOOST_CONCEPT_USAGE(BackInsertionSequence)      {          c.push_back(t);          c.pop_back();          typename BackInsertionSequence::reference r = c.back();          ignore_unused_variable_warning(r);          const_constraints(c);      }   private:      void const_constraints(const S& cc) {          typename BackInsertionSequence::const_reference              r = cc.back();          ignore_unused_variable_warning(r);      }      S c;      typename S::value_type t;  };  BOOST_concept(AssociativeContainer,(C))    : ForwardContainer<C>    , DefaultConstructible<C>  {      typedef typename C::key_type key_type;      typedef typename C::key_compare key_compare;      typedef typename C::value_compare value_compare;      typedef typename C::iterator iterator;      BOOST_CONCEPT_USAGE(AssociativeContainer)      {          i = c.find(k);          r = c.equal_range(k);          c.erase(k);          c.erase(i);          c.erase(r.first, r.second);          const_constraints(c);          BOOST_CONCEPT_ASSERT((BinaryPredicate<key_compare,key_type,key_type>));          typedef typename AssociativeContainer::value_type value_type_;          BOOST_CONCEPT_ASSERT((BinaryPredicate<value_compare,value_type_,value_type_>));      }      // Redundant with the base concept, but it helps below.      typedef typename C::const_iterator const_iterator;   private:      void const_constraints(const C& cc)      {          ci = cc.find(k);          n = cc.count(k);          cr = cc.equal_range(k);      }      C c;      iterator i;      std::pair<iterator,iterator> r;      const_iterator ci;      std::pair<const_iterator,const_iterator> cr;      typename C::key_type k;      typename C::size_type n;  };  BOOST_concept(UniqueAssociativeContainer,(C))    : AssociativeContainer<C>  {      BOOST_CONCEPT_USAGE(UniqueAssociativeContainer)      {          C c(first, last);          pos_flag = c.insert(t);          c.insert(first, last);          ignore_unused_variable_warning(c);      }   private:      std::pair<typename C::iterator, bool> pos_flag;      typename C::value_type t;      typename C::value_type* first, *last;  };  BOOST_concept(MultipleAssociativeContainer,(C))    : AssociativeContainer<C>  {      BOOST_CONCEPT_USAGE(MultipleAssociativeContainer)      {          C c(first, last);          pos = c.insert(t);          c.insert(first, last);          ignore_unused_variable_warning(c);          ignore_unused_variable_warning(pos);      }   private:      typename C::iterator pos;      typename C::value_type t;      typename C::value_type* first, *last;  };  BOOST_concept(SimpleAssociativeContainer,(C))    : AssociativeContainer<C>  {      BOOST_CONCEPT_USAGE(SimpleAssociativeContainer)      {          typedef typename C::key_type key_type;          typedef typename C::value_type value_type;          BOOST_STATIC_ASSERT((boost::is_same<key_type,value_type>::value));      }  };  BOOST_concept(PairAssociativeContainer,(C))    : AssociativeContainer<C>  {      BOOST_CONCEPT_USAGE(PairAssociativeContainer)      {          typedef typename C::key_type key_type;          typedef typename C::value_type value_type;          typedef typename C::mapped_type mapped_type;          typedef std::pair<const key_type, mapped_type> required_value_type;          BOOST_STATIC_ASSERT((boost::is_same<value_type,required_value_type>::value));      }  };  BOOST_concept(SortedAssociativeContainer,(C))    : AssociativeContainer<C>    , ReversibleContainer<C>  {      BOOST_CONCEPT_USAGE(SortedAssociativeContainer)      {          C              c(kc),              c2(first, last),              c3(first, last, kc);          p = c.upper_bound(k);          p = c.lower_bound(k);          r = c.equal_range(k);          c.insert(p, t);          ignore_unused_variable_warning(c);          ignore_unused_variable_warning(c2);          ignore_unused_variable_warning(c3);          const_constraints(c);      }      void const_constraints(const C& c)      {          kc = c.key_comp();          vc = c.value_comp();          cp = c.upper_bound(k);          cp = c.lower_bound(k);          cr = c.equal_range(k);      }   private:      typename C::key_compare kc;      typename C::value_compare vc;      typename C::value_type t;      typename C::key_type k;      typedef typename C::iterator iterator;      typedef typename C::const_iterator const_iterator;      typedef SortedAssociativeContainer self;      iterator p;      const_iterator cp;      std::pair<typename self::iterator,typename self::iterator> r;      std::pair<typename self::const_iterator,typename self::const_iterator> cr;      typename C::value_type* first, *last;  };  // HashedAssociativeContainer  BOOST_concept(Collection,(C))  {      BOOST_CONCEPT_USAGE(Collection)      {        boost::function_requires<boost::InputIteratorConcept<iterator> >();        boost::function_requires<boost::InputIteratorConcept<const_iterator> >();        boost::function_requires<boost::CopyConstructibleConcept<value_type> >();        const_constraints(c);        i = c.begin();        i = c.end();        c.swap(c);      }      void const_constraints(const C& cc) {        ci = cc.begin();        ci = cc.end();        n = cc.size();        b = cc.empty();      }    private:      typedef typename C::value_type value_type;      typedef typename C::iterator iterator;      typedef typename C::const_iterator const_iterator;      typedef typename C::reference reference;      typedef typename C::const_reference const_reference;      // typedef typename C::pointer pointer;      typedef typename C::difference_type difference_type;      typedef typename C::size_type size_type;      C c;      bool b;      iterator i;      const_iterator ci;      size_type n;  };} // namespace boost#if (defined _MSC_VER)# pragma warning( pop )#endif# include <boost/concept/detail/concept_undef.hpp>#endif // BOOST_CONCEPT_CHECKS_HPP
 |