Chris@16
|
1 // Boost Lambda Library -- loops.hpp ----------------------------------------
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
|
Chris@16
|
4 // Copyright (C) 2000 Gary Powell (powellg@amazon.com)
|
Chris@16
|
5 // Copyright (c) 2001-2002 Joel de Guzman
|
Chris@16
|
6 //
|
Chris@16
|
7 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
8 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
9 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
10 //
|
Chris@16
|
11 // For more information, see www.boost.org
|
Chris@16
|
12
|
Chris@16
|
13 // --------------------------------------------------------------------------
|
Chris@16
|
14
|
Chris@16
|
15 #if !defined(BOOST_LAMBDA_LOOPS_HPP)
|
Chris@16
|
16 #define BOOST_LAMBDA_LOOPS_HPP
|
Chris@16
|
17
|
Chris@16
|
18 #include "boost/lambda/core.hpp"
|
Chris@16
|
19
|
Chris@16
|
20 namespace boost {
|
Chris@16
|
21 namespace lambda {
|
Chris@16
|
22
|
Chris@16
|
23 // -- loop control structure actions ----------------------
|
Chris@16
|
24
|
Chris@16
|
25 class forloop_action {};
|
Chris@16
|
26 class forloop_no_body_action {};
|
Chris@16
|
27 class whileloop_action {};
|
Chris@16
|
28 class whileloop_no_body_action {};
|
Chris@16
|
29 class dowhileloop_action {};
|
Chris@16
|
30 class dowhileloop_no_body_action {};
|
Chris@16
|
31
|
Chris@16
|
32
|
Chris@16
|
33 // For loop
|
Chris@16
|
34 template <class Arg1, class Arg2, class Arg3, class Arg4>
|
Chris@16
|
35 inline const
|
Chris@16
|
36 lambda_functor<
|
Chris@16
|
37 lambda_functor_base<
|
Chris@16
|
38 forloop_action,
|
Chris@16
|
39 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
|
Chris@16
|
40 lambda_functor<Arg3>, lambda_functor<Arg4> >
|
Chris@16
|
41 >
|
Chris@16
|
42 >
|
Chris@16
|
43 for_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,
|
Chris@16
|
44 const lambda_functor<Arg3>& a3, const lambda_functor<Arg4>& a4) {
|
Chris@16
|
45 return
|
Chris@16
|
46 lambda_functor_base<
|
Chris@16
|
47 forloop_action,
|
Chris@16
|
48 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
|
Chris@16
|
49 lambda_functor<Arg3>, lambda_functor<Arg4> >
|
Chris@16
|
50 >
|
Chris@16
|
51 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
|
Chris@16
|
52 lambda_functor<Arg3>, lambda_functor<Arg4> >(a1, a2, a3, a4)
|
Chris@16
|
53 );
|
Chris@16
|
54 }
|
Chris@16
|
55
|
Chris@16
|
56 // No body case.
|
Chris@16
|
57 template <class Arg1, class Arg2, class Arg3>
|
Chris@16
|
58 inline const
|
Chris@16
|
59 lambda_functor<
|
Chris@16
|
60 lambda_functor_base<
|
Chris@16
|
61 forloop_no_body_action,
|
Chris@16
|
62 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>, lambda_functor<Arg3> >
|
Chris@16
|
63 >
|
Chris@16
|
64 >
|
Chris@16
|
65 for_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,
|
Chris@16
|
66 const lambda_functor<Arg3>& a3) {
|
Chris@16
|
67 return
|
Chris@16
|
68 lambda_functor_base<
|
Chris@16
|
69 forloop_no_body_action,
|
Chris@16
|
70 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
|
Chris@16
|
71 lambda_functor<Arg3> >
|
Chris@16
|
72 >
|
Chris@16
|
73 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
|
Chris@16
|
74 lambda_functor<Arg3> >(a1, a2, a3) );
|
Chris@16
|
75 }
|
Chris@16
|
76
|
Chris@16
|
77 // While loop
|
Chris@16
|
78 template <class Arg1, class Arg2>
|
Chris@16
|
79 inline const
|
Chris@16
|
80 lambda_functor<
|
Chris@16
|
81 lambda_functor_base<
|
Chris@16
|
82 whileloop_action,
|
Chris@16
|
83 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
|
Chris@16
|
84 >
|
Chris@16
|
85 >
|
Chris@16
|
86 while_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {
|
Chris@16
|
87 return
|
Chris@16
|
88 lambda_functor_base<
|
Chris@16
|
89 whileloop_action,
|
Chris@16
|
90 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
|
Chris@16
|
91 >
|
Chris@16
|
92 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 // No body case.
|
Chris@16
|
96 template <class Arg1>
|
Chris@16
|
97 inline const
|
Chris@16
|
98 lambda_functor<
|
Chris@16
|
99 lambda_functor_base<
|
Chris@16
|
100 whileloop_no_body_action,
|
Chris@16
|
101 tuple<lambda_functor<Arg1> >
|
Chris@16
|
102 >
|
Chris@16
|
103 >
|
Chris@16
|
104 while_loop(const lambda_functor<Arg1>& a1) {
|
Chris@16
|
105 return
|
Chris@16
|
106 lambda_functor_base<
|
Chris@16
|
107 whileloop_no_body_action,
|
Chris@16
|
108 tuple<lambda_functor<Arg1> >
|
Chris@16
|
109 >
|
Chris@16
|
110 ( tuple<lambda_functor<Arg1> >(a1) );
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113
|
Chris@16
|
114 // Do While loop
|
Chris@16
|
115 template <class Arg1, class Arg2>
|
Chris@16
|
116 inline const
|
Chris@16
|
117 lambda_functor<
|
Chris@16
|
118 lambda_functor_base<
|
Chris@16
|
119 dowhileloop_action,
|
Chris@16
|
120 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
|
Chris@16
|
121 >
|
Chris@16
|
122 >
|
Chris@16
|
123 do_while_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {
|
Chris@16
|
124 return
|
Chris@16
|
125 lambda_functor_base<
|
Chris@16
|
126 dowhileloop_action,
|
Chris@16
|
127 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
|
Chris@16
|
128 >
|
Chris@16
|
129 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));
|
Chris@16
|
130 }
|
Chris@16
|
131
|
Chris@16
|
132 // No body case.
|
Chris@16
|
133 template <class Arg1>
|
Chris@16
|
134 inline const
|
Chris@16
|
135 lambda_functor<
|
Chris@16
|
136 lambda_functor_base<
|
Chris@16
|
137 dowhileloop_no_body_action,
|
Chris@16
|
138 tuple<lambda_functor<Arg1> >
|
Chris@16
|
139 >
|
Chris@16
|
140 >
|
Chris@16
|
141 do_while_loop(const lambda_functor<Arg1>& a1) {
|
Chris@16
|
142 return
|
Chris@16
|
143 lambda_functor_base<
|
Chris@16
|
144 dowhileloop_no_body_action,
|
Chris@16
|
145 tuple<lambda_functor<Arg1> >
|
Chris@16
|
146 >
|
Chris@16
|
147 ( tuple<lambda_functor<Arg1> >(a1));
|
Chris@16
|
148 }
|
Chris@16
|
149
|
Chris@16
|
150
|
Chris@16
|
151 // Control loop lambda_functor_base specializations.
|
Chris@16
|
152
|
Chris@16
|
153 // Specialization for for_loop.
|
Chris@16
|
154 template<class Args>
|
Chris@16
|
155 class
|
Chris@16
|
156 lambda_functor_base<forloop_action, Args> {
|
Chris@16
|
157 public:
|
Chris@16
|
158 Args args;
|
Chris@16
|
159 template <class T> struct sig { typedef void type; };
|
Chris@16
|
160 public:
|
Chris@16
|
161 explicit lambda_functor_base(const Args& a) : args(a) {}
|
Chris@16
|
162
|
Chris@16
|
163 template<class RET, CALL_TEMPLATE_ARGS>
|
Chris@16
|
164 RET call(CALL_FORMAL_ARGS) const {
|
Chris@16
|
165 for(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
166 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
167 detail::select(boost::tuples::get<2>(args), CALL_ACTUAL_ARGS))
|
Chris@16
|
168
|
Chris@16
|
169 detail::select(boost::tuples::get<3>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
170 }
|
Chris@16
|
171 };
|
Chris@16
|
172
|
Chris@16
|
173 // No body case
|
Chris@16
|
174 template<class Args>
|
Chris@16
|
175 class
|
Chris@16
|
176 lambda_functor_base<forloop_no_body_action, Args> {
|
Chris@16
|
177 public:
|
Chris@16
|
178 Args args;
|
Chris@16
|
179 template <class T> struct sig { typedef void type; };
|
Chris@16
|
180 public:
|
Chris@16
|
181 explicit lambda_functor_base(const Args& a) : args(a) {}
|
Chris@16
|
182
|
Chris@16
|
183 template<class RET, CALL_TEMPLATE_ARGS>
|
Chris@16
|
184 RET call(CALL_FORMAL_ARGS) const {
|
Chris@16
|
185 for(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
186 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
187 detail::select(boost::tuples::get<2>(args), CALL_ACTUAL_ARGS)) {}
|
Chris@16
|
188 }
|
Chris@16
|
189 };
|
Chris@16
|
190
|
Chris@16
|
191
|
Chris@16
|
192 // Specialization for while_loop.
|
Chris@16
|
193 template<class Args>
|
Chris@16
|
194 class
|
Chris@16
|
195 lambda_functor_base<whileloop_action, Args> {
|
Chris@16
|
196 public:
|
Chris@16
|
197 Args args;
|
Chris@16
|
198 template <class T> struct sig { typedef void type; };
|
Chris@16
|
199 public:
|
Chris@16
|
200 explicit lambda_functor_base(const Args& a) : args(a) {}
|
Chris@16
|
201
|
Chris@16
|
202 template<class RET, CALL_TEMPLATE_ARGS>
|
Chris@16
|
203 RET call(CALL_FORMAL_ARGS) const {
|
Chris@16
|
204 while(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS))
|
Chris@16
|
205
|
Chris@16
|
206 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
207 }
|
Chris@16
|
208 };
|
Chris@16
|
209
|
Chris@16
|
210 // No body case
|
Chris@16
|
211 template<class Args>
|
Chris@16
|
212 class
|
Chris@16
|
213 lambda_functor_base<whileloop_no_body_action, Args> {
|
Chris@16
|
214 public:
|
Chris@16
|
215 Args args;
|
Chris@16
|
216 template <class T> struct sig { typedef void type; };
|
Chris@16
|
217 public:
|
Chris@16
|
218 explicit lambda_functor_base(const Args& a) : args(a) {}
|
Chris@16
|
219
|
Chris@16
|
220 template<class RET, CALL_TEMPLATE_ARGS>
|
Chris@16
|
221 RET call(CALL_FORMAL_ARGS) const {
|
Chris@16
|
222 while(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS)) {}
|
Chris@16
|
223 }
|
Chris@16
|
224 };
|
Chris@16
|
225
|
Chris@16
|
226 // Specialization for do_while_loop.
|
Chris@16
|
227 // Note that the first argument is the condition.
|
Chris@16
|
228 template<class Args>
|
Chris@16
|
229 class
|
Chris@16
|
230 lambda_functor_base<dowhileloop_action, Args> {
|
Chris@16
|
231 public:
|
Chris@16
|
232 Args args;
|
Chris@16
|
233 template <class T> struct sig { typedef void type; };
|
Chris@16
|
234 public:
|
Chris@16
|
235 explicit lambda_functor_base(const Args& a) : args(a) {}
|
Chris@16
|
236
|
Chris@16
|
237 template<class RET, CALL_TEMPLATE_ARGS>
|
Chris@16
|
238 RET call(CALL_FORMAL_ARGS) const {
|
Chris@16
|
239 do {
|
Chris@16
|
240 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
|
Chris@16
|
241 } while (detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) );
|
Chris@16
|
242 }
|
Chris@16
|
243 };
|
Chris@16
|
244
|
Chris@16
|
245 // No body case
|
Chris@16
|
246 template<class Args>
|
Chris@16
|
247 class
|
Chris@16
|
248 lambda_functor_base<dowhileloop_no_body_action, Args> {
|
Chris@16
|
249 public:
|
Chris@16
|
250 Args args;
|
Chris@16
|
251 template <class T> struct sig { typedef void type; };
|
Chris@16
|
252 public:
|
Chris@16
|
253 explicit lambda_functor_base(const Args& a) : args(a) {}
|
Chris@16
|
254
|
Chris@16
|
255 template<class RET, CALL_TEMPLATE_ARGS>
|
Chris@16
|
256 RET call(CALL_FORMAL_ARGS) const {
|
Chris@16
|
257 do {} while (detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) );
|
Chris@16
|
258 }
|
Chris@16
|
259 };
|
Chris@16
|
260
|
Chris@16
|
261 // The code below is from Joel de Guzman, some name changes etc.
|
Chris@16
|
262 // has been made.
|
Chris@16
|
263
|
Chris@16
|
264 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
265 //
|
Chris@16
|
266 // while_composite
|
Chris@16
|
267 //
|
Chris@16
|
268 // This composite has the form:
|
Chris@16
|
269 //
|
Chris@16
|
270 // while_(condition)
|
Chris@16
|
271 // [
|
Chris@16
|
272 // statement
|
Chris@16
|
273 // ]
|
Chris@16
|
274 //
|
Chris@16
|
275 // While the condition (an lambda_functor) evaluates to true, statement
|
Chris@16
|
276 // (another lambda_functor) is executed. The result type of this is void.
|
Chris@16
|
277 // Note the trailing underscore after while_.
|
Chris@16
|
278 //
|
Chris@16
|
279 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
280 template <typename CondT, typename DoT>
|
Chris@16
|
281 struct while_composite {
|
Chris@16
|
282
|
Chris@16
|
283 typedef while_composite<CondT, DoT> self_t;
|
Chris@16
|
284
|
Chris@16
|
285 template <class SigArgs>
|
Chris@16
|
286 struct sig { typedef void type; };
|
Chris@16
|
287
|
Chris@16
|
288 while_composite(CondT const& cond_, DoT const& do__)
|
Chris@16
|
289 : cond(cond_), do_(do__) {}
|
Chris@16
|
290
|
Chris@16
|
291 template <class Ret, CALL_TEMPLATE_ARGS>
|
Chris@16
|
292 Ret call(CALL_FORMAL_ARGS) const
|
Chris@16
|
293 {
|
Chris@16
|
294 while (cond.internal_call(CALL_ACTUAL_ARGS))
|
Chris@16
|
295 do_.internal_call(CALL_ACTUAL_ARGS);
|
Chris@16
|
296 }
|
Chris@16
|
297
|
Chris@16
|
298 CondT cond;
|
Chris@16
|
299 DoT do_;
|
Chris@16
|
300 };
|
Chris@16
|
301
|
Chris@16
|
302 //////////////////////////////////
|
Chris@16
|
303 template <typename CondT>
|
Chris@16
|
304 struct while_gen {
|
Chris@16
|
305
|
Chris@16
|
306 while_gen(CondT const& cond_)
|
Chris@16
|
307 : cond(cond_) {}
|
Chris@16
|
308
|
Chris@16
|
309 template <typename DoT>
|
Chris@16
|
310 lambda_functor<while_composite<
|
Chris@16
|
311 typename as_lambda_functor<CondT>::type,
|
Chris@16
|
312 typename as_lambda_functor<DoT>::type> >
|
Chris@16
|
313 operator[](DoT const& do_) const
|
Chris@16
|
314 {
|
Chris@16
|
315 typedef while_composite<
|
Chris@16
|
316 typename as_lambda_functor<CondT>::type,
|
Chris@16
|
317 typename as_lambda_functor<DoT>::type>
|
Chris@16
|
318 result;
|
Chris@16
|
319
|
Chris@16
|
320 return result(
|
Chris@16
|
321 to_lambda_functor(cond),
|
Chris@16
|
322 to_lambda_functor(do_));
|
Chris@16
|
323 }
|
Chris@16
|
324
|
Chris@16
|
325 CondT cond;
|
Chris@16
|
326 };
|
Chris@16
|
327
|
Chris@16
|
328 //////////////////////////////////
|
Chris@16
|
329 template <typename CondT>
|
Chris@16
|
330 inline while_gen<CondT>
|
Chris@16
|
331 while_(CondT const& cond)
|
Chris@16
|
332 {
|
Chris@16
|
333 return while_gen<CondT>(cond);
|
Chris@16
|
334 }
|
Chris@16
|
335
|
Chris@16
|
336 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
337 //
|
Chris@16
|
338 // do_composite
|
Chris@16
|
339 //
|
Chris@16
|
340 // This composite has the form:
|
Chris@16
|
341 //
|
Chris@16
|
342 // do_
|
Chris@16
|
343 // [
|
Chris@16
|
344 // statement
|
Chris@16
|
345 // ]
|
Chris@16
|
346 // .while_(condition)
|
Chris@16
|
347 //
|
Chris@16
|
348 // While the condition (an lambda_functor) evaluates to true, statement
|
Chris@16
|
349 // (another lambda_functor) is executed. The statement is executed at least
|
Chris@16
|
350 // once. The result type of this is void. Note the trailing
|
Chris@16
|
351 // underscore after do_ and the leading dot and the trailing
|
Chris@16
|
352 // underscore before and after .while_.
|
Chris@16
|
353 //
|
Chris@16
|
354 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
355 template <typename DoT, typename CondT>
|
Chris@16
|
356 struct do_composite {
|
Chris@16
|
357
|
Chris@16
|
358 typedef do_composite<DoT, CondT> self_t;
|
Chris@16
|
359
|
Chris@16
|
360 template <class SigArgs>
|
Chris@16
|
361 struct sig { typedef void type; };
|
Chris@16
|
362
|
Chris@16
|
363 do_composite(DoT const& do__, CondT const& cond_)
|
Chris@16
|
364 : do_(do__), cond(cond_) {}
|
Chris@16
|
365
|
Chris@16
|
366 template <class Ret, CALL_TEMPLATE_ARGS>
|
Chris@16
|
367 Ret call(CALL_FORMAL_ARGS) const
|
Chris@16
|
368 {
|
Chris@16
|
369 do
|
Chris@16
|
370 do_.internal_call(CALL_ACTUAL_ARGS);
|
Chris@16
|
371 while (cond.internal_call(CALL_ACTUAL_ARGS));
|
Chris@16
|
372 }
|
Chris@16
|
373
|
Chris@16
|
374 DoT do_;
|
Chris@16
|
375 CondT cond;
|
Chris@16
|
376 };
|
Chris@16
|
377
|
Chris@16
|
378 ////////////////////////////////////
|
Chris@16
|
379 template <typename DoT>
|
Chris@16
|
380 struct do_gen2 {
|
Chris@16
|
381
|
Chris@16
|
382 do_gen2(DoT const& do__)
|
Chris@16
|
383 : do_(do__) {}
|
Chris@16
|
384
|
Chris@16
|
385 template <typename CondT>
|
Chris@16
|
386 lambda_functor<do_composite<
|
Chris@16
|
387 typename as_lambda_functor<DoT>::type,
|
Chris@16
|
388 typename as_lambda_functor<CondT>::type> >
|
Chris@16
|
389 while_(CondT const& cond) const
|
Chris@16
|
390 {
|
Chris@16
|
391 typedef do_composite<
|
Chris@16
|
392 typename as_lambda_functor<DoT>::type,
|
Chris@16
|
393 typename as_lambda_functor<CondT>::type>
|
Chris@16
|
394 result;
|
Chris@16
|
395
|
Chris@16
|
396 return result(
|
Chris@16
|
397 to_lambda_functor(do_),
|
Chris@16
|
398 to_lambda_functor(cond));
|
Chris@16
|
399 }
|
Chris@16
|
400
|
Chris@16
|
401 DoT do_;
|
Chris@16
|
402 };
|
Chris@16
|
403
|
Chris@16
|
404 ////////////////////////////////////
|
Chris@16
|
405 struct do_gen {
|
Chris@16
|
406
|
Chris@16
|
407 template <typename DoT>
|
Chris@16
|
408 do_gen2<DoT>
|
Chris@16
|
409 operator[](DoT const& do_) const
|
Chris@16
|
410 {
|
Chris@16
|
411 return do_gen2<DoT>(do_);
|
Chris@16
|
412 }
|
Chris@16
|
413 };
|
Chris@16
|
414
|
Chris@16
|
415 do_gen const do_ = do_gen();
|
Chris@16
|
416
|
Chris@16
|
417 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
418 //
|
Chris@16
|
419 // for_composite
|
Chris@16
|
420 //
|
Chris@16
|
421 // This statement has the form:
|
Chris@16
|
422 //
|
Chris@16
|
423 // for_(init, condition, step)
|
Chris@16
|
424 // [
|
Chris@16
|
425 // statement
|
Chris@16
|
426 // ]
|
Chris@16
|
427 //
|
Chris@16
|
428 // Where init, condition, step and statement are all lambda_functors. init
|
Chris@16
|
429 // is executed once before entering the for-loop. The for-loop
|
Chris@16
|
430 // exits once condition evaluates to false. At each loop iteration,
|
Chris@16
|
431 // step and statement is called. The result of this statement is
|
Chris@16
|
432 // void. Note the trailing underscore after for_.
|
Chris@16
|
433 //
|
Chris@16
|
434 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
435 template <typename InitT, typename CondT, typename StepT, typename DoT>
|
Chris@16
|
436 struct for_composite {
|
Chris@16
|
437
|
Chris@16
|
438 template <class SigArgs>
|
Chris@16
|
439 struct sig { typedef void type; };
|
Chris@16
|
440
|
Chris@16
|
441 for_composite(
|
Chris@16
|
442 InitT const& init_,
|
Chris@16
|
443 CondT const& cond_,
|
Chris@16
|
444 StepT const& step_,
|
Chris@16
|
445 DoT const& do__)
|
Chris@16
|
446 : init(init_), cond(cond_), step(step_), do_(do__) {}
|
Chris@16
|
447
|
Chris@16
|
448 template <class Ret, CALL_TEMPLATE_ARGS>
|
Chris@16
|
449 Ret
|
Chris@16
|
450 call(CALL_FORMAL_ARGS) const
|
Chris@16
|
451 {
|
Chris@16
|
452 for (init.internal_call(CALL_ACTUAL_ARGS); cond.internal_call(CALL_ACTUAL_ARGS); step.internal_call(CALL_ACTUAL_ARGS))
|
Chris@16
|
453 do_.internal_call(CALL_ACTUAL_ARGS);
|
Chris@16
|
454 }
|
Chris@16
|
455
|
Chris@16
|
456 InitT init; CondT cond; StepT step; DoT do_; // lambda_functors
|
Chris@16
|
457 };
|
Chris@16
|
458
|
Chris@16
|
459 //////////////////////////////////
|
Chris@16
|
460 template <typename InitT, typename CondT, typename StepT>
|
Chris@16
|
461 struct for_gen {
|
Chris@16
|
462
|
Chris@16
|
463 for_gen(
|
Chris@16
|
464 InitT const& init_,
|
Chris@16
|
465 CondT const& cond_,
|
Chris@16
|
466 StepT const& step_)
|
Chris@16
|
467 : init(init_), cond(cond_), step(step_) {}
|
Chris@16
|
468
|
Chris@16
|
469 template <typename DoT>
|
Chris@16
|
470 lambda_functor<for_composite<
|
Chris@16
|
471 typename as_lambda_functor<InitT>::type,
|
Chris@16
|
472 typename as_lambda_functor<CondT>::type,
|
Chris@16
|
473 typename as_lambda_functor<StepT>::type,
|
Chris@16
|
474 typename as_lambda_functor<DoT>::type> >
|
Chris@16
|
475 operator[](DoT const& do_) const
|
Chris@16
|
476 {
|
Chris@16
|
477 typedef for_composite<
|
Chris@16
|
478 typename as_lambda_functor<InitT>::type,
|
Chris@16
|
479 typename as_lambda_functor<CondT>::type,
|
Chris@16
|
480 typename as_lambda_functor<StepT>::type,
|
Chris@16
|
481 typename as_lambda_functor<DoT>::type>
|
Chris@16
|
482 result;
|
Chris@16
|
483
|
Chris@16
|
484 return result(
|
Chris@16
|
485 to_lambda_functor(init),
|
Chris@16
|
486 to_lambda_functor(cond),
|
Chris@16
|
487 to_lambda_functor(step),
|
Chris@16
|
488 to_lambda_functor(do_));
|
Chris@16
|
489 }
|
Chris@16
|
490
|
Chris@16
|
491 InitT init; CondT cond; StepT step;
|
Chris@16
|
492 };
|
Chris@16
|
493
|
Chris@16
|
494 //////////////////////////////////
|
Chris@16
|
495 template <typename InitT, typename CondT, typename StepT>
|
Chris@16
|
496 inline for_gen<InitT, CondT, StepT>
|
Chris@16
|
497 for_(InitT const& init, CondT const& cond, StepT const& step)
|
Chris@16
|
498 {
|
Chris@16
|
499 return for_gen<InitT, CondT, StepT>(init, cond, step);
|
Chris@16
|
500 }
|
Chris@16
|
501
|
Chris@16
|
502 } // lambda
|
Chris@16
|
503 } // boost
|
Chris@16
|
504
|
Chris@16
|
505 #endif // BOOST_LAMBDA_LOOPS_HPP
|