123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083 |
- //
- // (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
- #endif
- namespace 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
|