blob: 6946aa9dd443eed1b360ea3b1a979fd7729552ca [file] [log] [blame]
Jeff Thompsonef2d5a42013-08-22 19:09:24 -07001//
2// bind/bind_template.hpp
3//
4// Do not include this header directly.
5//
6// Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.
7//
8// Distributed under the Boost Software License, Version 1.0. (See
9// accompanying file LICENSE_1_0.txt or copy at
10// http://www.boost.org/LICENSE_1_0.txt)
11//
12// See http://www.boost.org/libs/bind/bind.html for documentation.
13//
14
15 typedef typename result_traits<R, F>::type result_type;
16
17 result_type operator()()
18 {
19 list0 a;
20 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
21 }
22
23 result_type operator()() const
24 {
25 list0 a;
26 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
27 }
28
29 template<class A1> result_type operator()(A1 & a1)
30 {
31 list1<A1 &> a(a1);
32 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
33 }
34
35 template<class A1> result_type operator()(A1 & a1) const
36 {
37 list1<A1 &> a(a1);
38 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
39 }
40
41#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
42 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
43
44 template<class A1> result_type operator()(A1 const & a1)
45 {
46 list1<A1 const &> a(a1);
47 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
48 }
49
50 template<class A1> result_type operator()(A1 const & a1) const
51 {
52 list1<A1 const &> a(a1);
53 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
54 }
55
56#endif
57
58 template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
59 {
60 list2<A1 &, A2 &> a(a1, a2);
61 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
62 }
63
64 template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
65 {
66 list2<A1 &, A2 &> a(a1, a2);
67 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
68 }
69
70#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
71 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
72
73 template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
74 {
75 list2<A1 const &, A2 &> a(a1, a2);
76 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
77 }
78
79 template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
80 {
81 list2<A1 const &, A2 &> a(a1, a2);
82 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
83 }
84
85
86 template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
87 {
88 list2<A1 &, A2 const &> a(a1, a2);
89 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
90 }
91
92 template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
93 {
94 list2<A1 &, A2 const &> a(a1, a2);
95 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
96 }
97
98
99 template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
100 {
101 list2<A1 const &, A2 const &> a(a1, a2);
102 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
103 }
104
105 template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
106 {
107 list2<A1 const &, A2 const &> a(a1, a2);
108 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
109 }
110
111#endif
112
113 template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
114 {
115 list3<A1 &, A2 &, A3 &> a(a1, a2, a3);
116 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
117 }
118
119 template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
120 {
121 list3<A1 &, A2 &, A3 &> a(a1, a2, a3);
122 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
123 }
124
125#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
126 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
127
128 template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
129 {
130 list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3);
131 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
132 }
133
134 template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
135 {
136 list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3);
137 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
138 }
139
140#endif
141
142 template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
143 {
144 list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4);
145 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
146 }
147
148 template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
149 {
150 list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4);
151 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
152 }
153
154#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
155 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
156
157 template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
158 {
159 list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4);
160 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
161 }
162
163 template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) const
164 {
165 list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4);
166 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
167 }
168
169#endif
170
171 template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
172 {
173 list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5);
174 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
175 }
176
177 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
178 {
179 list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5);
180 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
181 }
182
183#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
184 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
185
186 template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5)
187 {
188 list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5);
189 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
190 }
191
192 template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) const
193 {
194 list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5);
195 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
196 }
197
198#endif
199
200 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)
201 {
202 list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6);
203 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
204 }
205
206 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
207 {
208 list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6);
209 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
210 }
211
212#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
213 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
214
215 template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6)
216 {
217 list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6);
218 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
219 }
220
221 template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) const
222 {
223 list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6);
224 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
225 }
226
227#endif
228
229 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)
230 {
231 list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7);
232 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
233 }
234
235 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
236 {
237 list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7);
238 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
239 }
240
241#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
242 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
243
244 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7)
245 {
246 list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7);
247 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
248 }
249
250 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) const
251 {
252 list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7);
253 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
254 }
255
256#endif
257
258 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)
259 {
260 list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8);
261 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
262 }
263
264 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
265 {
266 list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8);
267 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
268 }
269
270#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
271 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
272
273 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8)
274 {
275 list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8);
276 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
277 }
278
279 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) const
280 {
281 list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8);
282 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
283 }
284
285#endif
286
287 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)
288 {
289 list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
290 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
291 }
292
293 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
294 {
295 list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
296 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
297 }
298
299#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
300 && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
301
302 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9)
303 {
304 list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
305 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
306 }
307
308 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const
309 {
310 list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
311 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
312 }
313
314#endif
315
316 template<class A> result_type eval(A & a)
317 {
318 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
319 }
320
321 template<class A> result_type eval(A & a) const
322 {
323 BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
324 }
325
326 template<class V> void accept(V & v) const
327 {
328#if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ )
329
330 using ndnboost::visit_each;
331
332#endif
333 BOOST_BIND_VISIT_EACH(v, f_, 0);
334 l_.accept(v);
335 }
336
337 bool compare(this_type const & rhs) const
338 {
339 return ref_compare(f_, rhs.f_, 0) && l_ == rhs.l_;
340 }
341
342private:
343
344 F f_;
345 L l_;