1 #ifndef BOOST_BIND_BIND_HPP_INCLUDED
2 #define BOOST_BIND_BIND_HPP_INCLUDED
3 
4 // MS compatible compilers support #pragma once
5 
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
7 # pragma once
8 #endif
9 
10 //
11 //  bind.hpp - binds function objects to arguments
12 //
13 //  Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.
14 //  Copyright (c) 2001 David Abrahams
15 //  Copyright (c) 2005 Peter Dimov
16 //
17 // Distributed under the Boost Software License, Version 1.0. (See
18 // accompanying file LICENSE_1_0.txt or copy at
19 // http://www.boost.org/LICENSE_1_0.txt)
20 //
21 //  See http://www.boost.org/libs/bind/bind.html for documentation.
22 //
23 
24 #include <boost/config.hpp>
25 #include <boost/ref.hpp>
26 #include <boost/mem_fn.hpp>
27 #include <boost/type.hpp>
28 #include <boost/is_placeholder.hpp>
29 #include <boost/bind/arg.hpp>
30 #include <boost/detail/workaround.hpp>
31 #include <boost/visit_each.hpp>
32 #include <boost/core/enable_if.hpp>
33 #include <boost/core/is_same.hpp>
34 
35 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
36 #include <utility> // std::forward
37 #endif
38 
39 // Borland-specific bug, visit_each() silently fails to produce code
40 
41 #if defined(__BORLANDC__)
42 #  define BOOST_BIND_VISIT_EACH boost::visit_each
43 #else
44 #  define BOOST_BIND_VISIT_EACH visit_each
45 #endif
46 
47 #include <boost/bind/storage.hpp>
48 
49 #ifdef BOOST_MSVC
50 # pragma warning(push)
51 # pragma warning(disable: 4512) // assignment operator could not be generated
52 #endif
53 
54 namespace boost
55 {
56 
57 template<class T> class weak_ptr;
58 
59 namespace _bi // implementation details
60 {
61 
62 // result_traits
63 
64 template<class R, class F> struct result_traits
65 {
66     typedef R type;
67 };
68 
69 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
70 
71 struct unspecified {};
72 
73 template<class F> struct result_traits<unspecified, F>
74 {
75     typedef typename F::result_type type;
76 };
77 
78 template<class F> struct result_traits< unspecified, reference_wrapper<F> >
79 {
80     typedef typename F::result_type type;
81 };
82 
83 #endif
84 
85 // ref_compare
86 
ref_compare(T const & a,T const & b,long)87 template<class T> bool ref_compare( T const & a, T const & b, long )
88 {
89     return a == b;
90 }
91 
ref_compare(arg<I> const &,arg<I> const &,int)92 template<int I> bool ref_compare( arg<I> const &, arg<I> const &, int )
93 {
94     return true;
95 }
96 
ref_compare(arg<I> (*)(),arg<I> (*)(),int)97 template<int I> bool ref_compare( arg<I> (*) (), arg<I> (*) (), int )
98 {
99     return true;
100 }
101 
ref_compare(reference_wrapper<T> const & a,reference_wrapper<T> const & b,int)102 template<class T> bool ref_compare( reference_wrapper<T> const & a, reference_wrapper<T> const & b, int )
103 {
104     return a.get_pointer() == b.get_pointer();
105 }
106 
107 // bind_t forward declaration for listN
108 
109 template<class R, class F, class L> class bind_t;
110 
ref_compare(bind_t<R,F,L> const & a,bind_t<R,F,L> const & b,int)111 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 )
112 {
113     return a.compare( b );
114 }
115 
116 // value
117 
118 template<class T> class value
119 {
120 public:
121 
value(T const & t)122     value(T const & t): t_(t) {}
123 
get()124     T & get() { return t_; }
get() const125     T const & get() const { return t_; }
126 
operator ==(value const & rhs) const127     bool operator==(value const & rhs) const
128     {
129         return t_ == rhs.t_;
130     }
131 
132 private:
133 
134     T t_;
135 };
136 
137 // ref_compare for weak_ptr
138 
ref_compare(value<weak_ptr<T>> const & a,value<weak_ptr<T>> const & b,int)139 template<class T> bool ref_compare( value< weak_ptr<T> > const & a, value< weak_ptr<T> > const & b, int )
140 {
141     return !(a.get() < b.get()) && !(b.get() < a.get());
142 }
143 
144 // type
145 
146 template<class T> class type {};
147 
148 // unwrap
149 
150 template<class F> struct unwrapper
151 {
unwrapboost::_bi::unwrapper152     static inline F & unwrap( F & f, long )
153     {
154         return f;
155     }
156 
unwrapboost::_bi::unwrapper157     template<class F2> static inline F2 & unwrap( reference_wrapper<F2> rf, int )
158     {
159         return rf.get();
160     }
161 
unwrapboost::_bi::unwrapper162     template<class R, class T> static inline _mfi::dm<R, T> unwrap( R T::* pm, int )
163     {
164         return _mfi::dm<R, T>( pm );
165     }
166 };
167 
168 // listN
169 
170 class list0
171 {
172 public:
173 
list0()174     list0() {}
175 
operator [](_bi::value<T> & v) const176     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
177 
operator [](_bi::value<T> const & v) const178     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
179 
operator [](reference_wrapper<T> const & v) const180     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
181 
operator [](bind_t<R,F,L> & b) const182     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); }
183 
operator [](bind_t<R,F,L> const & b) const184     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); }
185 
186     template<class R, class F, class A> R operator()(type<R>, F & f, A &, long)
187     {
188         return unwrapper<F>::unwrap(f, 0)();
189     }
190 
191     template<class R, class F, class A> R operator()(type<R>, F const & f, A &, long) const
192     {
193         return unwrapper<F const>::unwrap(f, 0)();
194     }
195 
operator ()(type<void>,F & f,A &,int)196     template<class F, class A> void operator()(type<void>, F & f, A &, int)
197     {
198         unwrapper<F>::unwrap(f, 0)();
199     }
200 
operator ()(type<void>,F const & f,A &,int) const201     template<class F, class A> void operator()(type<void>, F const & f, A &, int) const
202     {
203         unwrapper<F const>::unwrap(f, 0)();
204     }
205 
accept(V &) const206     template<class V> void accept(V &) const
207     {
208     }
209 
operator ==(list0 const &) const210     bool operator==(list0 const &) const
211     {
212         return true;
213     }
214 };
215 
216 #ifdef BOOST_MSVC
217 // MSVC is bright enough to realise that the parameter rhs
218 // in operator==may be unused for some template argument types:
219 #pragma warning(push)
220 #pragma warning(disable:4100)
221 #endif
222 
223 template< class A1 > class list1: private storage1< A1 >
224 {
225 private:
226 
227     typedef storage1< A1 > base_type;
228 
229 public:
230 
list1(A1 a1)231     explicit list1( A1 a1 ): base_type( a1 ) {}
232 
operator [](boost::arg<1>) const233     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
234 
operator [](boost::arg<1> (*)()) const235     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
236 
operator [](_bi::value<T> & v) const237     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
238 
operator [](_bi::value<T> const & v) const239     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
240 
operator [](reference_wrapper<T> const & v) const241     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
242 
operator [](bind_t<R,F,L> & b) const243     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); }
244 
operator [](bind_t<R,F,L> const & b) const245     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); }
246 
247     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
248     {
249         return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
250     }
251 
252     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
253     {
254         return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_]);
255     }
256 
operator ()(type<void>,F & f,A & a,int)257     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
258     {
259         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
260     }
261 
operator ()(type<void>,F const & f,A & a,int) const262     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
263     {
264         unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_]);
265     }
266 
accept(V & v) const267     template<class V> void accept(V & v) const
268     {
269         base_type::accept(v);
270     }
271 
operator ==(list1 const & rhs) const272     bool operator==(list1 const & rhs) const
273     {
274         return ref_compare(base_type::a1_, rhs.a1_, 0);
275     }
276 };
277 
278 struct logical_and;
279 struct logical_or;
280 
281 template< class A1, class A2 > class list2: private storage2< A1, A2 >
282 {
283 private:
284 
285     typedef storage2< A1, A2 > base_type;
286 
287 public:
288 
list2(A1 a1,A2 a2)289     list2( A1 a1, A2 a2 ): base_type( a1, a2 ) {}
290 
operator [](boost::arg<1>) const291     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const292     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
293 
operator [](boost::arg<1> (*)()) const294     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const295     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
296 
operator [](_bi::value<T> & v) const297     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
298 
operator [](_bi::value<T> const & v) const299     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
300 
operator [](reference_wrapper<T> const & v) const301     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
302 
operator [](bind_t<R,F,L> & b) const303     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); }
304 
operator [](bind_t<R,F,L> const & b) const305     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); }
306 
307     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
308     {
309         return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
310     }
311 
312     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
313     {
314         return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
315     }
316 
operator ()(type<void>,F & f,A & a,int)317     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
318     {
319         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
320     }
321 
operator ()(type<void>,F const & f,A & a,int) const322     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
323     {
324         unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
325     }
326 
operator ()(type<bool>,logical_and &,A & a,int)327     template<class A> bool operator()( type<bool>, logical_and & /*f*/, A & a, int )
328     {
329         return a[ base_type::a1_ ] && a[ base_type::a2_ ];
330     }
331 
operator ()(type<bool>,logical_and const &,A & a,int) const332     template<class A> bool operator()( type<bool>, logical_and const & /*f*/, A & a, int ) const
333     {
334         return a[ base_type::a1_ ] && a[ base_type::a2_ ];
335     }
336 
operator ()(type<bool>,logical_or &,A & a,int)337     template<class A> bool operator()( type<bool>, logical_or & /*f*/, A & a, int )
338     {
339         return a[ base_type::a1_ ] || a[ base_type::a2_ ];
340     }
341 
operator ()(type<bool>,logical_or const &,A & a,int) const342     template<class A> bool operator()( type<bool>, logical_or const & /*f*/, A & a, int ) const
343     {
344         return a[ base_type::a1_ ] || a[ base_type::a2_ ];
345     }
346 
accept(V & v) const347     template<class V> void accept(V & v) const
348     {
349         base_type::accept(v);
350     }
351 
operator ==(list2 const & rhs) const352     bool operator==(list2 const & rhs) const
353     {
354         return ref_compare(base_type::a1_, rhs.a1_, 0) && ref_compare(base_type::a2_, rhs.a2_, 0);
355     }
356 };
357 
358 template< class A1, class A2, class A3 > class list3: private storage3< A1, A2, A3 >
359 {
360 private:
361 
362     typedef storage3< A1, A2, A3 > base_type;
363 
364 public:
365 
list3(A1 a1,A2 a2,A3 a3)366     list3( A1 a1, A2 a2, A3 a3 ): base_type( a1, a2, a3 ) {}
367 
operator [](boost::arg<1>) const368     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const369     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const370     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
371 
operator [](boost::arg<1> (*)()) const372     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const373     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const374     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
375 
operator [](_bi::value<T> & v) const376     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
377 
operator [](_bi::value<T> const & v) const378     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
379 
operator [](reference_wrapper<T> const & v) const380     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
381 
operator [](bind_t<R,F,L> & b) const382     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); }
383 
operator [](bind_t<R,F,L> const & b) const384     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); }
385 
386     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
387     {
388         return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
389     }
390 
391     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
392     {
393         return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
394     }
395 
operator ()(type<void>,F & f,A & a,int)396     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
397     {
398         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
399     }
400 
operator ()(type<void>,F const & f,A & a,int) const401     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
402     {
403         unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]);
404     }
405 
accept(V & v) const406     template<class V> void accept(V & v) const
407     {
408         base_type::accept(v);
409     }
410 
operator ==(list3 const & rhs) const411     bool operator==(list3 const & rhs) const
412     {
413         return
414 
415             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
416             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
417             ref_compare( base_type::a3_, rhs.a3_, 0 );
418     }
419 };
420 
421 template< class A1, class A2, class A3, class A4 > class list4: private storage4< A1, A2, A3, A4 >
422 {
423 private:
424 
425     typedef storage4< A1, A2, A3, A4 > base_type;
426 
427 public:
428 
list4(A1 a1,A2 a2,A3 a3,A4 a4)429     list4( A1 a1, A2 a2, A3 a3, A4 a4 ): base_type( a1, a2, a3, a4 ) {}
430 
operator [](boost::arg<1>) const431     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const432     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const433     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
operator [](boost::arg<4>) const434     A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
435 
operator [](boost::arg<1> (*)()) const436     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const437     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const438     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
operator [](boost::arg<4> (*)()) const439     A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
440 
operator [](_bi::value<T> & v) const441     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
442 
operator [](_bi::value<T> const & v) const443     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
444 
operator [](reference_wrapper<T> const & v) const445     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
446 
operator [](bind_t<R,F,L> & b) const447     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); }
448 
operator [](bind_t<R,F,L> const & b) const449     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); }
450 
451     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
452     {
453         return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
454     }
455 
456     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
457     {
458         return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
459     }
460 
operator ()(type<void>,F & f,A & a,int)461     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
462     {
463         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
464     }
465 
operator ()(type<void>,F const & f,A & a,int) const466     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
467     {
468         unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]);
469     }
470 
accept(V & v) const471     template<class V> void accept(V & v) const
472     {
473         base_type::accept(v);
474     }
475 
operator ==(list4 const & rhs) const476     bool operator==(list4 const & rhs) const
477     {
478         return
479 
480             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
481             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
482             ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
483             ref_compare( base_type::a4_, rhs.a4_, 0 );
484     }
485 };
486 
487 template< class A1, class A2, class A3, class A4, class A5 > class list5: private storage5< A1, A2, A3, A4, A5 >
488 {
489 private:
490 
491     typedef storage5< A1, A2, A3, A4, A5 > base_type;
492 
493 public:
494 
list5(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)495     list5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): base_type( a1, a2, a3, a4, a5 ) {}
496 
operator [](boost::arg<1>) const497     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const498     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const499     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
operator [](boost::arg<4>) const500     A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
operator [](boost::arg<5>) const501     A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
502 
operator [](boost::arg<1> (*)()) const503     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const504     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const505     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
operator [](boost::arg<4> (*)()) const506     A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
operator [](boost::arg<5> (*)()) const507     A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
508 
operator [](_bi::value<T> & v) const509     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
510 
operator [](_bi::value<T> const & v) const511     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
512 
operator [](reference_wrapper<T> const & v) const513     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
514 
operator [](bind_t<R,F,L> & b) const515     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); }
516 
operator [](bind_t<R,F,L> const & b) const517     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); }
518 
519     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
520     {
521         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_]);
522     }
523 
524     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
525     {
526         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_]);
527     }
528 
operator ()(type<void>,F & f,A & a,int)529     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
530     {
531         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_]);
532     }
533 
operator ()(type<void>,F const & f,A & a,int) const534     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
535     {
536         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_]);
537     }
538 
accept(V & v) const539     template<class V> void accept(V & v) const
540     {
541         base_type::accept(v);
542     }
543 
operator ==(list5 const & rhs) const544     bool operator==(list5 const & rhs) const
545     {
546         return
547 
548             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
549             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
550             ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
551             ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
552             ref_compare( base_type::a5_, rhs.a5_, 0 );
553     }
554 };
555 
556 template<class A1, class A2, class A3, class A4, class A5, class A6> class list6: private storage6< A1, A2, A3, A4, A5, A6 >
557 {
558 private:
559 
560     typedef storage6< A1, A2, A3, A4, A5, A6 > base_type;
561 
562 public:
563 
list6(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)564     list6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): base_type( a1, a2, a3, a4, a5, a6 ) {}
565 
operator [](boost::arg<1>) const566     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const567     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const568     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
operator [](boost::arg<4>) const569     A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
operator [](boost::arg<5>) const570     A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
operator [](boost::arg<6>) const571     A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
572 
operator [](boost::arg<1> (*)()) const573     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const574     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const575     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
operator [](boost::arg<4> (*)()) const576     A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
operator [](boost::arg<5> (*)()) const577     A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
operator [](boost::arg<6> (*)()) const578     A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
579 
operator [](_bi::value<T> & v) const580     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
581 
operator [](_bi::value<T> const & v) const582     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
583 
operator [](reference_wrapper<T> const & v) const584     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
585 
operator [](bind_t<R,F,L> & b) const586     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); }
587 
operator [](bind_t<R,F,L> const & b) const588     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); }
589 
590     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
591     {
592         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_]);
593     }
594 
595     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
596     {
597         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_]);
598     }
599 
operator ()(type<void>,F & f,A & a,int)600     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
601     {
602         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_]);
603     }
604 
operator ()(type<void>,F const & f,A & a,int) const605     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
606     {
607         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_]);
608     }
609 
accept(V & v) const610     template<class V> void accept(V & v) const
611     {
612         base_type::accept(v);
613     }
614 
operator ==(list6 const & rhs) const615     bool operator==(list6 const & rhs) const
616     {
617         return
618 
619             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
620             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
621             ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
622             ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
623             ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
624             ref_compare( base_type::a6_, rhs.a6_, 0 );
625     }
626 };
627 
628 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 >
629 {
630 private:
631 
632     typedef storage7< A1, A2, A3, A4, A5, A6, A7 > base_type;
633 
634 public:
635 
list7(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7)636     list7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ): base_type( a1, a2, a3, a4, a5, a6, a7 ) {}
637 
operator [](boost::arg<1>) const638     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const639     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const640     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
operator [](boost::arg<4>) const641     A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
operator [](boost::arg<5>) const642     A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
operator [](boost::arg<6>) const643     A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
operator [](boost::arg<7>) const644     A7 operator[] (boost::arg<7>) const { return base_type::a7_; }
645 
operator [](boost::arg<1> (*)()) const646     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const647     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const648     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
operator [](boost::arg<4> (*)()) const649     A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
operator [](boost::arg<5> (*)()) const650     A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
operator [](boost::arg<6> (*)()) const651     A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
operator [](boost::arg<7> (*)()) const652     A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; }
653 
operator [](_bi::value<T> & v) const654     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
655 
operator [](_bi::value<T> const & v) const656     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
657 
operator [](reference_wrapper<T> const & v) const658     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
659 
operator [](bind_t<R,F,L> & b) const660     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); }
661 
operator [](bind_t<R,F,L> const & b) const662     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); }
663 
664     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
665     {
666         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_]);
667     }
668 
669     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
670     {
671         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_]);
672     }
673 
operator ()(type<void>,F & f,A & a,int)674     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
675     {
676         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_]);
677     }
678 
operator ()(type<void>,F const & f,A & a,int) const679     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
680     {
681         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_]);
682     }
683 
accept(V & v) const684     template<class V> void accept(V & v) const
685     {
686         base_type::accept(v);
687     }
688 
operator ==(list7 const & rhs) const689     bool operator==(list7 const & rhs) const
690     {
691         return
692 
693             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
694             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
695             ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
696             ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
697             ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
698             ref_compare( base_type::a6_, rhs.a6_, 0 ) &&
699             ref_compare( base_type::a7_, rhs.a7_, 0 );
700     }
701 };
702 
703 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 >
704 {
705 private:
706 
707     typedef storage8< A1, A2, A3, A4, A5, A6, A7, A8 > base_type;
708 
709 public:
710 
list8(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)711     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 ) {}
712 
operator [](boost::arg<1>) const713     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const714     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const715     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
operator [](boost::arg<4>) const716     A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
operator [](boost::arg<5>) const717     A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
operator [](boost::arg<6>) const718     A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
operator [](boost::arg<7>) const719     A7 operator[] (boost::arg<7>) const { return base_type::a7_; }
operator [](boost::arg<8>) const720     A8 operator[] (boost::arg<8>) const { return base_type::a8_; }
721 
operator [](boost::arg<1> (*)()) const722     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const723     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const724     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
operator [](boost::arg<4> (*)()) const725     A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
operator [](boost::arg<5> (*)()) const726     A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
operator [](boost::arg<6> (*)()) const727     A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
operator [](boost::arg<7> (*)()) const728     A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; }
operator [](boost::arg<8> (*)()) const729     A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; }
730 
operator [](_bi::value<T> & v) const731     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
732 
operator [](_bi::value<T> const & v) const733     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
734 
operator [](reference_wrapper<T> const & v) const735     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
736 
operator [](bind_t<R,F,L> & b) const737     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); }
738 
operator [](bind_t<R,F,L> const & b) const739     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); }
740 
741     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
742     {
743         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_]);
744     }
745 
746     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
747     {
748         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_]);
749     }
750 
operator ()(type<void>,F & f,A & a,int)751     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
752     {
753         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_]);
754     }
755 
operator ()(type<void>,F const & f,A & a,int) const756     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
757     {
758         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_]);
759     }
760 
accept(V & v) const761     template<class V> void accept(V & v) const
762     {
763         base_type::accept(v);
764     }
765 
operator ==(list8 const & rhs) const766     bool operator==(list8 const & rhs) const
767     {
768         return
769 
770             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
771             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
772             ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
773             ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
774             ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
775             ref_compare( base_type::a6_, rhs.a6_, 0 ) &&
776             ref_compare( base_type::a7_, rhs.a7_, 0 ) &&
777             ref_compare( base_type::a8_, rhs.a8_, 0 );
778     }
779 };
780 
781 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 >
782 {
783 private:
784 
785     typedef storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > base_type;
786 
787 public:
788 
list9(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9)789     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 ) {}
790 
operator [](boost::arg<1>) const791     A1 operator[] (boost::arg<1>) const { return base_type::a1_; }
operator [](boost::arg<2>) const792     A2 operator[] (boost::arg<2>) const { return base_type::a2_; }
operator [](boost::arg<3>) const793     A3 operator[] (boost::arg<3>) const { return base_type::a3_; }
operator [](boost::arg<4>) const794     A4 operator[] (boost::arg<4>) const { return base_type::a4_; }
operator [](boost::arg<5>) const795     A5 operator[] (boost::arg<5>) const { return base_type::a5_; }
operator [](boost::arg<6>) const796     A6 operator[] (boost::arg<6>) const { return base_type::a6_; }
operator [](boost::arg<7>) const797     A7 operator[] (boost::arg<7>) const { return base_type::a7_; }
operator [](boost::arg<8>) const798     A8 operator[] (boost::arg<8>) const { return base_type::a8_; }
operator [](boost::arg<9>) const799     A9 operator[] (boost::arg<9>) const { return base_type::a9_; }
800 
operator [](boost::arg<1> (*)()) const801     A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }
operator [](boost::arg<2> (*)()) const802     A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; }
operator [](boost::arg<3> (*)()) const803     A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; }
operator [](boost::arg<4> (*)()) const804     A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; }
operator [](boost::arg<5> (*)()) const805     A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; }
operator [](boost::arg<6> (*)()) const806     A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; }
operator [](boost::arg<7> (*)()) const807     A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; }
operator [](boost::arg<8> (*)()) const808     A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; }
operator [](boost::arg<9> (*)()) const809     A9 operator[] (boost::arg<9> (*) ()) const { return base_type::a9_; }
810 
operator [](_bi::value<T> & v) const811     template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }
812 
operator [](_bi::value<T> const & v) const813     template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }
814 
operator [](reference_wrapper<T> const & v) const815     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
816 
operator [](bind_t<R,F,L> & b) const817     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); }
818 
operator [](bind_t<R,F,L> const & b) const819     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); }
820 
821     template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
822     {
823         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_]);
824     }
825 
826     template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
827     {
828         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_]);
829     }
830 
operator ()(type<void>,F & f,A & a,int)831     template<class F, class A> void operator()(type<void>, F & f, A & a, int)
832     {
833         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_]);
834     }
835 
operator ()(type<void>,F const & f,A & a,int) const836     template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
837     {
838         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_]);
839     }
840 
accept(V & v) const841     template<class V> void accept(V & v) const
842     {
843         base_type::accept(v);
844     }
845 
operator ==(list9 const & rhs) const846     bool operator==(list9 const & rhs) const
847     {
848         return
849 
850             ref_compare( base_type::a1_, rhs.a1_, 0 ) &&
851             ref_compare( base_type::a2_, rhs.a2_, 0 ) &&
852             ref_compare( base_type::a3_, rhs.a3_, 0 ) &&
853             ref_compare( base_type::a4_, rhs.a4_, 0 ) &&
854             ref_compare( base_type::a5_, rhs.a5_, 0 ) &&
855             ref_compare( base_type::a6_, rhs.a6_, 0 ) &&
856             ref_compare( base_type::a7_, rhs.a7_, 0 ) &&
857             ref_compare( base_type::a8_, rhs.a8_, 0 ) &&
858             ref_compare( base_type::a9_, rhs.a9_, 0 );
859     }
860 };
861 
862 #ifdef BOOST_MSVC
863 #pragma warning(pop)
864 #endif
865 
866 // bind_t
867 
868 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
869 
870 template< class A1 > class rrlist1
871 {
872 private:
873 
874     A1 & a1_; // not A1&& because of msvc-10.0
875 
876 public:
877 
rrlist1(A1 & a1)878     explicit rrlist1( A1 & a1 ): a1_( a1 ) {}
879 
operator [](boost::arg<1>) const880     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); } // not static_cast because of g++ 4.9
881 
operator [](boost::arg<1> (*)()) const882     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
883 
operator [](_bi::value<T> & v) const884     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
885 
operator [](_bi::value<T> const & v) const886     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
887 
operator [](reference_wrapper<T> const & v) const888     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
889 
operator [](bind_t<R,F,L> & b) const890     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
891     {
892         rrlist1<A1&> a( a1_ );
893         return b.eval( a );
894     }
895 
operator [](bind_t<R,F,L> const & b) const896     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
897     {
898         rrlist1<A1&> a( a1_ );
899         return b.eval( a );
900     }
901 };
902 
903 template< class A1, class A2 > class rrlist2
904 {
905 private:
906 
907     A1 & a1_;
908     A2 & a2_;
909 
910 public:
911 
rrlist2(A1 & a1,A2 & a2)912     rrlist2( A1 & a1, A2 & a2 ): a1_( a1 ), a2_( a2 ) {}
913 
operator [](boost::arg<1>) const914     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const915     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
916 
operator [](boost::arg<1> (*)()) const917     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const918     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
919 
operator [](_bi::value<T> & v) const920     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
921 
operator [](_bi::value<T> const & v) const922     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
923 
operator [](reference_wrapper<T> const & v) const924     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
925 
operator [](bind_t<R,F,L> & b) const926     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
927     {
928         rrlist2<A1&, A2&> a( a1_, a2_ );
929         return b.eval( a );
930     }
931 
operator [](bind_t<R,F,L> const & b) const932     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
933     {
934         rrlist2<A1&, A2&> a( a1_, a2_ );
935         return b.eval( a );
936     }
937 };
938 
939 template< class A1, class A2, class A3 > class rrlist3
940 {
941 private:
942 
943     A1 & a1_;
944     A2 & a2_;
945     A3 & a3_;
946 
947 public:
948 
rrlist3(A1 & a1,A2 & a2,A3 & a3)949     rrlist3( A1 & a1, A2 & a2, A3 & a3 ): a1_( a1 ), a2_( a2 ), a3_( a3 ) {}
950 
operator [](boost::arg<1>) const951     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const952     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const953     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
954 
operator [](boost::arg<1> (*)()) const955     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const956     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const957     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
958 
operator [](_bi::value<T> & v) const959     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
960 
operator [](_bi::value<T> const & v) const961     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
962 
operator [](reference_wrapper<T> const & v) const963     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
964 
operator [](bind_t<R,F,L> & b) const965     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
966     {
967         rrlist3<A1&, A2&, A3&> a( a1_, a2_, a3_ );
968         return b.eval( a );
969     }
970 
operator [](bind_t<R,F,L> const & b) const971     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
972     {
973         rrlist3<A1&, A2&, A3&> a( a1_, a2_, a3_ );
974         return b.eval( a );
975     }
976 };
977 
978 template< class A1, class A2, class A3, class A4 > class rrlist4
979 {
980 private:
981 
982     A1 & a1_;
983     A2 & a2_;
984     A3 & a3_;
985     A4 & a4_;
986 
987 public:
988 
rrlist4(A1 & a1,A2 & a2,A3 & a3,A4 & a4)989     rrlist4( A1 & a1, A2 & a2, A3 & a3, A4 & a4 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ) {}
990 
operator [](boost::arg<1>) const991     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const992     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const993     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4>) const994     A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
995 
operator [](boost::arg<1> (*)()) const996     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const997     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const998     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4> (*)()) const999     A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
1000 
operator [](_bi::value<T> & v) const1001     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
1002 
operator [](_bi::value<T> const & v) const1003     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
1004 
operator [](reference_wrapper<T> const & v) const1005     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
1006 
operator [](bind_t<R,F,L> & b) const1007     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
1008     {
1009         rrlist4<A1&, A2&, A3&, A4&> a( a1_, a2_, a3_, a4_ );
1010         return b.eval( a );
1011     }
1012 
operator [](bind_t<R,F,L> const & b) const1013     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
1014     {
1015         rrlist4<A1&, A2&, A3&, A4&> a( a1_, a2_, a3_, a4_ );
1016         return b.eval( a );
1017     }
1018 };
1019 
1020 template< class A1, class A2, class A3, class A4, class A5 > class rrlist5
1021 {
1022 private:
1023 
1024     A1 & a1_;
1025     A2 & a2_;
1026     A3 & a3_;
1027     A4 & a4_;
1028     A5 & a5_;
1029 
1030 public:
1031 
rrlist5(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5)1032     rrlist5( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ) {}
1033 
operator [](boost::arg<1>) const1034     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const1035     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const1036     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4>) const1037     A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5>) const1038     A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
1039 
operator [](boost::arg<1> (*)()) const1040     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const1041     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const1042     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4> (*)()) const1043     A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5> (*)()) const1044     A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
1045 
operator [](_bi::value<T> & v) const1046     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
1047 
operator [](_bi::value<T> const & v) const1048     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
1049 
operator [](reference_wrapper<T> const & v) const1050     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
1051 
operator [](bind_t<R,F,L> & b) const1052     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
1053     {
1054         rrlist5<A1&, A2&, A3&, A4&, A5&> a( a1_, a2_, a3_, a4_, a5_ );
1055         return b.eval( a );
1056     }
1057 
operator [](bind_t<R,F,L> const & b) const1058     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
1059     {
1060         rrlist5<A1&, A2&, A3&, A4&, A5&> a( a1_, a2_, a3_, a4_, a5_ );
1061         return b.eval( a );
1062     }
1063 };
1064 
1065 template< class A1, class A2, class A3, class A4, class A5, class A6 > class rrlist6
1066 {
1067 private:
1068 
1069     A1 & a1_;
1070     A2 & a2_;
1071     A3 & a3_;
1072     A4 & a4_;
1073     A5 & a5_;
1074     A6 & a6_;
1075 
1076 public:
1077 
rrlist6(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6)1078     rrlist6( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ) {}
1079 
operator [](boost::arg<1>) const1080     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const1081     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const1082     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4>) const1083     A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5>) const1084     A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6>) const1085     A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
1086 
operator [](boost::arg<1> (*)()) const1087     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const1088     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const1089     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4> (*)()) const1090     A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5> (*)()) const1091     A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6> (*)()) const1092     A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
1093 
operator [](_bi::value<T> & v) const1094     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
1095 
operator [](_bi::value<T> const & v) const1096     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
1097 
operator [](reference_wrapper<T> const & v) const1098     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
1099 
operator [](bind_t<R,F,L> & b) const1100     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
1101     {
1102         rrlist6<A1&, A2&, A3&, A4&, A5&, A6&> a( a1_, a2_, a3_, a4_, a5_, a6_ );
1103         return b.eval( a );
1104     }
1105 
operator [](bind_t<R,F,L> const & b) const1106     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
1107     {
1108         rrlist6<A1&, A2&, A3&, A4&, A5&, A6&> a( a1_, a2_, a3_, a4_, a5_, a6_ );
1109         return b.eval( a );
1110     }
1111 };
1112 
1113 template< class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class rrlist7
1114 {
1115 private:
1116 
1117     A1 & a1_;
1118     A2 & a2_;
1119     A3 & a3_;
1120     A4 & a4_;
1121     A5 & a5_;
1122     A6 & a6_;
1123     A7 & a7_;
1124 
1125 public:
1126 
rrlist7(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7)1127     rrlist7( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ) {}
1128 
operator [](boost::arg<1>) const1129     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const1130     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const1131     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4>) const1132     A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5>) const1133     A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6>) const1134     A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
operator [](boost::arg<7>) const1135     A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
1136 
operator [](boost::arg<1> (*)()) const1137     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const1138     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const1139     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4> (*)()) const1140     A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5> (*)()) const1141     A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6> (*)()) const1142     A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
operator [](boost::arg<7> (*)()) const1143     A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
1144 
operator [](_bi::value<T> & v) const1145     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
1146 
operator [](_bi::value<T> const & v) const1147     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
1148 
operator [](reference_wrapper<T> const & v) const1149     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
1150 
operator [](bind_t<R,F,L> & b) const1151     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
1152     {
1153         rrlist7<A1&, A2&, A3&, A4&, A5&, A6&, A7&> a( a1_, a2_, a3_, a4_, a5_, a6_, a7_ );
1154         return b.eval( a );
1155     }
1156 
operator [](bind_t<R,F,L> const & b) const1157     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
1158     {
1159         rrlist7<A1&, A2&, A3&, A4&, A5&, A6&, A7&> a( a1_, a2_, a3_, a4_, a5_, a6_, a7_ );
1160         return b.eval( a );
1161     }
1162 };
1163 
1164 template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class rrlist8
1165 {
1166 private:
1167 
1168     A1 & a1_;
1169     A2 & a2_;
1170     A3 & a3_;
1171     A4 & a4_;
1172     A5 & a5_;
1173     A6 & a6_;
1174     A7 & a7_;
1175     A8 & a8_;
1176 
1177 public:
1178 
rrlist8(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8)1179     rrlist8( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ), a8_( a8 ) {}
1180 
operator [](boost::arg<1>) const1181     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const1182     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const1183     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4>) const1184     A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5>) const1185     A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6>) const1186     A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
operator [](boost::arg<7>) const1187     A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
operator [](boost::arg<8>) const1188     A8 && operator[] (boost::arg<8>) const { return std::forward<A8>( a8_ ); }
1189 
operator [](boost::arg<1> (*)()) const1190     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const1191     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const1192     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4> (*)()) const1193     A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5> (*)()) const1194     A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6> (*)()) const1195     A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
operator [](boost::arg<7> (*)()) const1196     A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
operator [](boost::arg<8> (*)()) const1197     A8 && operator[] (boost::arg<8> (*) ()) const { return std::forward<A8>( a8_ ); }
1198 
operator [](_bi::value<T> & v) const1199     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
1200 
operator [](_bi::value<T> const & v) const1201     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
1202 
operator [](reference_wrapper<T> const & v) const1203     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
1204 
operator [](bind_t<R,F,L> & b) const1205     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
1206     {
1207         rrlist8<A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&> a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_ );
1208         return b.eval( a );
1209     }
1210 
operator [](bind_t<R,F,L> const & b) const1211     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
1212     {
1213         rrlist8<A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&> a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_ );
1214         return b.eval( a );
1215     }
1216 };
1217 
1218 template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > class rrlist9
1219 {
1220 private:
1221 
1222     A1 & a1_;
1223     A2 & a2_;
1224     A3 & a3_;
1225     A4 & a4_;
1226     A5 & a5_;
1227     A6 & a6_;
1228     A7 & a7_;
1229     A8 & a8_;
1230     A9 & a9_;
1231 
1232 public:
1233 
rrlist9(A1 & a1,A2 & a2,A3 & a3,A4 & a4,A5 & a5,A6 & a6,A7 & a7,A8 & a8,A9 & a9)1234     rrlist9( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ), a8_( a8 ), a9_( a9 ) {}
1235 
operator [](boost::arg<1>) const1236     A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2>) const1237     A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3>) const1238     A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4>) const1239     A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5>) const1240     A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6>) const1241     A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
operator [](boost::arg<7>) const1242     A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
operator [](boost::arg<8>) const1243     A8 && operator[] (boost::arg<8>) const { return std::forward<A8>( a8_ ); }
operator [](boost::arg<9>) const1244     A9 && operator[] (boost::arg<9>) const { return std::forward<A9>( a9_ ); }
1245 
operator [](boost::arg<1> (*)()) const1246     A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
operator [](boost::arg<2> (*)()) const1247     A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
operator [](boost::arg<3> (*)()) const1248     A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
operator [](boost::arg<4> (*)()) const1249     A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
operator [](boost::arg<5> (*)()) const1250     A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
operator [](boost::arg<6> (*)()) const1251     A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
operator [](boost::arg<7> (*)()) const1252     A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
operator [](boost::arg<8> (*)()) const1253     A8 && operator[] (boost::arg<8> (*) ()) const { return std::forward<A8>( a8_ ); }
operator [](boost::arg<9> (*)()) const1254     A9 && operator[] (boost::arg<9> (*) ()) const { return std::forward<A9>( a9_ ); }
1255 
operator [](_bi::value<T> & v) const1256     template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
1257 
operator [](_bi::value<T> const & v) const1258     template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
1259 
operator [](reference_wrapper<T> const & v) const1260     template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
1261 
operator [](bind_t<R,F,L> & b) const1262     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const
1263     {
1264         rrlist9<A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&> a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_ );
1265         return b.eval( a );
1266     }
1267 
operator [](bind_t<R,F,L> const & b) const1268     template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const
1269     {
1270         rrlist9<A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&> a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_ );
1271         return b.eval( a );
1272     }
1273 };
1274 
1275 template<class R, class F, class L> class bind_t
1276 {
1277 private:
1278 
1279     F f_;
1280     L l_;
1281 
1282 public:
1283 
1284     typedef typename result_traits<R, F>::type result_type;
1285     typedef bind_t this_type;
1286 
bind_t(F f,L const & l)1287     bind_t( F f, L const & l ): f_( f ), l_( l ) {}
1288 
1289     //
1290 
operator ()()1291     result_type operator()()
1292     {
1293         list0 a;
1294         return l_( type<result_type>(), f_, a, 0 );
1295     }
1296 
operator ()() const1297     result_type operator()() const
1298     {
1299         list0 a;
1300         return l_( type<result_type>(), f_, a, 0 );
1301     }
1302 
operator ()(A1 && a1)1303     template<class A1> result_type operator()( A1 && a1 )
1304     {
1305         rrlist1< A1 > a( a1 );
1306         return l_( type<result_type>(), f_, a, 0 );
1307     }
1308 
operator ()(A1 && a1) const1309     template<class A1> result_type operator()( A1 && a1 ) const
1310     {
1311         rrlist1< A1 > a( a1 );
1312         return l_(type<result_type>(), f_, a, 0);
1313     }
1314 
operator ()(A1 && a1,A2 && a2)1315     template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 )
1316     {
1317         rrlist2< A1, A2 > a( a1, a2 );
1318         return l_( type<result_type>(), f_, a, 0 );
1319     }
1320 
operator ()(A1 && a1,A2 && a2) const1321     template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 ) const
1322     {
1323         rrlist2< A1, A2 > a( a1, a2 );
1324         return l_( type<result_type>(), f_, a, 0 );
1325     }
1326 
operator ()(A1 && a1,A2 && a2,A3 && a3)1327     template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 )
1328     {
1329         rrlist3< A1, A2, A3 > a( a1, a2, a3 );
1330         return l_( type<result_type>(), f_, a, 0 );
1331     }
1332 
operator ()(A1 && a1,A2 && a2,A3 && a3) const1333     template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 ) const
1334     {
1335         rrlist3< A1, A2, A3 > a( a1, a2, a3 );
1336         return l_( type<result_type>(), f_, a, 0 );
1337     }
1338 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4)1339     template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
1340     {
1341         rrlist4< A1, A2, A3, A4 > a( a1, a2, a3, a4 );
1342         return l_( type<result_type>(), f_, a, 0 );
1343     }
1344 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4) const1345     template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) const
1346     {
1347         rrlist4< A1, A2, A3, A4 > a( a1, a2, a3, a4 );
1348         return l_( type<result_type>(), f_, a, 0 );
1349     }
1350 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5)1351     template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
1352     {
1353         rrlist5< A1, A2, A3, A4, A5 > a( a1, a2, a3, a4, a5 );
1354         return l_( type<result_type>(), f_, a, 0 );
1355     }
1356 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5) const1357     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
1358     {
1359         rrlist5< A1, A2, A3, A4, A5 > a( a1, a2, a3, a4, a5 );
1360         return l_( type<result_type>(), f_, a, 0 );
1361     }
1362 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6)1363     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 )
1364     {
1365         rrlist6< A1, A2, A3, A4, A5, A6 > a( a1, a2, a3, a4, a5, a6 );
1366         return l_( type<result_type>(), f_, a, 0 );
1367     }
1368 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6) const1369     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
1370     {
1371         rrlist6< A1, A2, A3, A4, A5, A6 > a( a1, a2, a3, a4, a5, a6 );
1372         return l_( type<result_type>(), f_, a, 0 );
1373     }
1374 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7)1375     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 )
1376     {
1377         rrlist7< A1, A2, A3, A4, A5, A6, A7 > a( a1, a2, a3, a4, a5, a6, a7 );
1378         return l_( type<result_type>(), f_, a, 0 );
1379     }
1380 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7) const1381     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
1382     {
1383         rrlist7< A1, A2, A3, A4, A5, A6, A7 > a( a1, a2, a3, a4, a5, a6, a7 );
1384         return l_( type<result_type>(), f_, a, 0 );
1385     }
1386 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8)1387     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 )
1388     {
1389         rrlist8< A1, A2, A3, A4, A5, A6, A7, A8 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
1390         return l_( type<result_type>(), f_, a, 0 );
1391     }
1392 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8) const1393     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
1394     {
1395         rrlist8< A1, A2, A3, A4, A5, A6, A7, A8 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
1396         return l_( type<result_type>(), f_, a, 0 );
1397     }
1398 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8,A9 && a9)1399     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 )
1400     {
1401         rrlist9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1402         return l_( type<result_type>(), f_, a, 0 );
1403     }
1404 
operator ()(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8,A9 && a9) const1405     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
1406     {
1407         rrlist9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1408         return l_( type<result_type>(), f_, a, 0 );
1409     }
1410 
1411     //
1412 
eval(A & a)1413     template<class A> result_type eval( A & a )
1414     {
1415         return l_( type<result_type>(), f_, a, 0 );
1416     }
1417 
eval(A & a) const1418     template<class A> result_type eval( A & a ) const
1419     {
1420         return l_( type<result_type>(), f_, a, 0 );
1421     }
1422 
accept(V & v) const1423     template<class V> void accept( V & v ) const
1424     {
1425 #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ )
1426         using boost::visit_each;
1427 #endif
1428 
1429         BOOST_BIND_VISIT_EACH( v, f_, 0 );
1430         l_.accept( v );
1431     }
1432 
compare(this_type const & rhs) const1433     bool compare( this_type const & rhs ) const
1434     {
1435         return ref_compare( f_, rhs.f_, 0 ) && l_ == rhs.l_;
1436     }
1437 };
1438 
1439 #elif !defined( BOOST_NO_VOID_RETURNS )
1440 
1441 template<class R, class F, class L> class bind_t
1442 {
1443 public:
1444 
1445     typedef bind_t this_type;
1446 
bind_t(F f,L const & l)1447     bind_t(F f, L const & l): f_(f), l_(l) {}
1448 
1449 #define BOOST_BIND_RETURN return
1450 #include <boost/bind/bind_template.hpp>
1451 #undef BOOST_BIND_RETURN
1452 
1453 };
1454 
1455 #else // no void returns
1456 
1457 template<class R> struct bind_t_generator
1458 {
1459 
1460 template<class F, class L> class implementation
1461 {
1462 public:
1463 
1464     typedef implementation this_type;
1465 
implementation(F f,L const & l)1466     implementation(F f, L const & l): f_(f), l_(l) {}
1467 
1468 #define BOOST_BIND_RETURN return
1469 #include <boost/bind/bind_template.hpp>
1470 #undef BOOST_BIND_RETURN
1471 
1472 };
1473 
1474 };
1475 
1476 template<> struct bind_t_generator<void>
1477 {
1478 
1479 template<class F, class L> class implementation
1480 {
1481 private:
1482 
1483     typedef void R;
1484 
1485 public:
1486 
1487     typedef implementation this_type;
1488 
implementation(F f,L const & l)1489     implementation(F f, L const & l): f_(f), l_(l) {}
1490 
1491 #define BOOST_BIND_RETURN
1492 #include <boost/bind/bind_template.hpp>
1493 #undef BOOST_BIND_RETURN
1494 
1495 };
1496 
1497 };
1498 
1499 template<class R2, class F, class L> class bind_t: public bind_t_generator<R2>::BOOST_NESTED_TEMPLATE implementation<F, L>
1500 {
1501 public:
1502 
bind_t(F f,L const & l)1503     bind_t(F f, L const & l): bind_t_generator<R2>::BOOST_NESTED_TEMPLATE implementation<F, L>(f, l) {}
1504 
1505 };
1506 
1507 #endif
1508 
1509 // function_equal
1510 
1511 #ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
1512 
1513 // put overloads in _bi, rely on ADL
1514 
1515 # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1516 
function_equal(bind_t<R,F,L> const & a,bind_t<R,F,L> const & b)1517 template<class R, class F, class L> bool function_equal( bind_t<R, F, L> const & a, bind_t<R, F, L> const & b )
1518 {
1519     return a.compare(b);
1520 }
1521 
1522 # else
1523 
function_equal_impl(bind_t<R,F,L> const & a,bind_t<R,F,L> const & b,int)1524 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 )
1525 {
1526     return a.compare(b);
1527 }
1528 
1529 # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1530 
1531 #else // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
1532 
1533 // put overloads in boost
1534 
1535 } // namespace _bi
1536 
1537 # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1538 
function_equal(_bi::bind_t<R,F,L> const & a,_bi::bind_t<R,F,L> const & b)1539 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 )
1540 {
1541     return a.compare(b);
1542 }
1543 
1544 # else
1545 
function_equal_impl(_bi::bind_t<R,F,L> const & a,_bi::bind_t<R,F,L> const & b,int)1546 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 )
1547 {
1548     return a.compare(b);
1549 }
1550 
1551 # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1552 
1553 namespace _bi
1554 {
1555 
1556 #endif // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
1557 
1558 // add_value
1559 
1560 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || (__SUNPRO_CC >= 0x530)
1561 
1562 #if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x582) )
1563 
1564 template<class T> struct add_value
1565 {
1566     typedef _bi::value<T> type;
1567 };
1568 
1569 #else
1570 
1571 template< class T, int I > struct add_value_2
1572 {
1573     typedef boost::arg<I> type;
1574 };
1575 
1576 template< class T > struct add_value_2< T, 0 >
1577 {
1578     typedef _bi::value< T > type;
1579 };
1580 
1581 template<class T> struct add_value
1582 {
1583     typedef typename add_value_2< T, boost::is_placeholder< T >::value >::type type;
1584 };
1585 
1586 #endif
1587 
1588 template<class T> struct add_value< value<T> >
1589 {
1590     typedef _bi::value<T> type;
1591 };
1592 
1593 template<class T> struct add_value< reference_wrapper<T> >
1594 {
1595     typedef reference_wrapper<T> type;
1596 };
1597 
1598 template<int I> struct add_value< arg<I> >
1599 {
1600     typedef boost::arg<I> type;
1601 };
1602 
1603 template<int I> struct add_value< arg<I> (*) () >
1604 {
1605     typedef boost::arg<I> (*type) ();
1606 };
1607 
1608 template<class R, class F, class L> struct add_value< bind_t<R, F, L> >
1609 {
1610     typedef bind_t<R, F, L> type;
1611 };
1612 
1613 #else
1614 
1615 template<int I> struct _avt_0;
1616 
1617 template<> struct _avt_0<1>
1618 {
1619     template<class T> struct inner
1620     {
1621         typedef T type;
1622     };
1623 };
1624 
1625 template<> struct _avt_0<2>
1626 {
1627     template<class T> struct inner
1628     {
1629         typedef value<T> type;
1630     };
1631 };
1632 
1633 typedef char (&_avt_r1) [1];
1634 typedef char (&_avt_r2) [2];
1635 
1636 template<class T> _avt_r1 _avt_f(value<T>);
1637 template<class T> _avt_r1 _avt_f(reference_wrapper<T>);
1638 template<int I> _avt_r1 _avt_f(arg<I>);
1639 template<int I> _avt_r1 _avt_f(arg<I> (*) ());
1640 template<class R, class F, class L> _avt_r1 _avt_f(bind_t<R, F, L>);
1641 
1642 _avt_r2 _avt_f(...);
1643 
1644 template<class T> struct add_value
1645 {
1646     static T t();
1647     typedef typename _avt_0<sizeof(_avt_f(t()))>::template inner<T>::type type;
1648 };
1649 
1650 #endif
1651 
1652 // list_av_N
1653 
1654 template<class A1> struct list_av_1
1655 {
1656     typedef typename add_value<A1>::type B1;
1657     typedef list1<B1> type;
1658 };
1659 
1660 template<class A1, class A2> struct list_av_2
1661 {
1662     typedef typename add_value<A1>::type B1;
1663     typedef typename add_value<A2>::type B2;
1664     typedef list2<B1, B2> type;
1665 };
1666 
1667 template<class A1, class A2, class A3> struct list_av_3
1668 {
1669     typedef typename add_value<A1>::type B1;
1670     typedef typename add_value<A2>::type B2;
1671     typedef typename add_value<A3>::type B3;
1672     typedef list3<B1, B2, B3> type;
1673 };
1674 
1675 template<class A1, class A2, class A3, class A4> struct list_av_4
1676 {
1677     typedef typename add_value<A1>::type B1;
1678     typedef typename add_value<A2>::type B2;
1679     typedef typename add_value<A3>::type B3;
1680     typedef typename add_value<A4>::type B4;
1681     typedef list4<B1, B2, B3, B4> type;
1682 };
1683 
1684 template<class A1, class A2, class A3, class A4, class A5> struct list_av_5
1685 {
1686     typedef typename add_value<A1>::type B1;
1687     typedef typename add_value<A2>::type B2;
1688     typedef typename add_value<A3>::type B3;
1689     typedef typename add_value<A4>::type B4;
1690     typedef typename add_value<A5>::type B5;
1691     typedef list5<B1, B2, B3, B4, B5> type;
1692 };
1693 
1694 template<class A1, class A2, class A3, class A4, class A5, class A6> struct list_av_6
1695 {
1696     typedef typename add_value<A1>::type B1;
1697     typedef typename add_value<A2>::type B2;
1698     typedef typename add_value<A3>::type B3;
1699     typedef typename add_value<A4>::type B4;
1700     typedef typename add_value<A5>::type B5;
1701     typedef typename add_value<A6>::type B6;
1702     typedef list6<B1, B2, B3, B4, B5, B6> type;
1703 };
1704 
1705 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct list_av_7
1706 {
1707     typedef typename add_value<A1>::type B1;
1708     typedef typename add_value<A2>::type B2;
1709     typedef typename add_value<A3>::type B3;
1710     typedef typename add_value<A4>::type B4;
1711     typedef typename add_value<A5>::type B5;
1712     typedef typename add_value<A6>::type B6;
1713     typedef typename add_value<A7>::type B7;
1714     typedef list7<B1, B2, B3, B4, B5, B6, B7> type;
1715 };
1716 
1717 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> struct list_av_8
1718 {
1719     typedef typename add_value<A1>::type B1;
1720     typedef typename add_value<A2>::type B2;
1721     typedef typename add_value<A3>::type B3;
1722     typedef typename add_value<A4>::type B4;
1723     typedef typename add_value<A5>::type B5;
1724     typedef typename add_value<A6>::type B6;
1725     typedef typename add_value<A7>::type B7;
1726     typedef typename add_value<A8>::type B8;
1727     typedef list8<B1, B2, B3, B4, B5, B6, B7, B8> type;
1728 };
1729 
1730 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> struct list_av_9
1731 {
1732     typedef typename add_value<A1>::type B1;
1733     typedef typename add_value<A2>::type B2;
1734     typedef typename add_value<A3>::type B3;
1735     typedef typename add_value<A4>::type B4;
1736     typedef typename add_value<A5>::type B5;
1737     typedef typename add_value<A6>::type B6;
1738     typedef typename add_value<A7>::type B7;
1739     typedef typename add_value<A8>::type B8;
1740     typedef typename add_value<A9>::type B9;
1741     typedef list9<B1, B2, B3, B4, B5, B6, B7, B8, B9> type;
1742 };
1743 
1744 // operator!
1745 
1746 struct logical_not
1747 {
operator ()boost::_bi::logical_not1748     template<class V> bool operator()(V const & v) const { return !v; }
1749 };
1750 
1751 template<class R, class F, class L>
1752     bind_t< bool, logical_not, list1< bind_t<R, F, L> > >
operator !(bind_t<R,F,L> const & f)1753     operator! (bind_t<R, F, L> const & f)
1754 {
1755     typedef list1< bind_t<R, F, L> > list_type;
1756     return bind_t<bool, logical_not, list_type> ( logical_not(), list_type(f) );
1757 }
1758 
1759 // relational operators
1760 
1761 #define BOOST_BIND_OPERATOR( op, name ) \
1762 \
1763 struct name \
1764 { \
1765     template<class V, class W> bool operator()(V const & v, W const & w) const { return v op w; } \
1766 }; \
1767  \
1768 template<class R, class F, class L, class A2> \
1769     bind_t< bool, name, list2< bind_t<R, F, L>, typename add_value<A2>::type > > \
1770     operator op (bind_t<R, F, L> const & f, A2 a2) \
1771 { \
1772     typedef typename add_value<A2>::type B2; \
1773     typedef list2< bind_t<R, F, L>, B2> list_type; \
1774     return bind_t<bool, name, list_type> ( name(), list_type(f, a2) ); \
1775 }
1776 
1777 BOOST_BIND_OPERATOR( ==, equal )
1778 BOOST_BIND_OPERATOR( !=, not_equal )
1779 
1780 BOOST_BIND_OPERATOR( <, less )
1781 BOOST_BIND_OPERATOR( <=, less_equal )
1782 
1783 BOOST_BIND_OPERATOR( >, greater )
1784 BOOST_BIND_OPERATOR( >=, greater_equal )
1785 
1786 BOOST_BIND_OPERATOR( &&, logical_and )
1787 BOOST_BIND_OPERATOR( ||, logical_or )
1788 
1789 #undef BOOST_BIND_OPERATOR
1790 
1791 #if defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3)
1792 
1793 // resolve ambiguity with rel_ops
1794 
1795 #define BOOST_BIND_OPERATOR( op, name ) \
1796 \
1797 template<class R, class F, class L> \
1798     bind_t< bool, name, list2< bind_t<R, F, L>, bind_t<R, F, L> > > \
1799     operator op (bind_t<R, F, L> const & f, bind_t<R, F, L> const & g) \
1800 { \
1801     typedef list2< bind_t<R, F, L>, bind_t<R, F, L> > list_type; \
1802     return bind_t<bool, name, list_type> ( name(), list_type(f, g) ); \
1803 }
1804 
1805 BOOST_BIND_OPERATOR( !=, not_equal )
1806 BOOST_BIND_OPERATOR( <=, less_equal )
1807 BOOST_BIND_OPERATOR( >, greater )
1808 BOOST_BIND_OPERATOR( >=, greater_equal )
1809 
1810 #endif
1811 
1812 // visit_each, ADL
1813 
1814 #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ ) \
1815    && !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
1816 
visit_each(V & v,value<T> const & t,int)1817 template<class V, class T> void visit_each( V & v, value<T> const & t, int )
1818 {
1819     using boost::visit_each;
1820     BOOST_BIND_VISIT_EACH( v, t.get(), 0 );
1821 }
1822 
visit_each(V & v,bind_t<R,F,L> const & t,int)1823 template<class V, class R, class F, class L> void visit_each( V & v, bind_t<R, F, L> const & t, int )
1824 {
1825     t.accept( v );
1826 }
1827 
1828 #endif
1829 
1830 } // namespace _bi
1831 
1832 // visit_each, no ADL
1833 
1834 #if defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) || defined( __BORLANDC__ ) \
1835   || (defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
1836 
visit_each(V & v,_bi::value<T> const & t,int)1837 template<class V, class T> void visit_each( V & v, _bi::value<T> const & t, int )
1838 {
1839     BOOST_BIND_VISIT_EACH( v, t.get(), 0 );
1840 }
1841 
visit_each(V & v,_bi::bind_t<R,F,L> const & t,int)1842 template<class V, class R, class F, class L> void visit_each( V & v, _bi::bind_t<R, F, L> const & t, int )
1843 {
1844     t.accept( v );
1845 }
1846 
1847 #endif
1848 
1849 // is_bind_expression
1850 
1851 template< class T > struct is_bind_expression
1852 {
1853     enum _vt { value = 0 };
1854 };
1855 
1856 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
1857 
1858 template< class R, class F, class L > struct is_bind_expression< _bi::bind_t< R, F, L > >
1859 {
1860     enum _vt { value = 1 };
1861 };
1862 
1863 #endif
1864 
1865 // bind
1866 
1867 #ifndef BOOST_BIND
1868 #define BOOST_BIND bind
1869 #endif
1870 
1871 // generic function objects
1872 
1873 template<class R, class F>
1874     _bi::bind_t<R, F, _bi::list0>
BOOST_BIND(F f)1875     BOOST_BIND(F f)
1876 {
1877     typedef _bi::list0 list_type;
1878     return _bi::bind_t<R, F, list_type> (f, list_type());
1879 }
1880 
1881 template<class R, class F, class A1>
1882     _bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
BOOST_BIND(F f,A1 a1)1883     BOOST_BIND(F f, A1 a1)
1884 {
1885     typedef typename _bi::list_av_1<A1>::type list_type;
1886     return _bi::bind_t<R, F, list_type> (f, list_type(a1));
1887 }
1888 
1889 template<class R, class F, class A1, class A2>
1890     _bi::bind_t<R, F, typename _bi::list_av_2<A1, A2>::type>
BOOST_BIND(F f,A1 a1,A2 a2)1891     BOOST_BIND(F f, A1 a1, A2 a2)
1892 {
1893     typedef typename _bi::list_av_2<A1, A2>::type list_type;
1894     return _bi::bind_t<R, F, list_type> (f, list_type(a1, a2));
1895 }
1896 
1897 template<class R, class F, class A1, class A2, class A3>
1898     _bi::bind_t<R, F, typename _bi::list_av_3<A1, A2, A3>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3)1899     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3)
1900 {
1901     typedef typename _bi::list_av_3<A1, A2, A3>::type list_type;
1902     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3));
1903 }
1904 
1905 template<class R, class F, class A1, class A2, class A3, class A4>
1906     _bi::bind_t<R, F, typename _bi::list_av_4<A1, A2, A3, A4>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4)1907     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4)
1908 {
1909     typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type;
1910     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4));
1911 }
1912 
1913 template<class R, class F, class A1, class A2, class A3, class A4, class A5>
1914     _bi::bind_t<R, F, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)1915     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
1916 {
1917     typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type;
1918     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5));
1919 }
1920 
1921 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6>
1922     _bi::bind_t<R, F, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)1923     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
1924 {
1925     typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type;
1926     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6));
1927 }
1928 
1929 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
1930     _bi::bind_t<R, F, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7)1931     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
1932 {
1933     typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type;
1934     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7));
1935 }
1936 
1937 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
1938     _bi::bind_t<R, F, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)1939     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
1940 {
1941     typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type;
1942     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8));
1943 }
1944 
1945 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
1946     _bi::bind_t<R, F, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9)1947     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
1948 {
1949     typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type;
1950     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9));
1951 }
1952 
1953 // generic function objects, alternative syntax
1954 
1955 template<class R, class F>
1956     _bi::bind_t<R, F, _bi::list0>
BOOST_BIND(boost::type<R>,F f)1957     BOOST_BIND(boost::type<R>, F f)
1958 {
1959     typedef _bi::list0 list_type;
1960     return _bi::bind_t<R, F, list_type> (f, list_type());
1961 }
1962 
1963 template<class R, class F, class A1>
1964     _bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1)1965     BOOST_BIND(boost::type<R>, F f, A1 a1)
1966 {
1967     typedef typename _bi::list_av_1<A1>::type list_type;
1968     return _bi::bind_t<R, F, list_type> (f, list_type(a1));
1969 }
1970 
1971 template<class R, class F, class A1, class A2>
1972     _bi::bind_t<R, F, typename _bi::list_av_2<A1, A2>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2)1973     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2)
1974 {
1975     typedef typename _bi::list_av_2<A1, A2>::type list_type;
1976     return _bi::bind_t<R, F, list_type> (f, list_type(a1, a2));
1977 }
1978 
1979 template<class R, class F, class A1, class A2, class A3>
1980     _bi::bind_t<R, F, typename _bi::list_av_3<A1, A2, A3>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2,A3 a3)1981     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3)
1982 {
1983     typedef typename _bi::list_av_3<A1, A2, A3>::type list_type;
1984     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3));
1985 }
1986 
1987 template<class R, class F, class A1, class A2, class A3, class A4>
1988     _bi::bind_t<R, F, typename _bi::list_av_4<A1, A2, A3, A4>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2,A3 a3,A4 a4)1989     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4)
1990 {
1991     typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type;
1992     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4));
1993 }
1994 
1995 template<class R, class F, class A1, class A2, class A3, class A4, class A5>
1996     _bi::bind_t<R, F, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)1997     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
1998 {
1999     typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type;
2000     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5));
2001 }
2002 
2003 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6>
2004     _bi::bind_t<R, F, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)2005     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
2006 {
2007     typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type;
2008     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6));
2009 }
2010 
2011 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
2012     _bi::bind_t<R, F, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7)2013     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
2014 {
2015     typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type;
2016     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7));
2017 }
2018 
2019 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
2020     _bi::bind_t<R, F, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
BOOST_BIND(boost::type<R>,F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)2021     BOOST_BIND(boost::type<R>, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
2022 {
2023     typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type;
2024     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8));
2025 }
2026 
2027 template<class R, class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
2028     _bi::bind_t<R, F, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
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)2029     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)
2030 {
2031     typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type;
2032     return _bi::bind_t<R, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9));
2033 }
2034 
2035 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
2036 
2037 // adaptable function objects
2038 
2039 template<class F>
2040     _bi::bind_t<_bi::unspecified, F, _bi::list0>
BOOST_BIND(F f)2041     BOOST_BIND(F f)
2042 {
2043     typedef _bi::list0 list_type;
2044     return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type());
2045 }
2046 
2047 template<class F, class A1>
2048     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_1<A1>::type>
BOOST_BIND(F f,A1 a1)2049     BOOST_BIND(F f, A1 a1)
2050 {
2051     typedef typename _bi::list_av_1<A1>::type list_type;
2052     return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type(a1));
2053 }
2054 
2055 template<class F, class A1, class A2>
2056     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_2<A1, A2>::type>
BOOST_BIND(F f,A1 a1,A2 a2)2057     BOOST_BIND(F f, A1 a1, A2 a2)
2058 {
2059     typedef typename _bi::list_av_2<A1, A2>::type list_type;
2060     return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type(a1, a2));
2061 }
2062 
2063 template<class F, class A1, class A2, class A3>
2064     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_3<A1, A2, A3>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3)2065     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3)
2066 {
2067     typedef typename _bi::list_av_3<A1, A2, A3>::type list_type;
2068     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3));
2069 }
2070 
2071 template<class F, class A1, class A2, class A3, class A4>
2072     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_4<A1, A2, A3, A4>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4)2073     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4)
2074 {
2075     typedef typename _bi::list_av_4<A1, A2, A3, A4>::type list_type;
2076     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4));
2077 }
2078 
2079 template<class F, class A1, class A2, class A3, class A4, class A5>
2080     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)2081     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
2082 {
2083     typedef typename _bi::list_av_5<A1, A2, A3, A4, A5>::type list_type;
2084     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5));
2085 }
2086 
2087 template<class F, class A1, class A2, class A3, class A4, class A5, class A6>
2088     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)2089     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
2090 {
2091     typedef typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type list_type;
2092     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6));
2093 }
2094 
2095 template<class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
2096     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7)2097     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
2098 {
2099     typedef typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type list_type;
2100     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7));
2101 }
2102 
2103 template<class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
2104     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)2105     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
2106 {
2107     typedef typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type list_type;
2108     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8));
2109 }
2110 
2111 template<class F, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
2112     _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
BOOST_BIND(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9)2113     BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
2114 {
2115     typedef typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type list_type;
2116     return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9));
2117 }
2118 
2119 #endif // !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
2120 
2121 // function pointers
2122 
2123 #define BOOST_BIND_CC
2124 #define BOOST_BIND_ST
2125 #define BOOST_BIND_NOEXCEPT
2126 
2127 #include <boost/bind/bind_cc.hpp>
2128 
2129 # if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED )
2130 #   undef BOOST_BIND_NOEXCEPT
2131 #   define BOOST_BIND_NOEXCEPT noexcept
2132 #   include <boost/bind/bind_cc.hpp>
2133 # endif
2134 
2135 #undef BOOST_BIND_CC
2136 #undef BOOST_BIND_ST
2137 #undef BOOST_BIND_NOEXCEPT
2138 
2139 #ifdef BOOST_BIND_ENABLE_STDCALL
2140 
2141 #define BOOST_BIND_CC __stdcall
2142 #define BOOST_BIND_ST
2143 #define BOOST_BIND_NOEXCEPT
2144 
2145 #include <boost/bind/bind_cc.hpp>
2146 
2147 #undef BOOST_BIND_CC
2148 #undef BOOST_BIND_ST
2149 #undef BOOST_BIND_NOEXCEPT
2150 
2151 #endif
2152 
2153 #ifdef BOOST_BIND_ENABLE_FASTCALL
2154 
2155 #define BOOST_BIND_CC __fastcall
2156 #define BOOST_BIND_ST
2157 #define BOOST_BIND_NOEXCEPT
2158 
2159 #include <boost/bind/bind_cc.hpp>
2160 
2161 #undef BOOST_BIND_CC
2162 #undef BOOST_BIND_ST
2163 #undef BOOST_BIND_NOEXCEPT
2164 
2165 #endif
2166 
2167 #ifdef BOOST_BIND_ENABLE_PASCAL
2168 
2169 #define BOOST_BIND_ST pascal
2170 #define BOOST_BIND_CC
2171 #define BOOST_BIND_NOEXCEPT
2172 
2173 #include <boost/bind/bind_cc.hpp>
2174 
2175 #undef BOOST_BIND_ST
2176 #undef BOOST_BIND_CC
2177 #undef BOOST_BIND_NOEXCEPT
2178 
2179 #endif
2180 
2181 // member function pointers
2182 
2183 #define BOOST_BIND_MF_NAME(X) X
2184 #define BOOST_BIND_MF_CC
2185 #define BOOST_BIND_MF_NOEXCEPT
2186 
2187 #include <boost/bind/bind_mf_cc.hpp>
2188 #include <boost/bind/bind_mf2_cc.hpp>
2189 
2190 # if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED )
2191 #   undef BOOST_BIND_MF_NOEXCEPT
2192 #   define BOOST_BIND_MF_NOEXCEPT noexcept
2193 #   include <boost/bind/bind_mf_cc.hpp>
2194 # endif
2195 
2196 #undef BOOST_BIND_MF_NAME
2197 #undef BOOST_BIND_MF_CC
2198 #undef BOOST_BIND_MF_NOEXCEPT
2199 
2200 #ifdef BOOST_MEM_FN_ENABLE_CDECL
2201 
2202 #define BOOST_BIND_MF_NAME(X) X##_cdecl
2203 #define BOOST_BIND_MF_CC __cdecl
2204 #define BOOST_BIND_MF_NOEXCEPT
2205 
2206 #include <boost/bind/bind_mf_cc.hpp>
2207 #include <boost/bind/bind_mf2_cc.hpp>
2208 
2209 #undef BOOST_BIND_MF_NAME
2210 #undef BOOST_BIND_MF_CC
2211 #undef BOOST_BIND_MF_NOEXCEPT
2212 
2213 #endif
2214 
2215 #ifdef BOOST_MEM_FN_ENABLE_STDCALL
2216 
2217 #define BOOST_BIND_MF_NAME(X) X##_stdcall
2218 #define BOOST_BIND_MF_CC __stdcall
2219 #define BOOST_BIND_MF_NOEXCEPT
2220 
2221 #include <boost/bind/bind_mf_cc.hpp>
2222 #include <boost/bind/bind_mf2_cc.hpp>
2223 
2224 #undef BOOST_BIND_MF_NAME
2225 #undef BOOST_BIND_MF_CC
2226 #undef BOOST_BIND_MF_NOEXCEPT
2227 
2228 #endif
2229 
2230 #ifdef BOOST_MEM_FN_ENABLE_FASTCALL
2231 
2232 #define BOOST_BIND_MF_NAME(X) X##_fastcall
2233 #define BOOST_BIND_MF_CC __fastcall
2234 #define BOOST_BIND_MF_NOEXCEPT
2235 
2236 #include <boost/bind/bind_mf_cc.hpp>
2237 #include <boost/bind/bind_mf2_cc.hpp>
2238 
2239 #undef BOOST_BIND_MF_NAME
2240 #undef BOOST_BIND_MF_CC
2241 #undef BOOST_BIND_MF_NOEXCEPT
2242 
2243 #endif
2244 
2245 // data member pointers
2246 
2247 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
2248     || ( defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x620 ) ) )
2249 
2250 template<class R, class T, class A1>
2251 _bi::bind_t< R, _mfi::dm<R, T>, typename _bi::list_av_1<A1>::type >
BOOST_BIND(R T::* f,A1 a1)2252     BOOST_BIND(R T::*f, A1 a1)
2253 {
2254     typedef _mfi::dm<R, T> F;
2255     typedef typename _bi::list_av_1<A1>::type list_type;
2256     return _bi::bind_t<R, F, list_type>( F(f), list_type(a1) );
2257 }
2258 
2259 #else
2260 
2261 namespace _bi
2262 {
2263 
2264 template< class Pm, int I > struct add_cref;
2265 
2266 template< class M, class T > struct add_cref< M T::*, 0 >
2267 {
2268     typedef M type;
2269 };
2270 
2271 template< class M, class T > struct add_cref< M T::*, 1 >
2272 {
2273 #ifdef BOOST_MSVC
2274 #pragma warning(push)
2275 #pragma warning(disable:4180)
2276 #endif
2277     typedef M const & type;
2278 #ifdef BOOST_MSVC
2279 #pragma warning(pop)
2280 #endif
2281 };
2282 
2283 template< class R, class T > struct add_cref< R (T::*) (), 1 >
2284 {
2285     typedef void type;
2286 };
2287 
2288 #if !defined(__IBMCPP__) || __IBMCPP_FUNC_CV_TMPL_ARG_DEDUCTION
2289 
2290 template< class R, class T > struct add_cref< R (T::*) () const, 1 >
2291 {
2292     typedef void type;
2293 };
2294 
2295 #if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED )
2296 
2297 template< class R, class T > struct add_cref< R (T::*) () const noexcept, 1 >
2298 {
2299     typedef void type;
2300 };
2301 
2302 #endif // __cpp_noexcept_function_type
2303 
2304 #endif // __IBMCPP__
2305 
2306 template<class R> struct isref
2307 {
2308     enum value_type { value = 0 };
2309 };
2310 
2311 template<class R> struct isref< R& >
2312 {
2313     enum value_type { value = 1 };
2314 };
2315 
2316 template<class R> struct isref< R* >
2317 {
2318     enum value_type { value = 1 };
2319 };
2320 
2321 template<class Pm, class A1> struct dm_result
2322 {
2323     typedef typename add_cref< Pm, 1 >::type type;
2324 };
2325 
2326 template<class Pm, class R, class F, class L> struct dm_result< Pm, bind_t<R, F, L> >
2327 {
2328     typedef typename bind_t<R, F, L>::result_type result_type;
2329     typedef typename add_cref< Pm, isref< result_type >::value >::type type;
2330 };
2331 
2332 } // namespace _bi
2333 
2334 template< class A1, class M, class T >
2335 
2336 _bi::bind_t<
2337     typename _bi::dm_result< M T::*, A1 >::type,
2338     _mfi::dm<M, T>,
2339     typename _bi::list_av_1<A1>::type
2340 >
2341 
BOOST_BIND(M T::* f,A1 a1)2342 BOOST_BIND( M T::*f, A1 a1 )
2343 {
2344     typedef typename _bi::dm_result< M T::*, A1 >::type result_type;
2345     typedef _mfi::dm<M, T> F;
2346     typedef typename _bi::list_av_1<A1>::type list_type;
2347     return _bi::bind_t< result_type, F, list_type >( F( f ), list_type( a1 ) );
2348 }
2349 
2350 #endif
2351 
2352 } // namespace boost
2353 
2354 #ifndef BOOST_BIND_NO_PLACEHOLDERS
2355 
2356 # include <boost/bind/placeholders.hpp>
2357 
2358 #endif
2359 
2360 #ifdef BOOST_MSVC
2361 # pragma warning(default: 4512) // assignment operator could not be generated
2362 # pragma warning(pop)
2363 #endif
2364 
2365 #endif // #ifndef BOOST_BIND_BIND_HPP_INCLUDED
2366