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