annotate DEPENDENCIES/generic/include/boost/bind/bind.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 #ifndef BOOST_BIND_BIND_HPP_INCLUDED
Chris@16 2 #define BOOST_BIND_BIND_HPP_INCLUDED
Chris@16 3
Chris@16 4 // MS compatible compilers support #pragma once
Chris@16 5
Chris@16 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
Chris@16 7 # pragma once
Chris@16 8 #endif
Chris@16 9
Chris@16 10 //
Chris@16 11 // bind.hpp - binds function objects to arguments
Chris@16 12 //
Chris@16 13 // Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.
Chris@16 14 // Copyright (c) 2001 David Abrahams
Chris@16 15 // Copyright (c) 2005 Peter Dimov
Chris@16 16 //
Chris@16 17 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 18 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 19 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 20 //
Chris@16 21 // See http://www.boost.org/libs/bind/bind.html for documentation.
Chris@16 22 //
Chris@16 23
Chris@16 24 #include <boost/config.hpp>
Chris@16 25 #include <boost/ref.hpp>
Chris@16 26 #include <boost/mem_fn.hpp>
Chris@16 27 #include <boost/type.hpp>
Chris@16 28 #include <boost/is_placeholder.hpp>
Chris@16 29 #include <boost/bind/arg.hpp>
Chris@16 30 #include <boost/detail/workaround.hpp>
Chris@16 31 #include <boost/visit_each.hpp>
Chris@101 32 #include <boost/core/enable_if.hpp>
Chris@101 33 #include <boost/core/is_same.hpp>
Chris@16 34
Chris@16 35 // Borland-specific bug, visit_each() silently fails to produce code
Chris@16 36
Chris@16 37 #if defined(__BORLANDC__)
Chris@16 38 # define BOOST_BIND_VISIT_EACH boost::visit_each
Chris@16 39 #else
Chris@16 40 # define BOOST_BIND_VISIT_EACH visit_each
Chris@16 41 #endif
Chris@16 42
Chris@16 43 #include <boost/bind/storage.hpp>
Chris@16 44
Chris@16 45 #ifdef BOOST_MSVC
Chris@16 46 # pragma warning(push)
Chris@16 47 # pragma warning(disable: 4512) // assignment operator could not be generated
Chris@16 48 #endif
Chris@16 49
Chris@16 50 namespace boost
Chris@16 51 {
Chris@16 52
Chris@16 53 template<class T> class weak_ptr;
Chris@16 54
Chris@16 55 namespace _bi // implementation details
Chris@16 56 {
Chris@16 57
Chris@16 58 // result_traits
Chris@16 59
Chris@16 60 template<class R, class F> struct result_traits
Chris@16 61 {
Chris@16 62 typedef R type;
Chris@16 63 };
Chris@16 64
Chris@16 65 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 66
Chris@16 67 struct unspecified {};
Chris@16 68
Chris@16 69 template<class F> struct result_traits<unspecified, F>
Chris@16 70 {
Chris@16 71 typedef typename F::result_type type;
Chris@16 72 };
Chris@16 73
Chris@16 74 template<class F> struct result_traits< unspecified, reference_wrapper<F> >
Chris@16 75 {
Chris@16 76 typedef typename F::result_type type;
Chris@16 77 };
Chris@16 78
Chris@16 79 #endif
Chris@16 80
Chris@16 81 // ref_compare
Chris@16 82
Chris@16 83 template<class T> bool ref_compare( T const & a, T const & b, long )
Chris@16 84 {
Chris@16 85 return a == b;
Chris@16 86 }
Chris@16 87
Chris@16 88 template<int I> bool ref_compare( arg<I> const &, arg<I> const &, int )
Chris@16 89 {
Chris@16 90 return true;
Chris@16 91 }
Chris@16 92
Chris@16 93 template<int I> bool ref_compare( arg<I> (*) (), arg<I> (*) (), int )
Chris@16 94 {
Chris@16 95 return true;
Chris@16 96 }
Chris@16 97
Chris@16 98 template<class T> bool ref_compare( reference_wrapper<T> const & a, reference_wrapper<T> const & b, int )
Chris@16 99 {
Chris@16 100 return a.get_pointer() == b.get_pointer();
Chris@16 101 }
Chris@16 102
Chris@16 103 // bind_t forward declaration for listN
Chris@16 104
Chris@16 105 template<class R, class F, class L> class bind_t;
Chris@16 106
Chris@16 107 template<class R, class F, class L> bool ref_compare( bind_t<R, F, L> const & a, bind_t<R, F, L> const & b, int )
Chris@16 108 {
Chris@16 109 return a.compare( b );
Chris@16 110 }
Chris@16 111
Chris@16 112 // value
Chris@16 113
Chris@16 114 template<class T> class value
Chris@16 115 {
Chris@16 116 public:
Chris@16 117
Chris@16 118 value(T const & t): t_(t) {}
Chris@16 119
Chris@16 120 T & get() { return t_; }
Chris@16 121 T const & get() const { return t_; }
Chris@16 122
Chris@16 123 bool operator==(value const & rhs) const
Chris@16 124 {
Chris@16 125 return t_ == rhs.t_;
Chris@16 126 }
Chris@16 127
Chris@16 128 private:
Chris@16 129
Chris@16 130 T t_;
Chris@16 131 };
Chris@16 132
Chris@16 133 // ref_compare for weak_ptr
Chris@16 134
Chris@16 135 template<class T> bool ref_compare( value< weak_ptr<T> > const & a, value< weak_ptr<T> > const & b, int )
Chris@16 136 {
Chris@16 137 return !(a.get() < b.get()) && !(b.get() < a.get());
Chris@16 138 }
Chris@16 139
Chris@16 140 // type
Chris@16 141
Chris@16 142 template<class T> class type {};
Chris@16 143
Chris@16 144 // unwrap
Chris@16 145
Chris@16 146 template<class F> struct unwrapper
Chris@16 147 {
Chris@16 148 static inline F & unwrap( F & f, long )
Chris@16 149 {
Chris@16 150 return f;
Chris@16 151 }
Chris@16 152
Chris@16 153 template<class F2> static inline F2 & unwrap( reference_wrapper<F2> rf, int )
Chris@16 154 {
Chris@16 155 return rf.get();
Chris@16 156 }
Chris@16 157
Chris@16 158 template<class R, class T> static inline _mfi::dm<R, T> unwrap( R T::* pm, int )
Chris@16 159 {
Chris@16 160 return _mfi::dm<R, T>( pm );
Chris@16 161 }
Chris@16 162 };
Chris@16 163
Chris@16 164 // listN
Chris@16 165
Chris@16 166 class list0
Chris@16 167 {
Chris@16 168 public:
Chris@16 169
Chris@16 170 list0() {}
Chris@16 171
Chris@16 172 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 173
Chris@16 174 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 175
Chris@16 176 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 177
Chris@16 178 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 179
Chris@16 180 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 181
Chris@16 182 template<class R, class F, class A> R operator()(type<R>, F & f, A &, long)
Chris@16 183 {
Chris@16 184 return unwrapper<F>::unwrap(f, 0)();
Chris@16 185 }
Chris@16 186
Chris@16 187 template<class R, class F, class A> R operator()(type<R>, F const & f, A &, long) const
Chris@16 188 {
Chris@16 189 return unwrapper<F const>::unwrap(f, 0)();
Chris@16 190 }
Chris@16 191
Chris@16 192 template<class F, class A> void operator()(type<void>, F & f, A &, int)
Chris@16 193 {
Chris@16 194 unwrapper<F>::unwrap(f, 0)();
Chris@16 195 }
Chris@16 196
Chris@16 197 template<class F, class A> void operator()(type<void>, F const & f, A &, int) const
Chris@16 198 {
Chris@16 199 unwrapper<F const>::unwrap(f, 0)();
Chris@16 200 }
Chris@16 201
Chris@16 202 template<class V> void accept(V &) const
Chris@16 203 {
Chris@16 204 }
Chris@16 205
Chris@16 206 bool operator==(list0 const &) const
Chris@16 207 {
Chris@16 208 return true;
Chris@16 209 }
Chris@16 210 };
Chris@16 211
Chris@16 212 #ifdef BOOST_MSVC
Chris@16 213 // MSVC is bright enough to realise that the parameter rhs
Chris@16 214 // in operator==may be unused for some template argument types:
Chris@16 215 #pragma warning(push)
Chris@16 216 #pragma warning(disable:4100)
Chris@16 217 #endif
Chris@16 218
Chris@16 219 template< class A1 > class list1: private storage1< A1 >
Chris@16 220 {
Chris@16 221 private:
Chris@16 222
Chris@16 223 typedef storage1< A1 > base_type;
Chris@16 224
Chris@16 225 public:
Chris@16 226
Chris@16 227 explicit list1( A1 a1 ): base_type( a1 ) {}
Chris@16 228
Chris@16 229 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 230
Chris@16 231 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 232
Chris@16 233 template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
Chris@16 234
Chris@16 235 template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
Chris@16 236
Chris@16 237 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 238
Chris@16 239 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 240
Chris@16 241 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 242
Chris@16 243 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 244 {
Chris@16 245 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
Chris@16 246 }
Chris@16 247
Chris@16 248 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 249 {
Chris@16 250 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_]);
Chris@16 251 }
Chris@16 252
Chris@16 253 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 254 {
Chris@16 255 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
Chris@16 256 }
Chris@16 257
Chris@16 258 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 259 {
Chris@16 260 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_]);
Chris@16 261 }
Chris@16 262
Chris@16 263 template<class V> void accept(V & v) const
Chris@16 264 {
Chris@16 265 base_type::accept(v);
Chris@16 266 }
Chris@16 267
Chris@16 268 bool operator==(list1 const & rhs) const
Chris@16 269 {
Chris@16 270 return ref_compare(base_type::a1_, rhs.a1_, 0);
Chris@16 271 }
Chris@16 272 };
Chris@16 273
Chris@16 274 struct logical_and;
Chris@16 275 struct logical_or;
Chris@16 276
Chris@16 277 template< class A1, class A2 > class list2: private storage2< A1, A2 >
Chris@16 278 {
Chris@16 279 private:
Chris@16 280
Chris@16 281 typedef storage2< A1, A2 > base_type;
Chris@16 282
Chris@16 283 public:
Chris@16 284
Chris@16 285 list2( A1 a1, A2 a2 ): base_type( a1, a2 ) {}
Chris@16 286
Chris@16 287 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 288 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 289
Chris@16 290 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 291 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 292
Chris@16 293 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 294
Chris@16 295 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 296
Chris@16 297 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 298
Chris@16 299 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 300
Chris@16 301 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 302
Chris@16 303 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 304 {
Chris@16 305 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
Chris@16 306 }
Chris@16 307
Chris@16 308 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 309 {
Chris@16 310 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
Chris@16 311 }
Chris@16 312
Chris@16 313 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 314 {
Chris@16 315 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
Chris@16 316 }
Chris@16 317
Chris@16 318 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 319 {
Chris@16 320 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
Chris@16 321 }
Chris@16 322
Chris@16 323 template<class A> bool operator()( type<bool>, logical_and & /*f*/, A & a, int )
Chris@16 324 {
Chris@16 325 return a[ base_type::a1_ ] && a[ base_type::a2_ ];
Chris@16 326 }
Chris@16 327
Chris@16 328 template<class A> bool operator()( type<bool>, logical_and const & /*f*/, A & a, int ) const
Chris@16 329 {
Chris@16 330 return a[ base_type::a1_ ] && a[ base_type::a2_ ];
Chris@16 331 }
Chris@16 332
Chris@16 333 template<class A> bool operator()( type<bool>, logical_or & /*f*/, A & a, int )
Chris@16 334 {
Chris@16 335 return a[ base_type::a1_ ] || a[ base_type::a2_ ];
Chris@16 336 }
Chris@16 337
Chris@16 338 template<class A> bool operator()( type<bool>, logical_or const & /*f*/, A & a, int ) const
Chris@16 339 {
Chris@16 340 return a[ base_type::a1_ ] || a[ base_type::a2_ ];
Chris@16 341 }
Chris@16 342
Chris@16 343 template<class V> void accept(V & v) const
Chris@16 344 {
Chris@16 345 base_type::accept(v);
Chris@16 346 }
Chris@16 347
Chris@16 348 bool operator==(list2 const & rhs) const
Chris@16 349 {
Chris@16 350 return ref_compare(base_type::a1_, rhs.a1_, 0) && ref_compare(base_type::a2_, rhs.a2_, 0);
Chris@16 351 }
Chris@16 352 };
Chris@16 353
Chris@16 354 template< class A1, class A2, class A3 > class list3: private storage3< A1, A2, A3 >
Chris@16 355 {
Chris@16 356 private:
Chris@16 357
Chris@16 358 typedef storage3< A1, A2, A3 > base_type;
Chris@16 359
Chris@16 360 public:
Chris@16 361
Chris@16 362 list3( A1 a1, A2 a2, A3 a3 ): base_type( a1, a2, a3 ) {}
Chris@16 363
Chris@16 364 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 365 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 366 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 367
Chris@16 368 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 369 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 370 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 371
Chris@16 372 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 373
Chris@16 374 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 375
Chris@16 376 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 377
Chris@16 378 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 379
Chris@16 380 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 381
Chris@16 382 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 383 {
Chris@16 384 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
Chris@16 385 }
Chris@16 386
Chris@16 387 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 388 {
Chris@16 389 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
Chris@16 390 }
Chris@16 391
Chris@16 392 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 393 {
Chris@16 394 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
Chris@16 395 }
Chris@16 396
Chris@16 397 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 398 {
Chris@16 399 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
Chris@16 400 }
Chris@16 401
Chris@16 402 template<class V> void accept(V & v) const
Chris@16 403 {
Chris@16 404 base_type::accept(v);
Chris@16 405 }
Chris@16 406
Chris@16 407 bool operator==(list3 const & rhs) const
Chris@16 408 {
Chris@16 409 return
Chris@16 410
Chris@16 411 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 412 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 413 ref_compare( base_type::a3_, rhs.a3_, 0 );
Chris@16 414 }
Chris@16 415 };
Chris@16 416
Chris@16 417 template< class A1, class A2, class A3, class A4 > class list4: private storage4< A1, A2, A3, A4 >
Chris@16 418 {
Chris@16 419 private:
Chris@16 420
Chris@16 421 typedef storage4< A1, A2, A3, A4 > base_type;
Chris@16 422
Chris@16 423 public:
Chris@16 424
Chris@16 425 list4( A1 a1, A2 a2, A3 a3, A4 a4 ): base_type( a1, a2, a3, a4 ) {}
Chris@16 426
Chris@16 427 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 428 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 429 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 430 A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
Chris@16 431
Chris@16 432 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 433 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 434 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 435 A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
Chris@16 436
Chris@16 437 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 438
Chris@16 439 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 440
Chris@16 441 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 442
Chris@16 443 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 444
Chris@16 445 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 446
Chris@16 447 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 448 {
Chris@16 449 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
Chris@16 450 }
Chris@16 451
Chris@16 452 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 453 {
Chris@16 454 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
Chris@16 455 }
Chris@16 456
Chris@16 457 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 458 {
Chris@16 459 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
Chris@16 460 }
Chris@16 461
Chris@16 462 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 463 {
Chris@16 464 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
Chris@16 465 }
Chris@16 466
Chris@16 467 template<class V> void accept(V & v) const
Chris@16 468 {
Chris@16 469 base_type::accept(v);
Chris@16 470 }
Chris@16 471
Chris@16 472 bool operator==(list4 const & rhs) const
Chris@16 473 {
Chris@16 474 return
Chris@16 475
Chris@16 476 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 477 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 478 ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
Chris@16 479 ref_compare( base_type::a4_, rhs.a4_, 0 );
Chris@16 480 }
Chris@16 481 };
Chris@16 482
Chris@16 483 template< class A1, class A2, class A3, class A4, class A5 > class list5: private storage5< A1, A2, A3, A4, A5 >
Chris@16 484 {
Chris@16 485 private:
Chris@16 486
Chris@16 487 typedef storage5< A1, A2, A3, A4, A5 > base_type;
Chris@16 488
Chris@16 489 public:
Chris@16 490
Chris@16 491 list5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): base_type( a1, a2, a3, a4, a5 ) {}
Chris@16 492
Chris@16 493 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 494 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 495 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 496 A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
Chris@16 497 A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
Chris@16 498
Chris@16 499 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 500 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 501 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 502 A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
Chris@16 503 A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
Chris@16 504
Chris@16 505 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 506
Chris@16 507 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 508
Chris@16 509 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 510
Chris@16 511 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 512
Chris@16 513 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 514
Chris@16 515 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 516 {
Chris@16 517 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]);
Chris@16 518 }
Chris@16 519
Chris@16 520 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 521 {
Chris@16 522 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]);
Chris@16 523 }
Chris@16 524
Chris@16 525 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 526 {
Chris@16 527 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]);
Chris@16 528 }
Chris@16 529
Chris@16 530 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 531 {
Chris@16 532 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]);
Chris@16 533 }
Chris@16 534
Chris@16 535 template<class V> void accept(V & v) const
Chris@16 536 {
Chris@16 537 base_type::accept(v);
Chris@16 538 }
Chris@16 539
Chris@16 540 bool operator==(list5 const & rhs) const
Chris@16 541 {
Chris@16 542 return
Chris@16 543
Chris@16 544 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 545 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 546 ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
Chris@16 547 ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
Chris@16 548 ref_compare( base_type::a5_, rhs.a5_, 0 );
Chris@16 549 }
Chris@16 550 };
Chris@16 551
Chris@16 552 template<class A1, class A2, class A3, class A4, class A5, class A6> class list6: private storage6< A1, A2, A3, A4, A5, A6 >
Chris@16 553 {
Chris@16 554 private:
Chris@16 555
Chris@16 556 typedef storage6< A1, A2, A3, A4, A5, A6 > base_type;
Chris@16 557
Chris@16 558 public:
Chris@16 559
Chris@16 560 list6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): base_type( a1, a2, a3, a4, a5, a6 ) {}
Chris@16 561
Chris@16 562 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 563 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 564 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 565 A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
Chris@16 566 A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
Chris@16 567 A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
Chris@16 568
Chris@16 569 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 570 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 571 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 572 A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
Chris@16 573 A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
Chris@16 574 A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
Chris@16 575
Chris@16 576 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 577
Chris@16 578 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 579
Chris@16 580 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 581
Chris@16 582 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 583
Chris@16 584 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 585
Chris@16 586 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 587 {
Chris@16 588 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]);
Chris@16 589 }
Chris@16 590
Chris@16 591 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 592 {
Chris@16 593 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]);
Chris@16 594 }
Chris@16 595
Chris@16 596 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 597 {
Chris@16 598 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]);
Chris@16 599 }
Chris@16 600
Chris@16 601 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 602 {
Chris@16 603 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]);
Chris@16 604 }
Chris@16 605
Chris@16 606 template<class V> void accept(V & v) const
Chris@16 607 {
Chris@16 608 base_type::accept(v);
Chris@16 609 }
Chris@16 610
Chris@16 611 bool operator==(list6 const & rhs) const
Chris@16 612 {
Chris@16 613 return
Chris@16 614
Chris@16 615 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 616 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 617 ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
Chris@16 618 ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
Chris@16 619 ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
Chris@16 620 ref_compare( base_type::a6_, rhs.a6_, 0 );
Chris@16 621 }
Chris@16 622 };
Chris@16 623
Chris@16 624 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> class list7: private storage7< A1, A2, A3, A4, A5, A6, A7 >
Chris@16 625 {
Chris@16 626 private:
Chris@16 627
Chris@16 628 typedef storage7< A1, A2, A3, A4, A5, A6, A7 > base_type;
Chris@16 629
Chris@16 630 public:
Chris@16 631
Chris@16 632 list7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ): base_type( a1, a2, a3, a4, a5, a6, a7 ) {}
Chris@16 633
Chris@16 634 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 635 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 636 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 637 A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
Chris@16 638 A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
Chris@16 639 A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
Chris@16 640 A7 operator[] (boost::arg<7>) const { return base_type::a7_; }
Chris@16 641
Chris@16 642 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 643 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 644 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 645 A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
Chris@16 646 A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
Chris@16 647 A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
Chris@16 648 A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; }
Chris@16 649
Chris@16 650 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 651
Chris@16 652 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 653
Chris@16 654 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 655
Chris@16 656 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 657
Chris@16 658 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 659
Chris@16 660 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 661 {
Chris@16 662 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]);
Chris@16 663 }
Chris@16 664
Chris@16 665 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 666 {
Chris@16 667 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]);
Chris@16 668 }
Chris@16 669
Chris@16 670 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 671 {
Chris@16 672 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]);
Chris@16 673 }
Chris@16 674
Chris@16 675 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 676 {
Chris@16 677 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]);
Chris@16 678 }
Chris@16 679
Chris@16 680 template<class V> void accept(V & v) const
Chris@16 681 {
Chris@16 682 base_type::accept(v);
Chris@16 683 }
Chris@16 684
Chris@16 685 bool operator==(list7 const & rhs) const
Chris@16 686 {
Chris@16 687 return
Chris@16 688
Chris@16 689 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 690 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 691 ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
Chris@16 692 ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
Chris@16 693 ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
Chris@16 694 ref_compare( base_type::a6_, rhs.a6_, 0 ) &&
Chris@16 695 ref_compare( base_type::a7_, rhs.a7_, 0 );
Chris@16 696 }
Chris@16 697 };
Chris@16 698
Chris@16 699 template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class list8: private storage8< A1, A2, A3, A4, A5, A6, A7, A8 >
Chris@16 700 {
Chris@16 701 private:
Chris@16 702
Chris@16 703 typedef storage8< A1, A2, A3, A4, A5, A6, A7, A8 > base_type;
Chris@16 704
Chris@16 705 public:
Chris@16 706
Chris@16 707 list8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 ): base_type( a1, a2, a3, a4, a5, a6, a7, a8 ) {}
Chris@16 708
Chris@16 709 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 710 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 711 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 712 A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
Chris@16 713 A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
Chris@16 714 A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
Chris@16 715 A7 operator[] (boost::arg<7>) const { return base_type::a7_; }
Chris@16 716 A8 operator[] (boost::arg<8>) const { return base_type::a8_; }
Chris@16 717
Chris@16 718 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 719 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 720 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 721 A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
Chris@16 722 A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
Chris@16 723 A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
Chris@16 724 A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; }
Chris@16 725 A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; }
Chris@16 726
Chris@16 727 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 728
Chris@16 729 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 730
Chris@16 731 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 732
Chris@16 733 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 734
Chris@16 735 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 736
Chris@16 737 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 738 {
Chris@16 739 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]);
Chris@16 740 }
Chris@16 741
Chris@16 742 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 743 {
Chris@16 744 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]);
Chris@16 745 }
Chris@16 746
Chris@16 747 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 748 {
Chris@16 749 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]);
Chris@16 750 }
Chris@16 751
Chris@16 752 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 753 {
Chris@16 754 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]);
Chris@16 755 }
Chris@16 756
Chris@16 757 template<class V> void accept(V & v) const
Chris@16 758 {
Chris@16 759 base_type::accept(v);
Chris@16 760 }
Chris@16 761
Chris@16 762 bool operator==(list8 const & rhs) const
Chris@16 763 {
Chris@16 764 return
Chris@16 765
Chris@16 766 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 767 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 768 ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
Chris@16 769 ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
Chris@16 770 ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
Chris@16 771 ref_compare( base_type::a6_, rhs.a6_, 0 ) &&
Chris@16 772 ref_compare( base_type::a7_, rhs.a7_, 0 ) &&
Chris@16 773 ref_compare( base_type::a8_, rhs.a8_, 0 );
Chris@16 774 }
Chris@16 775 };
Chris@16 776
Chris@16 777 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> class list9: private storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 >
Chris@16 778 {
Chris@16 779 private:
Chris@16 780
Chris@16 781 typedef storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > base_type;
Chris@16 782
Chris@16 783 public:
Chris@16 784
Chris@16 785 list9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 ): base_type( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) {}
Chris@16 786
Chris@16 787 A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
Chris@16 788 A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
Chris@16 789 A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
Chris@16 790 A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
Chris@16 791 A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
Chris@16 792 A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
Chris@16 793 A7 operator[] (boost::arg<7>) const { return base_type::a7_; }
Chris@16 794 A8 operator[] (boost::arg<8>) const { return base_type::a8_; }
Chris@16 795 A9 operator[] (boost::arg<9>) const { return base_type::a9_; }
Chris@16 796
Chris@16 797 A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
Chris@16 798 A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
Chris@16 799 A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
Chris@16 800 A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
Chris@16 801 A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
Chris@16 802 A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
Chris@16 803 A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; }
Chris@16 804 A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; }
Chris@16 805 A9 operator[] (boost::arg<9> (*) ()) const { return base_type::a9_; }
Chris@16 806
Chris@16 807 template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
Chris@16 808
Chris@16 809 template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
Chris@16 810
Chris@16 811 template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
Chris@16 812
Chris@16 813 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
Chris@16 814
Chris@16 815 template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
Chris@16 816
Chris@16 817 template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
Chris@16 818 {
Chris@16 819 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]);
Chris@16 820 }
Chris@16 821
Chris@16 822 template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
Chris@16 823 {
Chris@16 824 return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]);
Chris@16 825 }
Chris@16 826
Chris@16 827 template<class F, class A> void operator()(type<void>, F & f, A & a, int)
Chris@16 828 {
Chris@16 829 unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]);
Chris@16 830 }
Chris@16 831
Chris@16 832 template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
Chris@16 833 {
Chris@16 834 unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]);
Chris@16 835 }
Chris@16 836
Chris@16 837 template<class V> void accept(V & v) const
Chris@16 838 {
Chris@16 839 base_type::accept(v);
Chris@16 840 }
Chris@16 841
Chris@16 842 bool operator==(list9 const & rhs) const
Chris@16 843 {
Chris@16 844 return
Chris@16 845
Chris@16 846 ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
Chris@16 847 ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
Chris@16 848 ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
Chris@16 849 ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
Chris@16 850 ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
Chris@16 851 ref_compare( base_type::a6_, rhs.a6_, 0 ) &&
Chris@16 852 ref_compare( base_type::a7_, rhs.a7_, 0 ) &&
Chris@16 853 ref_compare( base_type::a8_, rhs.a8_, 0 ) &&
Chris@16 854 ref_compare( base_type::a9_, rhs.a9_, 0 );
Chris@16 855 }
Chris@16 856 };
Chris@16 857
Chris@16 858 #ifdef BOOST_MSVC
Chris@16 859 #pragma warning(pop)
Chris@16 860 #endif
Chris@16 861
Chris@16 862 // bind_t
Chris@16 863
Chris@101 864 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
Chris@101 865
Chris@101 866 template< class A > struct list_add_cref
Chris@101 867 {
Chris@101 868 typedef A const & type;
Chris@101 869 };
Chris@101 870
Chris@101 871 template< class A > struct list_add_cref< A& >
Chris@101 872 {
Chris@101 873 typedef A & type;
Chris@101 874 };
Chris@101 875
Chris@101 876 template<class R, class F, class L> class bind_t
Chris@101 877 {
Chris@101 878 private:
Chris@101 879
Chris@101 880 F f_;
Chris@101 881 L l_;
Chris@101 882
Chris@101 883 public:
Chris@101 884
Chris@101 885 typedef typename result_traits<R, F>::type result_type;
Chris@101 886 typedef bind_t this_type;
Chris@101 887
Chris@101 888 bind_t( F f, L const & l ): f_( f ), l_( l ) {}
Chris@101 889
Chris@101 890 //
Chris@101 891
Chris@101 892 result_type operator()()
Chris@101 893 {
Chris@101 894 list0 a;
Chris@101 895 return l_( type<result_type>(), f_, a, 0 );
Chris@101 896 }
Chris@101 897
Chris@101 898 result_type operator()() const
Chris@101 899 {
Chris@101 900 list0 a;
Chris@101 901 return l_( type<result_type>(), f_, a, 0 );
Chris@101 902 }
Chris@101 903
Chris@101 904 template<class A1> result_type operator()( A1 && a1 )
Chris@101 905 {
Chris@101 906 list1< typename list_add_cref<A1>::type > a( a1 );
Chris@101 907 return l_( type<result_type>(), f_, a, 0 );
Chris@101 908 }
Chris@101 909
Chris@101 910 template<class A1> result_type operator()( A1 && a1 ) const
Chris@101 911 {
Chris@101 912 list1< typename list_add_cref<A1>::type > a( a1 );
Chris@101 913 return l_(type<result_type>(), f_, a, 0);
Chris@101 914 }
Chris@101 915
Chris@101 916 template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 )
Chris@101 917 {
Chris@101 918 list2< typename list_add_cref<A1>::type, typename list_add_cref<A2>::type > a( a1, a2 );
Chris@101 919 return l_( type<result_type>(), f_, a, 0 );
Chris@101 920 }
Chris@101 921
Chris@101 922 template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 ) const
Chris@101 923 {
Chris@101 924 list2< typename list_add_cref<A1>::type, typename list_add_cref<A2>::type > a( a1, a2 );
Chris@101 925 return l_( type<result_type>(), f_, a, 0 );
Chris@101 926 }
Chris@101 927
Chris@101 928 template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 )
Chris@101 929 {
Chris@101 930 list3<
Chris@101 931 typename list_add_cref<A1>::type,
Chris@101 932 typename list_add_cref<A2>::type,
Chris@101 933 typename list_add_cref<A3>::type
Chris@101 934 > a( a1, a2, a3 );
Chris@101 935
Chris@101 936 return l_( type<result_type>(), f_, a, 0 );
Chris@101 937 }
Chris@101 938
Chris@101 939 template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 ) const
Chris@101 940 {
Chris@101 941 list3<
Chris@101 942 typename list_add_cref<A1>::type,
Chris@101 943 typename list_add_cref<A2>::type,
Chris@101 944 typename list_add_cref<A3>::type
Chris@101 945 > a( a1, a2, a3 );
Chris@101 946
Chris@101 947 return l_( type<result_type>(), f_, a, 0 );
Chris@101 948 }
Chris@101 949
Chris@101 950 template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
Chris@101 951 {
Chris@101 952 list4<
Chris@101 953 typename list_add_cref<A1>::type,
Chris@101 954 typename list_add_cref<A2>::type,
Chris@101 955 typename list_add_cref<A3>::type,
Chris@101 956 typename list_add_cref<A4>::type
Chris@101 957 > a( a1, a2, a3, a4 );
Chris@101 958
Chris@101 959 return l_( type<result_type>(), f_, a, 0 );
Chris@101 960 }
Chris@101 961
Chris@101 962 template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) const
Chris@101 963 {
Chris@101 964 list4<
Chris@101 965 typename list_add_cref<A1>::type,
Chris@101 966 typename list_add_cref<A2>::type,
Chris@101 967 typename list_add_cref<A3>::type,
Chris@101 968 typename list_add_cref<A4>::type
Chris@101 969 > a( a1, a2, a3, a4 );
Chris@101 970
Chris@101 971 return l_( type<result_type>(), f_, a, 0 );
Chris@101 972 }
Chris@101 973
Chris@101 974 template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
Chris@101 975 {
Chris@101 976 list5<
Chris@101 977 typename list_add_cref<A1>::type,
Chris@101 978 typename list_add_cref<A2>::type,
Chris@101 979 typename list_add_cref<A3>::type,
Chris@101 980 typename list_add_cref<A4>::type,
Chris@101 981 typename list_add_cref<A5>::type
Chris@101 982 > a( a1, a2, a3, a4, a5 );
Chris@101 983
Chris@101 984 return l_( type<result_type>(), f_, a, 0 );
Chris@101 985 }
Chris@101 986
Chris@101 987 template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) const
Chris@101 988 {
Chris@101 989 list5<
Chris@101 990 typename list_add_cref<A1>::type,
Chris@101 991 typename list_add_cref<A2>::type,
Chris@101 992 typename list_add_cref<A3>::type,
Chris@101 993 typename list_add_cref<A4>::type,
Chris@101 994 typename list_add_cref<A5>::type
Chris@101 995 > a( a1, a2, a3, a4, a5 );
Chris@101 996
Chris@101 997 return l_( type<result_type>(), f_, a, 0 );
Chris@101 998 }
Chris@101 999
Chris@101 1000 template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
Chris@101 1001 {
Chris@101 1002 list6<
Chris@101 1003 typename list_add_cref<A1>::type,
Chris@101 1004 typename list_add_cref<A2>::type,
Chris@101 1005 typename list_add_cref<A3>::type,
Chris@101 1006 typename list_add_cref<A4>::type,
Chris@101 1007 typename list_add_cref<A5>::type,
Chris@101 1008 typename list_add_cref<A6>::type
Chris@101 1009 > a( a1, a2, a3, a4, a5, a6 );
Chris@101 1010
Chris@101 1011 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1012 }
Chris@101 1013
Chris@101 1014 template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) const
Chris@101 1015 {
Chris@101 1016 list6<
Chris@101 1017 typename list_add_cref<A1>::type,
Chris@101 1018 typename list_add_cref<A2>::type,
Chris@101 1019 typename list_add_cref<A3>::type,
Chris@101 1020 typename list_add_cref<A4>::type,
Chris@101 1021 typename list_add_cref<A5>::type,
Chris@101 1022 typename list_add_cref<A6>::type
Chris@101 1023 > a( a1, a2, a3, a4, a5, a6 );
Chris@101 1024
Chris@101 1025 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1026 }
Chris@101 1027
Chris@101 1028 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
Chris@101 1029 {
Chris@101 1030 list7<
Chris@101 1031 typename list_add_cref<A1>::type,
Chris@101 1032 typename list_add_cref<A2>::type,
Chris@101 1033 typename list_add_cref<A3>::type,
Chris@101 1034 typename list_add_cref<A4>::type,
Chris@101 1035 typename list_add_cref<A5>::type,
Chris@101 1036 typename list_add_cref<A6>::type,
Chris@101 1037 typename list_add_cref<A7>::type
Chris@101 1038 > a( a1, a2, a3, a4, a5, a6, a7 );
Chris@101 1039
Chris@101 1040 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1041 }
Chris@101 1042
Chris@101 1043 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) const
Chris@101 1044 {
Chris@101 1045 list7<
Chris@101 1046 typename list_add_cref<A1>::type,
Chris@101 1047 typename list_add_cref<A2>::type,
Chris@101 1048 typename list_add_cref<A3>::type,
Chris@101 1049 typename list_add_cref<A4>::type,
Chris@101 1050 typename list_add_cref<A5>::type,
Chris@101 1051 typename list_add_cref<A6>::type,
Chris@101 1052 typename list_add_cref<A7>::type
Chris@101 1053 > a( a1, a2, a3, a4, a5, a6, a7 );
Chris@101 1054
Chris@101 1055 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1056 }
Chris@101 1057
Chris@101 1058 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
Chris@101 1059 {
Chris@101 1060 list8<
Chris@101 1061 typename list_add_cref<A1>::type,
Chris@101 1062 typename list_add_cref<A2>::type,
Chris@101 1063 typename list_add_cref<A3>::type,
Chris@101 1064 typename list_add_cref<A4>::type,
Chris@101 1065 typename list_add_cref<A5>::type,
Chris@101 1066 typename list_add_cref<A6>::type,
Chris@101 1067 typename list_add_cref<A7>::type,
Chris@101 1068 typename list_add_cref<A8>::type
Chris@101 1069 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
Chris@101 1070
Chris@101 1071 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1072 }
Chris@101 1073
Chris@101 1074 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) const
Chris@101 1075 {
Chris@101 1076 list8<
Chris@101 1077 typename list_add_cref<A1>::type,
Chris@101 1078 typename list_add_cref<A2>::type,
Chris@101 1079 typename list_add_cref<A3>::type,
Chris@101 1080 typename list_add_cref<A4>::type,
Chris@101 1081 typename list_add_cref<A5>::type,
Chris@101 1082 typename list_add_cref<A6>::type,
Chris@101 1083 typename list_add_cref<A7>::type,
Chris@101 1084 typename list_add_cref<A8>::type
Chris@101 1085 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
Chris@101 1086
Chris@101 1087 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1088 }
Chris@101 1089
Chris@101 1090 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
Chris@101 1091 {
Chris@101 1092 list9<
Chris@101 1093 typename list_add_cref<A1>::type,
Chris@101 1094 typename list_add_cref<A2>::type,
Chris@101 1095 typename list_add_cref<A3>::type,
Chris@101 1096 typename list_add_cref<A4>::type,
Chris@101 1097 typename list_add_cref<A5>::type,
Chris@101 1098 typename list_add_cref<A6>::type,
Chris@101 1099 typename list_add_cref<A7>::type,
Chris@101 1100 typename list_add_cref<A8>::type,
Chris@101 1101 typename list_add_cref<A9>::type
Chris@101 1102 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
Chris@101 1103
Chris@101 1104 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1105 }
Chris@101 1106
Chris@101 1107 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) const
Chris@101 1108 {
Chris@101 1109 list9<
Chris@101 1110 typename list_add_cref<A1>::type,
Chris@101 1111 typename list_add_cref<A2>::type,
Chris@101 1112 typename list_add_cref<A3>::type,
Chris@101 1113 typename list_add_cref<A4>::type,
Chris@101 1114 typename list_add_cref<A5>::type,
Chris@101 1115 typename list_add_cref<A6>::type,
Chris@101 1116 typename list_add_cref<A7>::type,
Chris@101 1117 typename list_add_cref<A8>::type,
Chris@101 1118 typename list_add_cref<A9>::type
Chris@101 1119 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
Chris@101 1120
Chris@101 1121 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1122 }
Chris@101 1123
Chris@101 1124 //
Chris@101 1125
Chris@101 1126 template<class A> result_type eval( A & a )
Chris@101 1127 {
Chris@101 1128 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1129 }
Chris@101 1130
Chris@101 1131 template<class A> result_type eval( A & a ) const
Chris@101 1132 {
Chris@101 1133 return l_( type<result_type>(), f_, a, 0 );
Chris@101 1134 }
Chris@101 1135
Chris@101 1136 template<class V> void accept( V & v ) const
Chris@101 1137 {
Chris@101 1138 #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ )
Chris@101 1139 using boost::visit_each;
Chris@101 1140 #endif
Chris@101 1141
Chris@101 1142 BOOST_BIND_VISIT_EACH( v, f_, 0 );
Chris@101 1143 l_.accept( v );
Chris@101 1144 }
Chris@101 1145
Chris@101 1146 bool compare( this_type const & rhs ) const
Chris@101 1147 {
Chris@101 1148 return ref_compare( f_, rhs.f_, 0 ) && l_ == rhs.l_;
Chris@101 1149 }
Chris@101 1150 };
Chris@101 1151
Chris@101 1152 #elif !defined( BOOST_NO_VOID_RETURNS )
Chris@16 1153
Chris@16 1154 template<class R, class F, class L> class bind_t
Chris@16 1155 {
Chris@16 1156 public:
Chris@16 1157
Chris@16 1158 typedef bind_t this_type;
Chris@16 1159
Chris@16 1160 bind_t(F f, L const & l): f_(f), l_(l) {}
Chris@16 1161
Chris@16 1162 #define BOOST_BIND_RETURN return
Chris@16 1163 #include <boost/bind/bind_template.hpp>
Chris@16 1164 #undef BOOST_BIND_RETURN
Chris@16 1165
Chris@16 1166 };
Chris@16 1167
Chris@101 1168 #else // no void returns
Chris@16 1169
Chris@16 1170 template<class R> struct bind_t_generator
Chris@16 1171 {
Chris@16 1172
Chris@16 1173 template<class F, class L> class implementation
Chris@16 1174 {
Chris@16 1175 public:
Chris@16 1176
Chris@16 1177 typedef implementation this_type;
Chris@16 1178
Chris@16 1179 implementation(F f, L const & l): f_(f), l_(l) {}
Chris@16 1180
Chris@16 1181 #define BOOST_BIND_RETURN return
Chris@16 1182 #include <boost/bind/bind_template.hpp>
Chris@16 1183 #undef BOOST_BIND_RETURN
Chris@16 1184
Chris@16 1185 };
Chris@16 1186
Chris@16 1187 };
Chris@16 1188
Chris@16 1189 template<> struct bind_t_generator<void>
Chris@16 1190 {
Chris@16 1191
Chris@16 1192 template<class F, class L> class implementation
Chris@16 1193 {
Chris@16 1194 private:
Chris@16 1195
Chris@16 1196 typedef void R;
Chris@16 1197
Chris@16 1198 public:
Chris@16 1199
Chris@16 1200 typedef implementation this_type;
Chris@16 1201
Chris@16 1202 implementation(F f, L const & l): f_(f), l_(l) {}
Chris@16 1203
Chris@16 1204 #define BOOST_BIND_RETURN
Chris@16 1205 #include <boost/bind/bind_template.hpp>
Chris@16 1206 #undef BOOST_BIND_RETURN
Chris@16 1207
Chris@16 1208 };
Chris@16 1209
Chris@16 1210 };
Chris@16 1211
Chris@16 1212 template<class R2, class F, class L> class bind_t: public bind_t_generator<R2>::BOOST_NESTED_TEMPLATE implementation<F, L>
Chris@16 1213 {
Chris@16 1214 public:
Chris@16 1215
Chris@16 1216 bind_t(F f, L const & l): bind_t_generator<R2>::BOOST_NESTED_TEMPLATE implementation<F, L>(f, l) {}
Chris@16 1217
Chris@16 1218 };
Chris@16 1219
Chris@16 1220 #endif
Chris@16 1221
Chris@16 1222 // function_equal
Chris@16 1223
Chris@16 1224 #ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
Chris@16 1225
Chris@16 1226 // put overloads in _bi, rely on ADL
Chris@16 1227
Chris@16 1228 # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
Chris@16 1229
Chris@16 1230 template<class R, class F, class L> bool function_equal( bind_t<R, F, L> const & a, bind_t<R, F, L> const & b )
Chris@16 1231 {
Chris@16 1232 return a.compare(b);
Chris@16 1233 }
Chris@16 1234
Chris@16 1235 # else
Chris@16 1236
Chris@16 1237 template<class R, class F, class L> bool function_equal_impl( bind_t<R, F, L> const & a, bind_t<R, F, L> const & b, int )
Chris@16 1238 {
Chris@16 1239 return a.compare(b);
Chris@16 1240 }
Chris@16 1241
Chris@16 1242 # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
Chris@16 1243
Chris@16 1244 #else // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
Chris@16 1245
Chris@16 1246 // put overloads in boost
Chris@16 1247
Chris@16 1248 } // namespace _bi
Chris@16 1249
Chris@16 1250 # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
Chris@16 1251
Chris@16 1252 template<class R, class F, class L> bool function_equal( _bi::bind_t<R, F, L> const & a, _bi::bind_t<R, F, L> const & b )
Chris@16 1253 {
Chris@16 1254 return a.compare(b);
Chris@16 1255 }
Chris@16 1256
Chris@16 1257 # else
Chris@16 1258
Chris@16 1259 template<class R, class F, class L> bool function_equal_impl( _bi::bind_t<R, F, L> const & a, _bi::bind_t<R, F, L> const & b, int )
Chris@16 1260 {
Chris@16 1261 return a.compare(b);
Chris@16 1262 }
Chris@16 1263
Chris@16 1264 # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
Chris@16 1265
Chris@16 1266 namespace _bi
Chris@16 1267 {
Chris@16 1268
Chris@16 1269 #endif // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
Chris@16 1270
Chris@16 1271 // add_value
Chris@16 1272
Chris@16 1273 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || (__SUNPRO_CC >= 0x530)
Chris@16 1274
Chris@16 1275 #if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x582) )
Chris@16 1276
Chris@16 1277 template<class T> struct add_value
Chris@16 1278 {
Chris@16 1279 typedef _bi::value<T> type;
Chris@16 1280 };
Chris@16 1281
Chris@16 1282 #else
Chris@16 1283
Chris@16 1284 template< class T, int I > struct add_value_2
Chris@16 1285 {
Chris@16 1286 typedef boost::arg<I> type;
Chris@16 1287 };
Chris@16 1288
Chris@16 1289 template< class T > struct add_value_2< T, 0 >
Chris@16 1290 {
Chris@16 1291 typedef _bi::value< T > type;
Chris@16 1292 };
Chris@16 1293
Chris@16 1294 template<class T> struct add_value
Chris@16 1295 {
Chris@16 1296 typedef typename add_value_2< T, boost::is_placeholder< T >::value >::type type;
Chris@16 1297 };
Chris@16 1298
Chris@16 1299 #endif
Chris@16 1300
Chris@16 1301 template<class T> struct add_value< value<T> >
Chris@16 1302 {
Chris@16 1303 typedef _bi::value<T> type;
Chris@16 1304 };
Chris@16 1305
Chris@16 1306 template<class T> struct add_value< reference_wrapper<T> >
Chris@16 1307 {
Chris@16 1308 typedef reference_wrapper<T> type;
Chris@16 1309 };
Chris@16 1310
Chris@16 1311 template<int I> struct add_value< arg<I> >
Chris@16 1312 {
Chris@16 1313 typedef boost::arg<I> type;
Chris@16 1314 };
Chris@16 1315
Chris@16 1316 template<int I> struct add_value< arg<I> (*) () >
Chris@16 1317 {
Chris@16 1318 typedef boost::arg<I> (*type) ();
Chris@16 1319 };
Chris@16 1320
Chris@16 1321 template<class R, class F, class L> struct add_value< bind_t<R, F, L> >
Chris@16 1322 {
Chris@16 1323 typedef bind_t<R, F, L> type;
Chris@16 1324 };
Chris@16 1325
Chris@16 1326 #else
Chris@16 1327
Chris@16 1328 template<int I> struct _avt_0;
Chris@16 1329
Chris@16 1330 template<> struct _avt_0<1>
Chris@16 1331 {
Chris@16 1332 template<class T> struct inner
Chris@16 1333 {
Chris@16 1334 typedef T type;
Chris@16 1335 };
Chris@16 1336 };
Chris@16 1337
Chris@16 1338 template<> struct _avt_0<2>
Chris@16 1339 {
Chris@16 1340 template<class T> struct inner
Chris@16 1341 {
Chris@16 1342 typedef value<T> type;
Chris@16 1343 };
Chris@16 1344 };
Chris@16 1345
Chris@16 1346 typedef char (&_avt_r1) [1];
Chris@16 1347 typedef char (&_avt_r2) [2];
Chris@16 1348
Chris@16 1349 template<class T> _avt_r1 _avt_f(value<T>);
Chris@16 1350 template<class T> _avt_r1 _avt_f(reference_wrapper<T>);
Chris@16 1351 template<int I> _avt_r1 _avt_f(arg<I>);
Chris@16 1352 template<int I> _avt_r1 _avt_f(arg<I> (*) ());
Chris@16 1353 template<class R, class F, class L> _avt_r1 _avt_f(bind_t<R, F, L>);
Chris@16 1354
Chris@16 1355 _avt_r2 _avt_f(...);
Chris@16 1356
Chris@16 1357 template<class T> struct add_value
Chris@16 1358 {
Chris@16 1359 static T t();
Chris@16 1360 typedef typename _avt_0<sizeof(_avt_f(t()))>::template inner<T>::type type;
Chris@16 1361 };
Chris@16 1362
Chris@16 1363 #endif
Chris@16 1364
Chris@16 1365 // list_av_N
Chris@16 1366
Chris@16 1367 template<class A1> struct list_av_1
Chris@16 1368 {
Chris@16 1369 typedef typename add_value<A1>::type B1;
Chris@16 1370 typedef list1<B1> type;
Chris@16 1371 };
Chris@16 1372
Chris@16 1373 template<class A1, class A2> struct list_av_2
Chris@16 1374 {
Chris@16 1375 typedef typename add_value<A1>::type B1;
Chris@16 1376 typedef typename add_value<A2>::type B2;
Chris@16 1377 typedef list2<B1, B2> type;
Chris@16 1378 };
Chris@16 1379
Chris@16 1380 template<class A1, class A2, class A3> struct list_av_3
Chris@16 1381 {
Chris@16 1382 typedef typename add_value<A1>::type B1;
Chris@16 1383 typedef typename add_value<A2>::type B2;
Chris@16 1384 typedef typename add_value<A3>::type B3;
Chris@16 1385 typedef list3<B1, B2, B3> type;
Chris@16 1386 };
Chris@16 1387
Chris@16 1388 template<class A1, class A2, class A3, class A4> struct list_av_4
Chris@16 1389 {
Chris@16 1390 typedef typename add_value<A1>::type B1;
Chris@16 1391 typedef typename add_value<A2>::type B2;
Chris@16 1392 typedef typename add_value<A3>::type B3;
Chris@16 1393 typedef typename add_value<A4>::type B4;
Chris@16 1394 typedef list4<B1, B2, B3, B4> type;
Chris@16 1395 };
Chris@16 1396
Chris@16 1397 template<class A1, class A2, class A3, class A4, class A5> struct list_av_5
Chris@16 1398 {
Chris@16 1399 typedef typename add_value<A1>::type B1;
Chris@16 1400 typedef typename add_value<A2>::type B2;
Chris@16 1401 typedef typename add_value<A3>::type B3;
Chris@16 1402 typedef typename add_value<A4>::type B4;
Chris@16 1403 typedef typename add_value<A5>::type B5;
Chris@16 1404 typedef list5<B1, B2, B3, B4, B5> type;
Chris@16 1405 };
Chris@16 1406
Chris@16 1407 template<class A1, class A2, class A3, class A4, class A5, class A6> struct list_av_6
Chris@16 1408 {
Chris@16 1409 typedef typename add_value<A1>::type B1;
Chris@16 1410 typedef typename add_value<A2>::type B2;
Chris@16 1411 typedef typename add_value<A3>::type B3;
Chris@16 1412 typedef typename add_value<A4>::type B4;
Chris@16 1413 typedef typename add_value<A5>::type B5;
Chris@16 1414 typedef typename add_value<A6>::type B6;
Chris@16 1415 typedef list6<B1, B2, B3, B4, B5, B6> type;
Chris@16 1416 };
Chris@16 1417
Chris@16 1418 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct list_av_7
Chris@16 1419 {
Chris@16 1420 typedef typename add_value<A1>::type B1;
Chris@16 1421 typedef typename add_value<A2>::type B2;
Chris@16 1422 typedef typename add_value<A3>::type B3;
Chris@16 1423 typedef typename add_value<A4>::type B4;
Chris@16 1424 typedef typename add_value<A5>::type B5;
Chris@16 1425 typedef typename add_value<A6>::type B6;
Chris@16 1426 typedef typename add_value<A7>::type B7;
Chris@16 1427 typedef list7<B1, B2, B3, B4, B5, B6, B7> type;
Chris@16 1428 };
Chris@16 1429
Chris@16 1430 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> struct list_av_8
Chris@16 1431 {
Chris@16 1432 typedef typename add_value<A1>::type B1;
Chris@16 1433 typedef typename add_value<A2>::type B2;
Chris@16 1434 typedef typename add_value<A3>::type B3;
Chris@16 1435 typedef typename add_value<A4>::type B4;
Chris@16 1436 typedef typename add_value<A5>::type B5;
Chris@16 1437 typedef typename add_value<A6>::type B6;
Chris@16 1438 typedef typename add_value<A7>::type B7;
Chris@16 1439 typedef typename add_value<A8>::type B8;
Chris@16 1440 typedef list8<B1, B2, B3, B4, B5, B6, B7, B8> type;
Chris@16 1441 };
Chris@16 1442
Chris@16 1443 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> struct list_av_9
Chris@16 1444 {
Chris@16 1445 typedef typename add_value<A1>::type B1;
Chris@16 1446 typedef typename add_value<A2>::type B2;
Chris@16 1447 typedef typename add_value<A3>::type B3;
Chris@16 1448 typedef typename add_value<A4>::type B4;
Chris@16 1449 typedef typename add_value<A5>::type B5;
Chris@16 1450 typedef typename add_value<A6>::type B6;
Chris@16 1451 typedef typename add_value<A7>::type B7;
Chris@16 1452 typedef typename add_value<A8>::type B8;
Chris@16 1453 typedef typename add_value<A9>::type B9;
Chris@16 1454 typedef list9<B1, B2, B3, B4, B5, B6, B7, B8, B9> type;
Chris@16 1455 };
Chris@16 1456
Chris@16 1457 // operator!
Chris@16 1458
Chris@16 1459 struct logical_not
Chris@16 1460 {
Chris@16 1461 template<class V> bool operator()(V const & v) const { return !v; }
Chris@16 1462 };
Chris@16 1463
Chris@16 1464 template<class R, class F, class L>
Chris@16 1465 bind_t< bool, logical_not, list1< bind_t<R, F, L> > >
Chris@16 1466 operator! (bind_t<R, F, L> const & f)
Chris@16 1467 {
Chris@16 1468 typedef list1< bind_t<R, F, L> > list_type;
Chris@16 1469 return bind_t<bool, logical_not, list_type> ( logical_not(), list_type(f) );
Chris@16 1470 }
Chris@16 1471
Chris@16 1472 // relational operators
Chris@16 1473
Chris@16 1474 #define BOOST_BIND_OPERATOR( op, name ) \
Chris@16 1475 \
Chris@16 1476 struct name \
Chris@16 1477 { \
Chris@16 1478 template<class V, class W> bool operator()(V const & v, W const & w) const { return v op w; } \
Chris@16 1479 }; \
Chris@16 1480 \
Chris@16 1481 template<class R, class F, class L, class A2> \
Chris@16 1482 bind_t< bool, name, list2< bind_t<R, F, L>, typename add_value<A2>::type > > \
Chris@16 1483 operator op (bind_t<R, F, L> const & f, A2 a2) \
Chris@16 1484 { \
Chris@16 1485 typedef typename add_value<A2>::type B2; \
Chris@16 1486 typedef list2< bind_t<R, F, L>, B2> list_type; \
Chris@16 1487 return bind_t<bool, name, list_type> ( name(), list_type(f, a2) ); \
Chris@16 1488 }
Chris@16 1489
Chris@16 1490 BOOST_BIND_OPERATOR( ==, equal )
Chris@16 1491 BOOST_BIND_OPERATOR( !=, not_equal )
Chris@16 1492
Chris@16 1493 BOOST_BIND_OPERATOR( <, less )
Chris@16 1494 BOOST_BIND_OPERATOR( <=, less_equal )
Chris@16 1495
Chris@16 1496 BOOST_BIND_OPERATOR( >, greater )
Chris@16 1497 BOOST_BIND_OPERATOR( >=, greater_equal )
Chris@16 1498
Chris@16 1499 BOOST_BIND_OPERATOR( &&, logical_and )
Chris@16 1500 BOOST_BIND_OPERATOR( ||, logical_or )
Chris@16 1501
Chris@16 1502 #undef BOOST_BIND_OPERATOR
Chris@16 1503
Chris@16 1504 #if defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3)
Chris@16 1505
Chris@16 1506 // resolve ambiguity with rel_ops
Chris@16 1507
Chris@16 1508 #define BOOST_BIND_OPERATOR( op, name ) \
Chris@16 1509 \
Chris@16 1510 template<class R, class F, class L> \
Chris@16 1511 bind_t< bool, name, list2< bind_t<R, F, L>, bind_t<R, F, L> > > \
Chris@16 1512 operator op (bind_t<R, F, L> const & f, bind_t<R, F, L> const & g) \
Chris@16 1513 { \
Chris@16 1514 typedef list2< bind_t<R, F, L>, bind_t<R, F, L> > list_type; \
Chris@16 1515 return bind_t<bool, name, list_type> ( name(), list_type(f, g) ); \
Chris@16 1516 }
Chris@16 1517
Chris@16 1518 BOOST_BIND_OPERATOR( !=, not_equal )
Chris@16 1519 BOOST_BIND_OPERATOR( <=, less_equal )
Chris@16 1520 BOOST_BIND_OPERATOR( >, greater )
Chris@16 1521 BOOST_BIND_OPERATOR( >=, greater_equal )
Chris@16 1522
Chris@16 1523 #endif
Chris@16 1524
Chris@16 1525 // visit_each, ADL
Chris@16 1526
Chris@16 1527 #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ ) \
Chris@16 1528 && !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
Chris@16 1529
Chris@16 1530 template<class V, class T> void visit_each( V & v, value<T> const & t, int )
Chris@16 1531 {
Chris@16 1532 using boost::visit_each;
Chris@16 1533 BOOST_BIND_VISIT_EACH( v, t.get(), 0 );
Chris@16 1534 }
Chris@16 1535
Chris@16 1536 template<class V, class R, class F, class L> void visit_each( V & v, bind_t<R, F, L> const & t, int )
Chris@16 1537 {
Chris@16 1538 t.accept( v );
Chris@16 1539 }
Chris@16 1540
Chris@16 1541 #endif
Chris@16 1542
Chris@16 1543 } // namespace _bi
Chris@16 1544
Chris@16 1545 // visit_each, no ADL
Chris@16 1546
Chris@16 1547 #if defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) || defined( __BORLANDC__ ) \
Chris@16 1548 || (defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
Chris@16 1549
Chris@16 1550 template<class V, class T> void visit_each( V & v, _bi::value<T> const & t, int )
Chris@16 1551 {
Chris@16 1552 BOOST_BIND_VISIT_EACH( v, t.get(), 0 );
Chris@16 1553 }
Chris@16 1554
Chris@16 1555 template<class V, class R, class F, class L> void visit_each( V & v, _bi::bind_t<R, F, L> const & t, int )
Chris@16 1556 {
Chris@16 1557 t.accept( v );
Chris@16 1558 }
Chris@16 1559
Chris@16 1560 #endif
Chris@16 1561
Chris@16 1562 // is_bind_expression
Chris@16 1563
Chris@16 1564 template< class T > struct is_bind_expression
Chris@16 1565 {
Chris@16 1566 enum _vt { value = 0 };
Chris@16 1567 };
Chris@16 1568
Chris@16 1569 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
Chris@16 1570
Chris@16 1571 template< class R, class F, class L > struct is_bind_expression< _bi::bind_t< R, F, L > >
Chris@16 1572 {
Chris@16 1573 enum _vt { value = 1 };
Chris@16 1574 };
Chris@16 1575
Chris@16 1576 #endif
Chris@16 1577
Chris@16 1578 // bind
Chris@16 1579
Chris@16 1580 #ifndef BOOST_BIND
Chris@16 1581 #define BOOST_BIND bind
Chris@16 1582 #endif
Chris@16 1583
Chris@16 1584 // generic function objects
Chris@16 1585
Chris@16 1586 template<class R, class F>
Chris@16 1587 _bi::bind_t<R, F, _bi::list0>
Chris@16 1588 BOOST_BIND(F f)
Chris@16 1589 {
Chris@16 1590 typedef _bi::list0 list_type;
Chris@16 1591 return _bi::bind_t<R, F, list_type> (f, list_type());
Chris@16 1592 }
Chris@16 1593
Chris@16 1594 template<class R, class F, class A1>
Chris@16 1595 _bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
Chris@16 1596 BOOST_BIND(F f, A1 a1)
Chris@16 1597 {
Chris@16 1598 typedef typename _bi::list_av_1<A1>::type list_type;
Chris@16 1599 return _bi::bind_t<R, F, list_type> (f, list_type(a1));
Chris@16 1600 }
Chris@16 1601
Chris@16 1602 template<class R, class F, class A1, class A2>
Chris@16 1603 _bi::bind_t<R, F, typename _bi::list_av_2<A1, A2>::type>
Chris@16 1604 BOOST_BIND(F f, A1 a1, A2 a2)
Chris@16 1605 {
Chris@16 1606 typedef typename _bi::list_av_2<A1, A2>::type list_type;
Chris@16 1607 return _bi::bind_t<R, F, list_type> (f, list_type(a1, a2));
Chris@16 1608 }
Chris@16 1609
Chris@16 1610 template<class R, class F, class A1, class A2, class A3>
Chris@16 1611 _bi::bind_t<R, F, typename _bi::list_av_3<A1, A2, A3>::type>
Chris@16 1612 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3)
Chris@16 1613 {
Chris@16 1614 typedef typename _bi::list_av_3<A1, A2, A3>::type list_type;
Chris@16 1615 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3));
Chris@16 1616 }
Chris@16 1617
Chris@16 1618 template<class R, class F, class A1, class A2, class A3, class A4>
Chris@16 1619 _bi::bind_t<R, F, typename _bi::list_av_4<A1, A2, A3, A4>::type>
Chris@16 1620 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4)
Chris@16 1621 {
Chris@16 1622 typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type;
Chris@16 1623 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4));
Chris@16 1624 }
Chris@16 1625
Chris@16 1626 template<class R, class F, class A1, class A2, class A3, class A4, class A5>
Chris@16 1627 _bi::bind_t<R, F, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
Chris@16 1628 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
Chris@16 1629 {
Chris@16 1630 typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type;
Chris@16 1631 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5));
Chris@16 1632 }
Chris@16 1633
Chris@16 1634 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 1635 _bi::bind_t<R, F, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
Chris@16 1636 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
Chris@16 1637 {
Chris@16 1638 typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type;
Chris@16 1639 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6));
Chris@16 1640 }
Chris@16 1641
Chris@16 1642 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 1643 _bi::bind_t<R, F, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
Chris@16 1644 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
Chris@16 1645 {
Chris@16 1646 typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type;
Chris@16 1647 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7));
Chris@16 1648 }
Chris@16 1649
Chris@16 1650 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 1651 _bi::bind_t<R, F, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
Chris@16 1652 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
Chris@16 1653 {
Chris@16 1654 typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type;
Chris@16 1655 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8));
Chris@16 1656 }
Chris@16 1657
Chris@16 1658 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
Chris@16 1659 _bi::bind_t<R, F, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
Chris@16 1660 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
Chris@16 1661 {
Chris@16 1662 typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type;
Chris@16 1663 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9));
Chris@16 1664 }
Chris@16 1665
Chris@16 1666 // generic function objects, alternative syntax
Chris@16 1667
Chris@16 1668 template<class R, class F>
Chris@16 1669 _bi::bind_t<R, F, _bi::list0>
Chris@16 1670 BOOST_BIND(boost::type<R>, F f)
Chris@16 1671 {
Chris@16 1672 typedef _bi::list0 list_type;
Chris@16 1673 return _bi::bind_t<R, F, list_type> (f, list_type());
Chris@16 1674 }
Chris@16 1675
Chris@16 1676 template<class R, class F, class A1>
Chris@16 1677 _bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
Chris@16 1678 BOOST_BIND(boost::type<R>, F f, A1 a1)
Chris@16 1679 {
Chris@16 1680 typedef typename _bi::list_av_1<A1>::type list_type;
Chris@16 1681 return _bi::bind_t<R, F, list_type> (f, list_type(a1));
Chris@16 1682 }
Chris@16 1683
Chris@16 1684 template<class R, class F, class A1, class A2>
Chris@16 1685 _bi::bind_t<R, F, typename _bi::list_av_2<A1, A2>::type>
Chris@16 1686 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2)
Chris@16 1687 {
Chris@16 1688 typedef typename _bi::list_av_2<A1, A2>::type list_type;
Chris@16 1689 return _bi::bind_t<R, F, list_type> (f, list_type(a1, a2));
Chris@16 1690 }
Chris@16 1691
Chris@16 1692 template<class R, class F, class A1, class A2, class A3>
Chris@16 1693 _bi::bind_t<R, F, typename _bi::list_av_3<A1, A2, A3>::type>
Chris@16 1694 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3)
Chris@16 1695 {
Chris@16 1696 typedef typename _bi::list_av_3<A1, A2, A3>::type list_type;
Chris@16 1697 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3));
Chris@16 1698 }
Chris@16 1699
Chris@16 1700 template<class R, class F, class A1, class A2, class A3, class A4>
Chris@16 1701 _bi::bind_t<R, F, typename _bi::list_av_4<A1, A2, A3, A4>::type>
Chris@16 1702 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4)
Chris@16 1703 {
Chris@16 1704 typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type;
Chris@16 1705 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4));
Chris@16 1706 }
Chris@16 1707
Chris@16 1708 template<class R, class F, class A1, class A2, class A3, class A4, class A5>
Chris@16 1709 _bi::bind_t<R, F, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
Chris@16 1710 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
Chris@16 1711 {
Chris@16 1712 typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type;
Chris@16 1713 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5));
Chris@16 1714 }
Chris@16 1715
Chris@16 1716 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 1717 _bi::bind_t<R, F, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
Chris@16 1718 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
Chris@16 1719 {
Chris@16 1720 typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type;
Chris@16 1721 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6));
Chris@16 1722 }
Chris@16 1723
Chris@16 1724 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 1725 _bi::bind_t<R, F, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
Chris@16 1726 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
Chris@16 1727 {
Chris@16 1728 typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type;
Chris@16 1729 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7));
Chris@16 1730 }
Chris@16 1731
Chris@16 1732 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 1733 _bi::bind_t<R, F, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
Chris@16 1734 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
Chris@16 1735 {
Chris@16 1736 typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type;
Chris@16 1737 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8));
Chris@16 1738 }
Chris@16 1739
Chris@16 1740 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
Chris@16 1741 _bi::bind_t<R, F, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
Chris@16 1742 BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
Chris@16 1743 {
Chris@16 1744 typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type;
Chris@16 1745 return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9));
Chris@16 1746 }
Chris@16 1747
Chris@16 1748 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 1749
Chris@16 1750 // adaptable function objects
Chris@16 1751
Chris@16 1752 template<class F>
Chris@16 1753 _bi::bind_t<_bi::unspecified, F, _bi::list0>
Chris@16 1754 BOOST_BIND(F f)
Chris@16 1755 {
Chris@16 1756 typedef _bi::list0 list_type;
Chris@16 1757 return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type());
Chris@16 1758 }
Chris@16 1759
Chris@16 1760 template<class F, class A1>
Chris@16 1761 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_1<A1>::type>
Chris@16 1762 BOOST_BIND(F f, A1 a1)
Chris@16 1763 {
Chris@16 1764 typedef typename _bi::list_av_1<A1>::type list_type;
Chris@16 1765 return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type(a1));
Chris@16 1766 }
Chris@16 1767
Chris@16 1768 template<class F, class A1, class A2>
Chris@16 1769 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_2<A1, A2>::type>
Chris@16 1770 BOOST_BIND(F f, A1 a1, A2 a2)
Chris@16 1771 {
Chris@16 1772 typedef typename _bi::list_av_2<A1, A2>::type list_type;
Chris@16 1773 return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type(a1, a2));
Chris@16 1774 }
Chris@16 1775
Chris@16 1776 template<class F, class A1, class A2, class A3>
Chris@16 1777 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_3<A1, A2, A3>::type>
Chris@16 1778 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3)
Chris@16 1779 {
Chris@16 1780 typedef typename _bi::list_av_3<A1, A2, A3>::type list_type;
Chris@16 1781 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3));
Chris@16 1782 }
Chris@16 1783
Chris@16 1784 template<class F, class A1, class A2, class A3, class A4>
Chris@16 1785 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_4<A1, A2, A3, A4>::type>
Chris@16 1786 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4)
Chris@16 1787 {
Chris@16 1788 typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type;
Chris@16 1789 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4));
Chris@16 1790 }
Chris@16 1791
Chris@16 1792 template<class F, class A1, class A2, class A3, class A4, class A5>
Chris@16 1793 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
Chris@16 1794 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
Chris@16 1795 {
Chris@16 1796 typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type;
Chris@16 1797 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5));
Chris@16 1798 }
Chris@16 1799
Chris@16 1800 template<class F, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 1801 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
Chris@16 1802 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
Chris@16 1803 {
Chris@16 1804 typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type;
Chris@16 1805 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6));
Chris@16 1806 }
Chris@16 1807
Chris@16 1808 template<class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 1809 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
Chris@16 1810 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
Chris@16 1811 {
Chris@16 1812 typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type;
Chris@16 1813 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7));
Chris@16 1814 }
Chris@16 1815
Chris@16 1816 template<class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 1817 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
Chris@16 1818 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
Chris@16 1819 {
Chris@16 1820 typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type;
Chris@16 1821 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8));
Chris@16 1822 }
Chris@16 1823
Chris@16 1824 template<class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
Chris@16 1825 _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
Chris@16 1826 BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
Chris@16 1827 {
Chris@16 1828 typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type;
Chris@16 1829 return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9));
Chris@16 1830 }
Chris@16 1831
Chris@16 1832 #endif // !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
Chris@16 1833
Chris@16 1834 // function pointers
Chris@16 1835
Chris@16 1836 #define BOOST_BIND_CC
Chris@16 1837 #define BOOST_BIND_ST
Chris@16 1838
Chris@16 1839 #include <boost/bind/bind_cc.hpp>
Chris@16 1840
Chris@16 1841 #undef BOOST_BIND_CC
Chris@16 1842 #undef BOOST_BIND_ST
Chris@16 1843
Chris@16 1844 #ifdef BOOST_BIND_ENABLE_STDCALL
Chris@16 1845
Chris@16 1846 #define BOOST_BIND_CC __stdcall
Chris@16 1847 #define BOOST_BIND_ST
Chris@16 1848
Chris@16 1849 #include <boost/bind/bind_cc.hpp>
Chris@16 1850
Chris@16 1851 #undef BOOST_BIND_CC
Chris@16 1852 #undef BOOST_BIND_ST
Chris@16 1853
Chris@16 1854 #endif
Chris@16 1855
Chris@16 1856 #ifdef BOOST_BIND_ENABLE_FASTCALL
Chris@16 1857
Chris@16 1858 #define BOOST_BIND_CC __fastcall
Chris@16 1859 #define BOOST_BIND_ST
Chris@16 1860
Chris@16 1861 #include <boost/bind/bind_cc.hpp>
Chris@16 1862
Chris@16 1863 #undef BOOST_BIND_CC
Chris@16 1864 #undef BOOST_BIND_ST
Chris@16 1865
Chris@16 1866 #endif
Chris@16 1867
Chris@16 1868 #ifdef BOOST_BIND_ENABLE_PASCAL
Chris@16 1869
Chris@16 1870 #define BOOST_BIND_ST pascal
Chris@16 1871 #define BOOST_BIND_CC
Chris@16 1872
Chris@16 1873 #include <boost/bind/bind_cc.hpp>
Chris@16 1874
Chris@16 1875 #undef BOOST_BIND_ST
Chris@16 1876 #undef BOOST_BIND_CC
Chris@16 1877
Chris@16 1878 #endif
Chris@16 1879
Chris@16 1880 // member function pointers
Chris@16 1881
Chris@16 1882 #define BOOST_BIND_MF_NAME(X) X
Chris@16 1883 #define BOOST_BIND_MF_CC
Chris@16 1884
Chris@16 1885 #include <boost/bind/bind_mf_cc.hpp>
Chris@16 1886 #include <boost/bind/bind_mf2_cc.hpp>
Chris@16 1887
Chris@16 1888 #undef BOOST_BIND_MF_NAME
Chris@16 1889 #undef BOOST_BIND_MF_CC
Chris@16 1890
Chris@16 1891 #ifdef BOOST_MEM_FN_ENABLE_CDECL
Chris@16 1892
Chris@16 1893 #define BOOST_BIND_MF_NAME(X) X##_cdecl
Chris@16 1894 #define BOOST_BIND_MF_CC __cdecl
Chris@16 1895
Chris@16 1896 #include <boost/bind/bind_mf_cc.hpp>
Chris@16 1897 #include <boost/bind/bind_mf2_cc.hpp>
Chris@16 1898
Chris@16 1899 #undef BOOST_BIND_MF_NAME
Chris@16 1900 #undef BOOST_BIND_MF_CC
Chris@16 1901
Chris@16 1902 #endif
Chris@16 1903
Chris@16 1904 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
Chris@16 1905
Chris@16 1906 #define BOOST_BIND_MF_NAME(X) X##_stdcall
Chris@16 1907 #define BOOST_BIND_MF_CC __stdcall
Chris@16 1908
Chris@16 1909 #include <boost/bind/bind_mf_cc.hpp>
Chris@16 1910 #include <boost/bind/bind_mf2_cc.hpp>
Chris@16 1911
Chris@16 1912 #undef BOOST_BIND_MF_NAME
Chris@16 1913 #undef BOOST_BIND_MF_CC
Chris@16 1914
Chris@16 1915 #endif
Chris@16 1916
Chris@16 1917 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
Chris@16 1918
Chris@16 1919 #define BOOST_BIND_MF_NAME(X) X##_fastcall
Chris@16 1920 #define BOOST_BIND_MF_CC __fastcall
Chris@16 1921
Chris@16 1922 #include <boost/bind/bind_mf_cc.hpp>
Chris@16 1923 #include <boost/bind/bind_mf2_cc.hpp>
Chris@16 1924
Chris@16 1925 #undef BOOST_BIND_MF_NAME
Chris@16 1926 #undef BOOST_BIND_MF_CC
Chris@16 1927
Chris@16 1928 #endif
Chris@16 1929
Chris@16 1930 // data member pointers
Chris@16 1931
Chris@16 1932 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
Chris@16 1933 || ( defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x620 ) ) )
Chris@16 1934
Chris@16 1935 template<class R, class T, class A1>
Chris@16 1936 _bi::bind_t< R, _mfi::dm<R, T>, typename _bi::list_av_1<A1>::type >
Chris@16 1937 BOOST_BIND(R T::*f, A1 a1)
Chris@16 1938 {
Chris@16 1939 typedef _mfi::dm<R, T> F;
Chris@16 1940 typedef typename _bi::list_av_1<A1>::type list_type;
Chris@16 1941 return _bi::bind_t<R, F, list_type>( F(f), list_type(a1) );
Chris@16 1942 }
Chris@16 1943
Chris@16 1944 #else
Chris@16 1945
Chris@16 1946 namespace _bi
Chris@16 1947 {
Chris@16 1948
Chris@16 1949 template< class Pm, int I > struct add_cref;
Chris@16 1950
Chris@16 1951 template< class M, class T > struct add_cref< M T::*, 0 >
Chris@16 1952 {
Chris@16 1953 typedef M type;
Chris@16 1954 };
Chris@16 1955
Chris@16 1956 template< class M, class T > struct add_cref< M T::*, 1 >
Chris@16 1957 {
Chris@16 1958 #ifdef BOOST_MSVC
Chris@16 1959 #pragma warning(push)
Chris@16 1960 #pragma warning(disable:4180)
Chris@16 1961 #endif
Chris@16 1962 typedef M const & type;
Chris@16 1963 #ifdef BOOST_MSVC
Chris@16 1964 #pragma warning(pop)
Chris@16 1965 #endif
Chris@16 1966 };
Chris@16 1967
Chris@16 1968 template< class R, class T > struct add_cref< R (T::*) (), 1 >
Chris@16 1969 {
Chris@16 1970 typedef void type;
Chris@16 1971 };
Chris@16 1972
Chris@16 1973 #if !defined(__IBMCPP__) || __IBMCPP_FUNC_CV_TMPL_ARG_DEDUCTION
Chris@16 1974
Chris@16 1975 template< class R, class T > struct add_cref< R (T::*) () const, 1 >
Chris@16 1976 {
Chris@16 1977 typedef void type;
Chris@16 1978 };
Chris@16 1979
Chris@16 1980 #endif // __IBMCPP__
Chris@16 1981
Chris@16 1982 template<class R> struct isref
Chris@16 1983 {
Chris@16 1984 enum value_type { value = 0 };
Chris@16 1985 };
Chris@16 1986
Chris@16 1987 template<class R> struct isref< R& >
Chris@16 1988 {
Chris@16 1989 enum value_type { value = 1 };
Chris@16 1990 };
Chris@16 1991
Chris@16 1992 template<class R> struct isref< R* >
Chris@16 1993 {
Chris@16 1994 enum value_type { value = 1 };
Chris@16 1995 };
Chris@16 1996
Chris@16 1997 template<class Pm, class A1> struct dm_result
Chris@16 1998 {
Chris@16 1999 typedef typename add_cref< Pm, 1 >::type type;
Chris@16 2000 };
Chris@16 2001
Chris@16 2002 template<class Pm, class R, class F, class L> struct dm_result< Pm, bind_t<R, F, L> >
Chris@16 2003 {
Chris@16 2004 typedef typename bind_t<R, F, L>::result_type result_type;
Chris@16 2005 typedef typename add_cref< Pm, isref< result_type >::value >::type type;
Chris@16 2006 };
Chris@16 2007
Chris@16 2008 } // namespace _bi
Chris@16 2009
Chris@16 2010 template< class A1, class M, class T >
Chris@16 2011
Chris@16 2012 _bi::bind_t<
Chris@16 2013 typename _bi::dm_result< M T::*, A1 >::type,
Chris@16 2014 _mfi::dm<M, T>,
Chris@16 2015 typename _bi::list_av_1<A1>::type
Chris@16 2016 >
Chris@16 2017
Chris@16 2018 BOOST_BIND( M T::*f, A1 a1 )
Chris@16 2019 {
Chris@16 2020 typedef typename _bi::dm_result< M T::*, A1 >::type result_type;
Chris@16 2021 typedef _mfi::dm<M, T> F;
Chris@16 2022 typedef typename _bi::list_av_1<A1>::type list_type;
Chris@16 2023 return _bi::bind_t< result_type, F, list_type >( F( f ), list_type( a1 ) );
Chris@16 2024 }
Chris@16 2025
Chris@16 2026 #endif
Chris@16 2027
Chris@16 2028 } // namespace boost
Chris@16 2029
Chris@16 2030 #ifndef BOOST_BIND_NO_PLACEHOLDERS
Chris@16 2031
Chris@16 2032 # include <boost/bind/placeholders.hpp>
Chris@16 2033
Chris@16 2034 #endif
Chris@16 2035
Chris@16 2036 #ifdef BOOST_MSVC
Chris@16 2037 # pragma warning(default: 4512) // assignment operator could not be generated
Chris@16 2038 # pragma warning(pop)
Chris@16 2039 #endif
Chris@16 2040
Chris@16 2041 #endif // #ifndef BOOST_BIND_BIND_HPP_INCLUDED