annotate DEPENDENCIES/generic/include/boost/concept_check.hpp @ 125:34e428693f5d vext

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