annotate DEPENDENCIES/generic/include/boost/concept_check.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 //
Chris@16 2 // (C) Copyright Jeremy Siek 2000.
Chris@16 3 // Copyright 2002 The Trustees of Indiana University.
Chris@16 4 //
Chris@16 5 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 6 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 //
Chris@16 9 // Revision History:
Chris@16 10 // 05 May 2001: Workarounds for HP aCC from Thomas Matelich. (Jeremy Siek)
Chris@16 11 // 02 April 2001: Removed limits header altogether. (Jeremy Siek)
Chris@16 12 // 01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock)
Chris@16 13 //
Chris@16 14
Chris@16 15 // See http://www.boost.org/libs/concept_check for documentation.
Chris@16 16
Chris@16 17 #ifndef BOOST_CONCEPT_CHECKS_HPP
Chris@16 18 # define BOOST_CONCEPT_CHECKS_HPP
Chris@16 19
Chris@16 20 # include <boost/concept/assert.hpp>
Chris@16 21
Chris@16 22 # include <boost/iterator.hpp>
Chris@16 23 # include <boost/type_traits/conversion_traits.hpp>
Chris@16 24 # include <utility>
Chris@16 25 # include <boost/type_traits/is_same.hpp>
Chris@16 26 # include <boost/type_traits/is_void.hpp>
Chris@16 27 # include <boost/mpl/assert.hpp>
Chris@16 28 # include <boost/mpl/bool.hpp>
Chris@16 29 # include <boost/detail/workaround.hpp>
Chris@16 30 # include <boost/detail/iterator.hpp>
Chris@16 31
Chris@16 32 # include <boost/concept/usage.hpp>
Chris@16 33 # include <boost/concept/detail/concept_def.hpp>
Chris@16 34
Chris@16 35 namespace boost
Chris@16 36 {
Chris@16 37
Chris@16 38 //
Chris@16 39 // Backward compatibility
Chris@16 40 //
Chris@16 41
Chris@16 42 template <class Model>
Chris@16 43 inline void function_requires(Model* = 0)
Chris@16 44 {
Chris@16 45 BOOST_CONCEPT_ASSERT((Model));
Chris@16 46 }
Chris@16 47 template <class T> inline void ignore_unused_variable_warning(T const&) {}
Chris@16 48
Chris@16 49 # define BOOST_CLASS_REQUIRE(type_var, ns, concept) \
Chris@16 50 BOOST_CONCEPT_ASSERT((ns::concept<type_var>))
Chris@16 51
Chris@16 52 # define BOOST_CLASS_REQUIRE2(type_var1, type_var2, ns, concept) \
Chris@16 53 BOOST_CONCEPT_ASSERT((ns::concept<type_var1,type_var2>))
Chris@16 54
Chris@16 55 # define BOOST_CLASS_REQUIRE3(tv1, tv2, tv3, ns, concept) \
Chris@16 56 BOOST_CONCEPT_ASSERT((ns::concept<tv1,tv2,tv3>))
Chris@16 57
Chris@16 58 # define BOOST_CLASS_REQUIRE4(tv1, tv2, tv3, tv4, ns, concept) \
Chris@16 59 BOOST_CONCEPT_ASSERT((ns::concept<tv1,tv2,tv3,tv4>))
Chris@16 60
Chris@16 61
Chris@16 62 //
Chris@16 63 // Begin concept definitions
Chris@16 64 //
Chris@16 65 BOOST_concept(Integer, (T))
Chris@16 66 {
Chris@16 67 BOOST_CONCEPT_USAGE(Integer)
Chris@16 68 {
Chris@16 69 x.error_type_must_be_an_integer_type();
Chris@16 70 }
Chris@16 71 private:
Chris@16 72 T x;
Chris@16 73 };
Chris@16 74
Chris@16 75 template <> struct Integer<char> {};
Chris@16 76 template <> struct Integer<signed char> {};
Chris@16 77 template <> struct Integer<unsigned char> {};
Chris@16 78 template <> struct Integer<short> {};
Chris@16 79 template <> struct Integer<unsigned short> {};
Chris@16 80 template <> struct Integer<int> {};
Chris@16 81 template <> struct Integer<unsigned int> {};
Chris@16 82 template <> struct Integer<long> {};
Chris@16 83 template <> struct Integer<unsigned long> {};
Chris@16 84 # if defined(BOOST_HAS_LONG_LONG)
Chris@16 85 template <> struct Integer< ::boost::long_long_type> {};
Chris@16 86 template <> struct Integer< ::boost::ulong_long_type> {};
Chris@16 87 # elif defined(BOOST_HAS_MS_INT64)
Chris@16 88 template <> struct Integer<__int64> {};
Chris@16 89 template <> struct Integer<unsigned __int64> {};
Chris@16 90 # endif
Chris@16 91
Chris@16 92 BOOST_concept(SignedInteger,(T)) {
Chris@16 93 BOOST_CONCEPT_USAGE(SignedInteger) {
Chris@16 94 x.error_type_must_be_a_signed_integer_type();
Chris@16 95 }
Chris@16 96 private:
Chris@16 97 T x;
Chris@16 98 };
Chris@16 99 template <> struct SignedInteger<signed char> { };
Chris@16 100 template <> struct SignedInteger<short> {};
Chris@16 101 template <> struct SignedInteger<int> {};
Chris@16 102 template <> struct SignedInteger<long> {};
Chris@16 103 # if defined(BOOST_HAS_LONG_LONG)
Chris@16 104 template <> struct SignedInteger< ::boost::long_long_type> {};
Chris@16 105 # elif defined(BOOST_HAS_MS_INT64)
Chris@16 106 template <> struct SignedInteger<__int64> {};
Chris@16 107 # endif
Chris@16 108
Chris@16 109 BOOST_concept(UnsignedInteger,(T)) {
Chris@16 110 BOOST_CONCEPT_USAGE(UnsignedInteger) {
Chris@16 111 x.error_type_must_be_an_unsigned_integer_type();
Chris@16 112 }
Chris@16 113 private:
Chris@16 114 T x;
Chris@16 115 };
Chris@16 116
Chris@16 117 template <> struct UnsignedInteger<unsigned char> {};
Chris@16 118 template <> struct UnsignedInteger<unsigned short> {};
Chris@16 119 template <> struct UnsignedInteger<unsigned int> {};
Chris@16 120 template <> struct UnsignedInteger<unsigned long> {};
Chris@16 121 # if defined(BOOST_HAS_LONG_LONG)
Chris@16 122 template <> struct UnsignedInteger< ::boost::ulong_long_type> {};
Chris@16 123 # elif defined(BOOST_HAS_MS_INT64)
Chris@16 124 template <> struct UnsignedInteger<unsigned __int64> {};
Chris@16 125 # endif
Chris@16 126
Chris@16 127 //===========================================================================
Chris@16 128 // Basic Concepts
Chris@16 129
Chris@16 130 BOOST_concept(DefaultConstructible,(TT))
Chris@16 131 {
Chris@16 132 BOOST_CONCEPT_USAGE(DefaultConstructible) {
Chris@16 133 TT a; // require default constructor
Chris@16 134 ignore_unused_variable_warning(a);
Chris@16 135 }
Chris@16 136 };
Chris@16 137
Chris@16 138 BOOST_concept(Assignable,(TT))
Chris@16 139 {
Chris@16 140 BOOST_CONCEPT_USAGE(Assignable) {
Chris@16 141 #if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
Chris@16 142 a = b; // require assignment operator
Chris@16 143 #endif
Chris@16 144 const_constraints(b);
Chris@16 145 }
Chris@16 146 private:
Chris@16 147 void const_constraints(const TT& x) {
Chris@16 148 #if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
Chris@16 149 a = x; // const required for argument to assignment
Chris@16 150 #else
Chris@16 151 ignore_unused_variable_warning(x);
Chris@16 152 #endif
Chris@16 153 }
Chris@16 154 private:
Chris@16 155 TT a;
Chris@16 156 TT b;
Chris@16 157 };
Chris@16 158
Chris@16 159
Chris@16 160 BOOST_concept(CopyConstructible,(TT))
Chris@16 161 {
Chris@16 162 BOOST_CONCEPT_USAGE(CopyConstructible) {
Chris@16 163 TT a(b); // require copy constructor
Chris@16 164 TT* ptr = &a; // require address of operator
Chris@16 165 const_constraints(a);
Chris@16 166 ignore_unused_variable_warning(ptr);
Chris@16 167 }
Chris@16 168 private:
Chris@16 169 void const_constraints(const TT& a) {
Chris@16 170 TT c(a); // require const copy constructor
Chris@16 171 const TT* ptr = &a; // require const address of operator
Chris@16 172 ignore_unused_variable_warning(c);
Chris@16 173 ignore_unused_variable_warning(ptr);
Chris@16 174 }
Chris@16 175 TT b;
Chris@16 176 };
Chris@16 177
Chris@16 178 #if (defined _MSC_VER)
Chris@16 179 # pragma warning( push )
Chris@16 180 # pragma warning( disable : 4510 ) // default constructor could not be generated
Chris@16 181 # pragma warning( disable : 4610 ) // object 'class' can never be instantiated - user-defined constructor required
Chris@16 182 #endif
Chris@16 183 // The SGI STL version of Assignable requires copy constructor and operator=
Chris@16 184 BOOST_concept(SGIAssignable,(TT))
Chris@16 185 {
Chris@16 186 BOOST_CONCEPT_USAGE(SGIAssignable) {
Chris@16 187 TT c(a);
Chris@16 188 #if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
Chris@16 189 a = b; // require assignment operator
Chris@16 190 #endif
Chris@16 191 const_constraints(b);
Chris@16 192 ignore_unused_variable_warning(c);
Chris@16 193 }
Chris@16 194 private:
Chris@16 195 void const_constraints(const TT& x) {
Chris@16 196 TT c(x);
Chris@16 197 #if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
Chris@16 198 a = x; // const required for argument to assignment
Chris@16 199 #endif
Chris@16 200 ignore_unused_variable_warning(c);
Chris@16 201 }
Chris@16 202 TT a;
Chris@16 203 TT b;
Chris@16 204 };
Chris@16 205 #if (defined _MSC_VER)
Chris@16 206 # pragma warning( pop )
Chris@16 207 #endif
Chris@16 208
Chris@16 209 BOOST_concept(Convertible,(X)(Y))
Chris@16 210 {
Chris@16 211 BOOST_CONCEPT_USAGE(Convertible) {
Chris@16 212 Y y = x;
Chris@16 213 ignore_unused_variable_warning(y);
Chris@16 214 }
Chris@16 215 private:
Chris@16 216 X x;
Chris@16 217 };
Chris@16 218
Chris@16 219 // The C++ standard requirements for many concepts talk about return
Chris@16 220 // types that must be "convertible to bool". The problem with this
Chris@16 221 // requirement is that it leaves the door open for evil proxies that
Chris@16 222 // define things like operator|| with strange return types. Two
Chris@16 223 // possible solutions are:
Chris@16 224 // 1) require the return type to be exactly bool
Chris@16 225 // 2) stay with convertible to bool, and also
Chris@16 226 // specify stuff about all the logical operators.
Chris@16 227 // For now we just test for convertible to bool.
Chris@16 228 template <class TT>
Chris@16 229 void require_boolean_expr(const TT& t) {
Chris@16 230 bool x = t;
Chris@16 231 ignore_unused_variable_warning(x);
Chris@16 232 }
Chris@16 233
Chris@16 234 BOOST_concept(EqualityComparable,(TT))
Chris@16 235 {
Chris@16 236 BOOST_CONCEPT_USAGE(EqualityComparable) {
Chris@16 237 require_boolean_expr(a == b);
Chris@16 238 require_boolean_expr(a != b);
Chris@16 239 }
Chris@16 240 private:
Chris@16 241 TT a, b;
Chris@16 242 };
Chris@16 243
Chris@16 244 BOOST_concept(LessThanComparable,(TT))
Chris@16 245 {
Chris@16 246 BOOST_CONCEPT_USAGE(LessThanComparable) {
Chris@16 247 require_boolean_expr(a < b);
Chris@16 248 }
Chris@16 249 private:
Chris@16 250 TT a, b;
Chris@16 251 };
Chris@16 252
Chris@16 253 // This is equivalent to SGI STL's LessThanComparable.
Chris@16 254 BOOST_concept(Comparable,(TT))
Chris@16 255 {
Chris@16 256 BOOST_CONCEPT_USAGE(Comparable) {
Chris@16 257 require_boolean_expr(a < b);
Chris@16 258 require_boolean_expr(a > b);
Chris@16 259 require_boolean_expr(a <= b);
Chris@16 260 require_boolean_expr(a >= b);
Chris@16 261 }
Chris@16 262 private:
Chris@16 263 TT a, b;
Chris@16 264 };
Chris@16 265
Chris@16 266 #define BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(OP,NAME) \
Chris@16 267 BOOST_concept(NAME, (First)(Second)) \
Chris@16 268 { \
Chris@16 269 BOOST_CONCEPT_USAGE(NAME) { (void)constraints_(); } \
Chris@16 270 private: \
Chris@16 271 bool constraints_() { return a OP b; } \
Chris@16 272 First a; \
Chris@16 273 Second b; \
Chris@16 274 }
Chris@16 275
Chris@16 276 #define BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(OP,NAME) \
Chris@16 277 BOOST_concept(NAME, (Ret)(First)(Second)) \
Chris@16 278 { \
Chris@16 279 BOOST_CONCEPT_USAGE(NAME) { (void)constraints_(); } \
Chris@16 280 private: \
Chris@16 281 Ret constraints_() { return a OP b; } \
Chris@16 282 First a; \
Chris@16 283 Second b; \
Chris@16 284 }
Chris@16 285
Chris@16 286 BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(==, EqualOp);
Chris@16 287 BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(!=, NotEqualOp);
Chris@16 288 BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<, LessThanOp);
Chris@16 289 BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(<=, LessEqualOp);
Chris@16 290 BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>, GreaterThanOp);
Chris@16 291 BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT(>=, GreaterEqualOp);
Chris@16 292
Chris@16 293 BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(+, PlusOp);
Chris@16 294 BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(*, TimesOp);
Chris@16 295 BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(/, DivideOp);
Chris@16 296 BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(-, SubtractOp);
Chris@16 297 BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(%, ModOp);
Chris@16 298
Chris@16 299 //===========================================================================
Chris@16 300 // Function Object Concepts
Chris@16 301
Chris@16 302 BOOST_concept(Generator,(Func)(Return))
Chris@16 303 {
Chris@16 304 BOOST_CONCEPT_USAGE(Generator) { test(is_void<Return>()); }
Chris@16 305
Chris@16 306 private:
Chris@16 307 void test(boost::mpl::false_)
Chris@16 308 {
Chris@16 309 // Do we really want a reference here?
Chris@16 310 const Return& r = f();
Chris@16 311 ignore_unused_variable_warning(r);
Chris@16 312 }
Chris@16 313
Chris@16 314 void test(boost::mpl::true_)
Chris@16 315 {
Chris@16 316 f();
Chris@16 317 }
Chris@16 318
Chris@16 319 Func f;
Chris@16 320 };
Chris@16 321
Chris@16 322 BOOST_concept(UnaryFunction,(Func)(Return)(Arg))
Chris@16 323 {
Chris@16 324 BOOST_CONCEPT_USAGE(UnaryFunction) { test(is_void<Return>()); }
Chris@16 325
Chris@16 326 private:
Chris@16 327 void test(boost::mpl::false_)
Chris@16 328 {
Chris@16 329 f(arg); // "priming the pump" this way keeps msvc6 happy (ICE)
Chris@16 330 Return r = f(arg);
Chris@16 331 ignore_unused_variable_warning(r);
Chris@16 332 }
Chris@16 333
Chris@16 334 void test(boost::mpl::true_)
Chris@16 335 {
Chris@16 336 f(arg);
Chris@16 337 }
Chris@16 338
Chris@16 339 #if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \
Chris@16 340 && BOOST_WORKAROUND(__GNUC__, > 3)))
Chris@16 341 // Declare a dummy construktor to make gcc happy.
Chris@16 342 // It seems the compiler can not generate a sensible constructor when this is instantiated with a refence type.
Chris@16 343 // (warning: non-static reference "const double& boost::UnaryFunction<YourClassHere>::arg"
Chris@16 344 // in class without a constructor [-Wuninitialized])
Chris@16 345 UnaryFunction();
Chris@16 346 #endif
Chris@16 347
Chris@16 348 Func f;
Chris@16 349 Arg arg;
Chris@16 350 };
Chris@16 351
Chris@16 352 BOOST_concept(BinaryFunction,(Func)(Return)(First)(Second))
Chris@16 353 {
Chris@16 354 BOOST_CONCEPT_USAGE(BinaryFunction) { test(is_void<Return>()); }
Chris@16 355 private:
Chris@16 356 void test(boost::mpl::false_)
Chris@16 357 {
Chris@16 358 f(first,second);
Chris@16 359 Return r = f(first, second); // require operator()
Chris@16 360 (void)r;
Chris@16 361 }
Chris@16 362
Chris@16 363 void test(boost::mpl::true_)
Chris@16 364 {
Chris@16 365 f(first,second);
Chris@16 366 }
Chris@16 367
Chris@16 368 #if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \
Chris@16 369 && BOOST_WORKAROUND(__GNUC__, > 3)))
Chris@16 370 // Declare a dummy constructor to make gcc happy.
Chris@16 371 // It seems the compiler can not generate a sensible constructor when this is instantiated with a refence type.
Chris@16 372 // (warning: non-static reference "const double& boost::BinaryFunction<YourClassHere>::arg"
Chris@16 373 // in class without a constructor [-Wuninitialized])
Chris@16 374 BinaryFunction();
Chris@16 375 #endif
Chris@16 376
Chris@16 377 Func f;
Chris@16 378 First first;
Chris@16 379 Second second;
Chris@16 380 };
Chris@16 381
Chris@16 382 BOOST_concept(UnaryPredicate,(Func)(Arg))
Chris@16 383 {
Chris@16 384 BOOST_CONCEPT_USAGE(UnaryPredicate) {
Chris@16 385 require_boolean_expr(f(arg)); // require operator() returning bool
Chris@16 386 }
Chris@16 387 private:
Chris@16 388 #if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \
Chris@16 389 && BOOST_WORKAROUND(__GNUC__, > 3)))
Chris@16 390 // Declare a dummy constructor to make gcc happy.
Chris@16 391 // It seems the compiler can not generate a sensible constructor when this is instantiated with a refence type.
Chris@16 392 // (warning: non-static reference "const double& boost::UnaryPredicate<YourClassHere>::arg"
Chris@16 393 // in class without a constructor [-Wuninitialized])
Chris@16 394 UnaryPredicate();
Chris@16 395 #endif
Chris@16 396
Chris@16 397 Func f;
Chris@16 398 Arg arg;
Chris@16 399 };
Chris@16 400
Chris@16 401 BOOST_concept(BinaryPredicate,(Func)(First)(Second))
Chris@16 402 {
Chris@16 403 BOOST_CONCEPT_USAGE(BinaryPredicate) {
Chris@16 404 require_boolean_expr(f(a, b)); // require operator() returning bool
Chris@16 405 }
Chris@16 406 private:
Chris@16 407 #if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \
Chris@16 408 && BOOST_WORKAROUND(__GNUC__, > 3)))
Chris@16 409 // Declare a dummy constructor to make gcc happy.
Chris@16 410 // It seems the compiler can not generate a sensible constructor when this is instantiated with a refence type.
Chris@16 411 // (warning: non-static reference "const double& boost::BinaryPredicate<YourClassHere>::arg"
Chris@16 412 // in class without a constructor [-Wuninitialized])
Chris@16 413 BinaryPredicate();
Chris@16 414 #endif
Chris@16 415 Func f;
Chris@16 416 First a;
Chris@16 417 Second b;
Chris@16 418 };
Chris@16 419
Chris@16 420 // use this when functor is used inside a container class like std::set
Chris@16 421 BOOST_concept(Const_BinaryPredicate,(Func)(First)(Second))
Chris@16 422 : BinaryPredicate<Func, First, Second>
Chris@16 423 {
Chris@16 424 BOOST_CONCEPT_USAGE(Const_BinaryPredicate) {
Chris@16 425 const_constraints(f);
Chris@16 426 }
Chris@16 427 private:
Chris@16 428 void const_constraints(const Func& fun) {
Chris@16 429 // operator() must be a const member function
Chris@16 430 require_boolean_expr(fun(a, b));
Chris@16 431 }
Chris@16 432 #if (BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4) \
Chris@16 433 && BOOST_WORKAROUND(__GNUC__, > 3)))
Chris@16 434 // Declare a dummy constructor to make gcc happy.
Chris@16 435 // It seems the compiler can not generate a sensible constructor when this is instantiated with a refence type.
Chris@16 436 // (warning: non-static reference "const double& boost::Const_BinaryPredicate<YourClassHere>::arg"
Chris@16 437 // in class without a constructor [-Wuninitialized])
Chris@16 438 Const_BinaryPredicate();
Chris@16 439 #endif
Chris@16 440
Chris@16 441 Func f;
Chris@16 442 First a;
Chris@16 443 Second b;
Chris@16 444 };
Chris@16 445
Chris@16 446 BOOST_concept(AdaptableGenerator,(Func)(Return))
Chris@16 447 : Generator<Func, typename Func::result_type>
Chris@16 448 {
Chris@16 449 typedef typename Func::result_type result_type;
Chris@16 450
Chris@16 451 BOOST_CONCEPT_USAGE(AdaptableGenerator)
Chris@16 452 {
Chris@16 453 BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));
Chris@16 454 }
Chris@16 455 };
Chris@16 456
Chris@16 457 BOOST_concept(AdaptableUnaryFunction,(Func)(Return)(Arg))
Chris@16 458 : UnaryFunction<Func, typename Func::result_type, typename Func::argument_type>
Chris@16 459 {
Chris@16 460 typedef typename Func::argument_type argument_type;
Chris@16 461 typedef typename Func::result_type result_type;
Chris@16 462
Chris@16 463 ~AdaptableUnaryFunction()
Chris@16 464 {
Chris@16 465 BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));
Chris@16 466 BOOST_CONCEPT_ASSERT((Convertible<Arg, argument_type>));
Chris@16 467 }
Chris@16 468 };
Chris@16 469
Chris@16 470 BOOST_concept(AdaptableBinaryFunction,(Func)(Return)(First)(Second))
Chris@16 471 : BinaryFunction<
Chris@16 472 Func
Chris@16 473 , typename Func::result_type
Chris@16 474 , typename Func::first_argument_type
Chris@16 475 , typename Func::second_argument_type
Chris@16 476 >
Chris@16 477 {
Chris@16 478 typedef typename Func::first_argument_type first_argument_type;
Chris@16 479 typedef typename Func::second_argument_type second_argument_type;
Chris@16 480 typedef typename Func::result_type result_type;
Chris@16 481
Chris@16 482 ~AdaptableBinaryFunction()
Chris@16 483 {
Chris@16 484 BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));
Chris@16 485 BOOST_CONCEPT_ASSERT((Convertible<First, first_argument_type>));
Chris@16 486 BOOST_CONCEPT_ASSERT((Convertible<Second, second_argument_type>));
Chris@16 487 }
Chris@16 488 };
Chris@16 489
Chris@16 490 BOOST_concept(AdaptablePredicate,(Func)(Arg))
Chris@16 491 : UnaryPredicate<Func, Arg>
Chris@16 492 , AdaptableUnaryFunction<Func, bool, Arg>
Chris@16 493 {
Chris@16 494 };
Chris@16 495
Chris@16 496 BOOST_concept(AdaptableBinaryPredicate,(Func)(First)(Second))
Chris@16 497 : BinaryPredicate<Func, First, Second>
Chris@16 498 , AdaptableBinaryFunction<Func, bool, First, Second>
Chris@16 499 {
Chris@16 500 };
Chris@16 501
Chris@16 502 //===========================================================================
Chris@16 503 // Iterator Concepts
Chris@16 504
Chris@16 505 BOOST_concept(InputIterator,(TT))
Chris@16 506 : Assignable<TT>
Chris@16 507 , EqualityComparable<TT>
Chris@16 508 {
Chris@16 509 typedef typename boost::detail::iterator_traits<TT>::value_type value_type;
Chris@16 510 typedef typename boost::detail::iterator_traits<TT>::difference_type difference_type;
Chris@16 511 typedef typename boost::detail::iterator_traits<TT>::reference reference;
Chris@16 512 typedef typename boost::detail::iterator_traits<TT>::pointer pointer;
Chris@16 513 typedef typename boost::detail::iterator_traits<TT>::iterator_category iterator_category;
Chris@16 514
Chris@16 515 BOOST_CONCEPT_USAGE(InputIterator)
Chris@16 516 {
Chris@16 517 BOOST_CONCEPT_ASSERT((SignedInteger<difference_type>));
Chris@16 518 BOOST_CONCEPT_ASSERT((Convertible<iterator_category, std::input_iterator_tag>));
Chris@16 519
Chris@16 520 TT j(i);
Chris@16 521 (void)*i; // require dereference operator
Chris@16 522 ++j; // require preincrement operator
Chris@16 523 i++; // require postincrement operator
Chris@16 524 }
Chris@16 525 private:
Chris@16 526 TT i;
Chris@16 527 };
Chris@16 528
Chris@16 529 BOOST_concept(OutputIterator,(TT)(ValueT))
Chris@16 530 : Assignable<TT>
Chris@16 531 {
Chris@16 532 BOOST_CONCEPT_USAGE(OutputIterator) {
Chris@16 533
Chris@16 534 ++i; // require preincrement operator
Chris@16 535 i++; // require postincrement operator
Chris@16 536 *i++ = t; // require postincrement and assignment
Chris@16 537 }
Chris@16 538 private:
Chris@16 539 TT i, j;
Chris@16 540 ValueT t;
Chris@16 541 };
Chris@16 542
Chris@16 543 BOOST_concept(ForwardIterator,(TT))
Chris@16 544 : InputIterator<TT>
Chris@16 545 {
Chris@16 546 BOOST_CONCEPT_USAGE(ForwardIterator)
Chris@16 547 {
Chris@16 548 BOOST_CONCEPT_ASSERT((Convertible<
Chris@16 549 BOOST_DEDUCED_TYPENAME ForwardIterator::iterator_category
Chris@16 550 , std::forward_iterator_tag
Chris@16 551 >));
Chris@16 552
Chris@16 553 typename InputIterator<TT>::reference r = *i;
Chris@16 554 ignore_unused_variable_warning(r);
Chris@16 555 }
Chris@16 556
Chris@16 557 private:
Chris@16 558 TT i;
Chris@16 559 };
Chris@16 560
Chris@16 561 BOOST_concept(Mutable_ForwardIterator,(TT))
Chris@16 562 : ForwardIterator<TT>
Chris@16 563 {
Chris@16 564 BOOST_CONCEPT_USAGE(Mutable_ForwardIterator) {
Chris@16 565 *i++ = *i; // require postincrement and assignment
Chris@16 566 }
Chris@16 567 private:
Chris@16 568 TT i;
Chris@16 569 };
Chris@16 570
Chris@16 571 BOOST_concept(BidirectionalIterator,(TT))
Chris@16 572 : ForwardIterator<TT>
Chris@16 573 {
Chris@16 574 BOOST_CONCEPT_USAGE(BidirectionalIterator)
Chris@16 575 {
Chris@16 576 BOOST_CONCEPT_ASSERT((Convertible<
Chris@16 577 BOOST_DEDUCED_TYPENAME BidirectionalIterator::iterator_category
Chris@16 578 , std::bidirectional_iterator_tag
Chris@16 579 >));
Chris@16 580
Chris@16 581 --i; // require predecrement operator
Chris@16 582 i--; // require postdecrement operator
Chris@16 583 }
Chris@16 584 private:
Chris@16 585 TT i;
Chris@16 586 };
Chris@16 587
Chris@16 588 BOOST_concept(Mutable_BidirectionalIterator,(TT))
Chris@16 589 : BidirectionalIterator<TT>
Chris@16 590 , Mutable_ForwardIterator<TT>
Chris@16 591 {
Chris@16 592 BOOST_CONCEPT_USAGE(Mutable_BidirectionalIterator)
Chris@16 593 {
Chris@16 594 *i-- = *i; // require postdecrement and assignment
Chris@16 595 }
Chris@16 596 private:
Chris@16 597 TT i;
Chris@16 598 };
Chris@16 599
Chris@16 600 BOOST_concept(RandomAccessIterator,(TT))
Chris@16 601 : BidirectionalIterator<TT>
Chris@16 602 , Comparable<TT>
Chris@16 603 {
Chris@16 604 BOOST_CONCEPT_USAGE(RandomAccessIterator)
Chris@16 605 {
Chris@16 606 BOOST_CONCEPT_ASSERT((Convertible<
Chris@16 607 BOOST_DEDUCED_TYPENAME BidirectionalIterator<TT>::iterator_category
Chris@16 608 , std::random_access_iterator_tag
Chris@16 609 >));
Chris@16 610
Chris@16 611 i += n; // require assignment addition operator
Chris@16 612 i = i + n; i = n + i; // require addition with difference type
Chris@16 613 i -= n; // require assignment subtraction operator
Chris@16 614 i = i - n; // require subtraction with difference type
Chris@16 615 n = i - j; // require difference operator
Chris@16 616 (void)i[n]; // require element access operator
Chris@16 617 }
Chris@16 618
Chris@16 619 private:
Chris@16 620 TT a, b;
Chris@16 621 TT i, j;
Chris@16 622 typename boost::detail::iterator_traits<TT>::difference_type n;
Chris@16 623 };
Chris@16 624
Chris@16 625 BOOST_concept(Mutable_RandomAccessIterator,(TT))
Chris@16 626 : RandomAccessIterator<TT>
Chris@16 627 , Mutable_BidirectionalIterator<TT>
Chris@16 628 {
Chris@16 629 BOOST_CONCEPT_USAGE(Mutable_RandomAccessIterator)
Chris@16 630 {
Chris@16 631 i[n] = *i; // require element access and assignment
Chris@16 632 }
Chris@16 633 private:
Chris@16 634 TT i;
Chris@16 635 typename boost::detail::iterator_traits<TT>::difference_type n;
Chris@16 636 };
Chris@16 637
Chris@16 638 //===========================================================================
Chris@16 639 // Container s
Chris@16 640
Chris@16 641 BOOST_concept(Container,(C))
Chris@16 642 : Assignable<C>
Chris@16 643 {
Chris@16 644 typedef typename C::value_type value_type;
Chris@16 645 typedef typename C::difference_type difference_type;
Chris@16 646 typedef typename C::size_type size_type;
Chris@16 647 typedef typename C::const_reference const_reference;
Chris@16 648 typedef typename C::const_pointer const_pointer;
Chris@16 649 typedef typename C::const_iterator const_iterator;
Chris@16 650
Chris@16 651 BOOST_CONCEPT_USAGE(Container)
Chris@16 652 {
Chris@16 653 BOOST_CONCEPT_ASSERT((InputIterator<const_iterator>));
Chris@16 654 const_constraints(c);
Chris@16 655 }
Chris@16 656
Chris@16 657 private:
Chris@16 658 void const_constraints(const C& cc) {
Chris@16 659 i = cc.begin();
Chris@16 660 i = cc.end();
Chris@16 661 n = cc.size();
Chris@16 662 n = cc.max_size();
Chris@16 663 b = cc.empty();
Chris@16 664 }
Chris@16 665 C c;
Chris@16 666 bool b;
Chris@16 667 const_iterator i;
Chris@16 668 size_type n;
Chris@16 669 };
Chris@16 670
Chris@16 671 BOOST_concept(Mutable_Container,(C))
Chris@16 672 : Container<C>
Chris@16 673 {
Chris@16 674 typedef typename C::reference reference;
Chris@16 675 typedef typename C::iterator iterator;
Chris@16 676 typedef typename C::pointer pointer;
Chris@16 677
Chris@16 678 BOOST_CONCEPT_USAGE(Mutable_Container)
Chris@16 679 {
Chris@16 680 BOOST_CONCEPT_ASSERT((
Chris@16 681 Assignable<typename Mutable_Container::value_type>));
Chris@16 682
Chris@16 683 BOOST_CONCEPT_ASSERT((InputIterator<iterator>));
Chris@16 684
Chris@16 685 i = c.begin();
Chris@16 686 i = c.end();
Chris@16 687 c.swap(c2);
Chris@16 688 }
Chris@16 689
Chris@16 690 private:
Chris@16 691 iterator i;
Chris@16 692 C c, c2;
Chris@16 693 };
Chris@16 694
Chris@16 695 BOOST_concept(ForwardContainer,(C))
Chris@16 696 : Container<C>
Chris@16 697 {
Chris@16 698 BOOST_CONCEPT_USAGE(ForwardContainer)
Chris@16 699 {
Chris@16 700 BOOST_CONCEPT_ASSERT((
Chris@16 701 ForwardIterator<
Chris@16 702 typename ForwardContainer::const_iterator
Chris@16 703 >));
Chris@16 704 }
Chris@16 705 };
Chris@16 706
Chris@16 707 BOOST_concept(Mutable_ForwardContainer,(C))
Chris@16 708 : ForwardContainer<C>
Chris@16 709 , Mutable_Container<C>
Chris@16 710 {
Chris@16 711 BOOST_CONCEPT_USAGE(Mutable_ForwardContainer)
Chris@16 712 {
Chris@16 713 BOOST_CONCEPT_ASSERT((
Chris@16 714 Mutable_ForwardIterator<
Chris@16 715 typename Mutable_ForwardContainer::iterator
Chris@16 716 >));
Chris@16 717 }
Chris@16 718 };
Chris@16 719
Chris@16 720 BOOST_concept(ReversibleContainer,(C))
Chris@16 721 : ForwardContainer<C>
Chris@16 722 {
Chris@16 723 typedef typename
Chris@16 724 C::const_reverse_iterator
Chris@16 725 const_reverse_iterator;
Chris@16 726
Chris@16 727 BOOST_CONCEPT_USAGE(ReversibleContainer)
Chris@16 728 {
Chris@16 729 BOOST_CONCEPT_ASSERT((
Chris@16 730 BidirectionalIterator<
Chris@16 731 typename ReversibleContainer::const_iterator>));
Chris@16 732
Chris@16 733 BOOST_CONCEPT_ASSERT((BidirectionalIterator<const_reverse_iterator>));
Chris@16 734
Chris@16 735 const_constraints(c);
Chris@16 736 }
Chris@16 737 private:
Chris@16 738 void const_constraints(const C& cc)
Chris@16 739 {
Chris@16 740 const_reverse_iterator i = cc.rbegin();
Chris@16 741 i = cc.rend();
Chris@16 742 }
Chris@16 743 C c;
Chris@16 744 };
Chris@16 745
Chris@16 746 BOOST_concept(Mutable_ReversibleContainer,(C))
Chris@16 747 : Mutable_ForwardContainer<C>
Chris@16 748 , ReversibleContainer<C>
Chris@16 749 {
Chris@16 750 typedef typename C::reverse_iterator reverse_iterator;
Chris@16 751
Chris@16 752 BOOST_CONCEPT_USAGE(Mutable_ReversibleContainer)
Chris@16 753 {
Chris@16 754 typedef typename Mutable_ForwardContainer<C>::iterator iterator;
Chris@16 755 BOOST_CONCEPT_ASSERT((Mutable_BidirectionalIterator<iterator>));
Chris@16 756 BOOST_CONCEPT_ASSERT((Mutable_BidirectionalIterator<reverse_iterator>));
Chris@16 757
Chris@16 758 reverse_iterator i = c.rbegin();
Chris@16 759 i = c.rend();
Chris@16 760 }
Chris@16 761 private:
Chris@16 762 C c;
Chris@16 763 };
Chris@16 764
Chris@16 765 BOOST_concept(RandomAccessContainer,(C))
Chris@16 766 : ReversibleContainer<C>
Chris@16 767 {
Chris@16 768 typedef typename C::size_type size_type;
Chris@16 769 typedef typename C::const_reference const_reference;
Chris@16 770
Chris@16 771 BOOST_CONCEPT_USAGE(RandomAccessContainer)
Chris@16 772 {
Chris@16 773 BOOST_CONCEPT_ASSERT((
Chris@16 774 RandomAccessIterator<
Chris@16 775 typename RandomAccessContainer::const_iterator
Chris@16 776 >));
Chris@16 777
Chris@16 778 const_constraints(c);
Chris@16 779 }
Chris@16 780 private:
Chris@16 781 void const_constraints(const C& cc)
Chris@16 782 {
Chris@16 783 const_reference r = cc[n];
Chris@16 784 ignore_unused_variable_warning(r);
Chris@16 785 }
Chris@16 786
Chris@16 787 C c;
Chris@16 788 size_type n;
Chris@16 789 };
Chris@16 790
Chris@16 791 BOOST_concept(Mutable_RandomAccessContainer,(C))
Chris@16 792 : Mutable_ReversibleContainer<C>
Chris@16 793 , RandomAccessContainer<C>
Chris@16 794 {
Chris@16 795 private:
Chris@16 796 typedef Mutable_RandomAccessContainer self;
Chris@16 797 public:
Chris@16 798 BOOST_CONCEPT_USAGE(Mutable_RandomAccessContainer)
Chris@16 799 {
Chris@16 800 BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<typename self::iterator>));
Chris@16 801 BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<typename self::reverse_iterator>));
Chris@16 802
Chris@16 803 typename self::reference r = c[i];
Chris@16 804 ignore_unused_variable_warning(r);
Chris@16 805 }
Chris@16 806
Chris@16 807 private:
Chris@16 808 typename Mutable_ReversibleContainer<C>::size_type i;
Chris@16 809 C c;
Chris@16 810 };
Chris@16 811
Chris@16 812 // A Sequence is inherently mutable
Chris@16 813 BOOST_concept(Sequence,(S))
Chris@16 814 : Mutable_ForwardContainer<S>
Chris@16 815 // Matt Austern's book puts DefaultConstructible here, the C++
Chris@16 816 // standard places it in Container --JGS
Chris@16 817 // ... so why aren't we following the standard? --DWA
Chris@16 818 , DefaultConstructible<S>
Chris@16 819 {
Chris@16 820 BOOST_CONCEPT_USAGE(Sequence)
Chris@16 821 {
Chris@16 822 S
Chris@16 823 c(n),
Chris@16 824 c2(n, t),
Chris@16 825 c3(first, last);
Chris@16 826
Chris@16 827 c.insert(p, t);
Chris@16 828 c.insert(p, n, t);
Chris@16 829 c.insert(p, first, last);
Chris@16 830
Chris@16 831 c.erase(p);
Chris@16 832 c.erase(p, q);
Chris@16 833
Chris@16 834 typename Sequence::reference r = c.front();
Chris@16 835
Chris@16 836 ignore_unused_variable_warning(c);
Chris@16 837 ignore_unused_variable_warning(c2);
Chris@16 838 ignore_unused_variable_warning(c3);
Chris@16 839 ignore_unused_variable_warning(r);
Chris@16 840 const_constraints(c);
Chris@16 841 }
Chris@16 842 private:
Chris@16 843 void const_constraints(const S& c) {
Chris@16 844 typename Sequence::const_reference r = c.front();
Chris@16 845 ignore_unused_variable_warning(r);
Chris@16 846 }
Chris@16 847
Chris@16 848 typename S::value_type t;
Chris@16 849 typename S::size_type n;
Chris@16 850 typename S::value_type* first, *last;
Chris@16 851 typename S::iterator p, q;
Chris@16 852 };
Chris@16 853
Chris@16 854 BOOST_concept(FrontInsertionSequence,(S))
Chris@16 855 : Sequence<S>
Chris@16 856 {
Chris@16 857 BOOST_CONCEPT_USAGE(FrontInsertionSequence)
Chris@16 858 {
Chris@16 859 c.push_front(t);
Chris@16 860 c.pop_front();
Chris@16 861 }
Chris@16 862 private:
Chris@16 863 S c;
Chris@16 864 typename S::value_type t;
Chris@16 865 };
Chris@16 866
Chris@16 867 BOOST_concept(BackInsertionSequence,(S))
Chris@16 868 : Sequence<S>
Chris@16 869 {
Chris@16 870 BOOST_CONCEPT_USAGE(BackInsertionSequence)
Chris@16 871 {
Chris@16 872 c.push_back(t);
Chris@16 873 c.pop_back();
Chris@16 874 typename BackInsertionSequence::reference r = c.back();
Chris@16 875 ignore_unused_variable_warning(r);
Chris@16 876 const_constraints(c);
Chris@16 877 }
Chris@16 878 private:
Chris@16 879 void const_constraints(const S& cc) {
Chris@16 880 typename BackInsertionSequence::const_reference
Chris@16 881 r = cc.back();
Chris@16 882 ignore_unused_variable_warning(r);
Chris@16 883 };
Chris@16 884 S c;
Chris@16 885 typename S::value_type t;
Chris@16 886 };
Chris@16 887
Chris@16 888 BOOST_concept(AssociativeContainer,(C))
Chris@16 889 : ForwardContainer<C>
Chris@16 890 , DefaultConstructible<C>
Chris@16 891 {
Chris@16 892 typedef typename C::key_type key_type;
Chris@16 893 typedef typename C::key_compare key_compare;
Chris@16 894 typedef typename C::value_compare value_compare;
Chris@16 895 typedef typename C::iterator iterator;
Chris@16 896
Chris@16 897 BOOST_CONCEPT_USAGE(AssociativeContainer)
Chris@16 898 {
Chris@16 899 i = c.find(k);
Chris@16 900 r = c.equal_range(k);
Chris@16 901 c.erase(k);
Chris@16 902 c.erase(i);
Chris@16 903 c.erase(r.first, r.second);
Chris@16 904 const_constraints(c);
Chris@16 905 BOOST_CONCEPT_ASSERT((BinaryPredicate<key_compare,key_type,key_type>));
Chris@16 906
Chris@16 907 typedef typename AssociativeContainer::value_type value_type_;
Chris@16 908 BOOST_CONCEPT_ASSERT((BinaryPredicate<value_compare,value_type_,value_type_>));
Chris@16 909 }
Chris@16 910
Chris@16 911 // Redundant with the base concept, but it helps below.
Chris@16 912 typedef typename C::const_iterator const_iterator;
Chris@16 913 private:
Chris@16 914 void const_constraints(const C& cc)
Chris@16 915 {
Chris@16 916 ci = cc.find(k);
Chris@16 917 n = cc.count(k);
Chris@16 918 cr = cc.equal_range(k);
Chris@16 919 }
Chris@16 920
Chris@16 921 C c;
Chris@16 922 iterator i;
Chris@16 923 std::pair<iterator,iterator> r;
Chris@16 924 const_iterator ci;
Chris@16 925 std::pair<const_iterator,const_iterator> cr;
Chris@16 926 typename C::key_type k;
Chris@16 927 typename C::size_type n;
Chris@16 928 };
Chris@16 929
Chris@16 930 BOOST_concept(UniqueAssociativeContainer,(C))
Chris@16 931 : AssociativeContainer<C>
Chris@16 932 {
Chris@16 933 BOOST_CONCEPT_USAGE(UniqueAssociativeContainer)
Chris@16 934 {
Chris@16 935 C c(first, last);
Chris@16 936
Chris@16 937 pos_flag = c.insert(t);
Chris@16 938 c.insert(first, last);
Chris@16 939
Chris@16 940 ignore_unused_variable_warning(c);
Chris@16 941 }
Chris@16 942 private:
Chris@16 943 std::pair<typename C::iterator, bool> pos_flag;
Chris@16 944 typename C::value_type t;
Chris@16 945 typename C::value_type* first, *last;
Chris@16 946 };
Chris@16 947
Chris@16 948 BOOST_concept(MultipleAssociativeContainer,(C))
Chris@16 949 : AssociativeContainer<C>
Chris@16 950 {
Chris@16 951 BOOST_CONCEPT_USAGE(MultipleAssociativeContainer)
Chris@16 952 {
Chris@16 953 C c(first, last);
Chris@16 954
Chris@16 955 pos = c.insert(t);
Chris@16 956 c.insert(first, last);
Chris@16 957
Chris@16 958 ignore_unused_variable_warning(c);
Chris@16 959 ignore_unused_variable_warning(pos);
Chris@16 960 }
Chris@16 961 private:
Chris@16 962 typename C::iterator pos;
Chris@16 963 typename C::value_type t;
Chris@16 964 typename C::value_type* first, *last;
Chris@16 965 };
Chris@16 966
Chris@16 967 BOOST_concept(SimpleAssociativeContainer,(C))
Chris@16 968 : AssociativeContainer<C>
Chris@16 969 {
Chris@16 970 BOOST_CONCEPT_USAGE(SimpleAssociativeContainer)
Chris@16 971 {
Chris@16 972 typedef typename C::key_type key_type;
Chris@16 973 typedef typename C::value_type value_type;
Chris@16 974 BOOST_MPL_ASSERT((boost::is_same<key_type,value_type>));
Chris@16 975 }
Chris@16 976 };
Chris@16 977
Chris@16 978 BOOST_concept(PairAssociativeContainer,(C))
Chris@16 979 : AssociativeContainer<C>
Chris@16 980 {
Chris@16 981 BOOST_CONCEPT_USAGE(PairAssociativeContainer)
Chris@16 982 {
Chris@16 983 typedef typename C::key_type key_type;
Chris@16 984 typedef typename C::value_type value_type;
Chris@16 985 typedef typename C::mapped_type mapped_type;
Chris@16 986 typedef std::pair<const key_type, mapped_type> required_value_type;
Chris@16 987 BOOST_MPL_ASSERT((boost::is_same<value_type,required_value_type>));
Chris@16 988 }
Chris@16 989 };
Chris@16 990
Chris@16 991 BOOST_concept(SortedAssociativeContainer,(C))
Chris@16 992 : AssociativeContainer<C>
Chris@16 993 , ReversibleContainer<C>
Chris@16 994 {
Chris@16 995 BOOST_CONCEPT_USAGE(SortedAssociativeContainer)
Chris@16 996 {
Chris@16 997 C
Chris@16 998 c(kc),
Chris@16 999 c2(first, last),
Chris@16 1000 c3(first, last, kc);
Chris@16 1001
Chris@16 1002 p = c.upper_bound(k);
Chris@16 1003 p = c.lower_bound(k);
Chris@16 1004 r = c.equal_range(k);
Chris@16 1005
Chris@16 1006 c.insert(p, t);
Chris@16 1007
Chris@16 1008 ignore_unused_variable_warning(c);
Chris@16 1009 ignore_unused_variable_warning(c2);
Chris@16 1010 ignore_unused_variable_warning(c3);
Chris@16 1011 const_constraints(c);
Chris@16 1012 }
Chris@16 1013
Chris@16 1014 void const_constraints(const C& c)
Chris@16 1015 {
Chris@16 1016 kc = c.key_comp();
Chris@16 1017 vc = c.value_comp();
Chris@16 1018
Chris@16 1019 cp = c.upper_bound(k);
Chris@16 1020 cp = c.lower_bound(k);
Chris@16 1021 cr = c.equal_range(k);
Chris@16 1022 }
Chris@16 1023
Chris@16 1024 private:
Chris@16 1025 typename C::key_compare kc;
Chris@16 1026 typename C::value_compare vc;
Chris@16 1027 typename C::value_type t;
Chris@16 1028 typename C::key_type k;
Chris@16 1029 typedef typename C::iterator iterator;
Chris@16 1030 typedef typename C::const_iterator const_iterator;
Chris@16 1031
Chris@16 1032 typedef SortedAssociativeContainer self;
Chris@16 1033 iterator p;
Chris@16 1034 const_iterator cp;
Chris@16 1035 std::pair<typename self::iterator,typename self::iterator> r;
Chris@16 1036 std::pair<typename self::const_iterator,typename self::const_iterator> cr;
Chris@16 1037 typename C::value_type* first, *last;
Chris@16 1038 };
Chris@16 1039
Chris@16 1040 // HashedAssociativeContainer
Chris@16 1041
Chris@16 1042 BOOST_concept(Collection,(C))
Chris@16 1043 {
Chris@16 1044 BOOST_CONCEPT_USAGE(Collection)
Chris@16 1045 {
Chris@16 1046 boost::function_requires<boost::InputIteratorConcept<iterator> >();
Chris@16 1047 boost::function_requires<boost::InputIteratorConcept<const_iterator> >();
Chris@16 1048 boost::function_requires<boost::CopyConstructibleConcept<value_type> >();
Chris@16 1049 const_constraints(c);
Chris@16 1050 i = c.begin();
Chris@16 1051 i = c.end();
Chris@16 1052 c.swap(c);
Chris@16 1053 }
Chris@16 1054
Chris@16 1055 void const_constraints(const C& cc) {
Chris@16 1056 ci = cc.begin();
Chris@16 1057 ci = cc.end();
Chris@16 1058 n = cc.size();
Chris@16 1059 b = cc.empty();
Chris@16 1060 }
Chris@16 1061
Chris@16 1062 private:
Chris@16 1063 typedef typename C::value_type value_type;
Chris@16 1064 typedef typename C::iterator iterator;
Chris@16 1065 typedef typename C::const_iterator const_iterator;
Chris@16 1066 typedef typename C::reference reference;
Chris@16 1067 typedef typename C::const_reference const_reference;
Chris@16 1068 // typedef typename C::pointer pointer;
Chris@16 1069 typedef typename C::difference_type difference_type;
Chris@16 1070 typedef typename C::size_type size_type;
Chris@16 1071
Chris@16 1072 C c;
Chris@16 1073 bool b;
Chris@16 1074 iterator i;
Chris@16 1075 const_iterator ci;
Chris@16 1076 size_type n;
Chris@16 1077 };
Chris@16 1078 } // namespace boost
Chris@16 1079
Chris@16 1080 # include <boost/concept/detail/concept_undef.hpp>
Chris@16 1081
Chris@16 1082 #endif // BOOST_CONCEPT_CHECKS_HPP
Chris@16 1083