Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2007 Joel de Guzman
|
Chris@16
|
3
|
Chris@16
|
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 ==============================================================================*/
|
Chris@16
|
7 #ifndef PHOENIX_STATEMENT_FOR_HPP
|
Chris@16
|
8 #define PHOENIX_STATEMENT_FOR_HPP
|
Chris@16
|
9
|
Chris@16
|
10 #include <boost/spirit/home/phoenix/core/composite.hpp>
|
Chris@16
|
11 #include <boost/spirit/home/phoenix/core/compose.hpp>
|
Chris@16
|
12
|
Chris@16
|
13 namespace boost { namespace phoenix
|
Chris@16
|
14 {
|
Chris@16
|
15 struct for_eval
|
Chris@16
|
16 {
|
Chris@16
|
17 template <
|
Chris@16
|
18 typename Env
|
Chris@16
|
19 , typename Init, typename Cond, typename Step, typename Do>
|
Chris@16
|
20 struct result
|
Chris@16
|
21 {
|
Chris@16
|
22 typedef void type;
|
Chris@16
|
23 };
|
Chris@16
|
24
|
Chris@16
|
25 template <
|
Chris@16
|
26 typename RT, typename Env
|
Chris@16
|
27 , typename Init, typename Cond, typename Step, typename Do>
|
Chris@16
|
28 static void
|
Chris@16
|
29 eval(
|
Chris@16
|
30 Env const& env
|
Chris@16
|
31 , Init& init, Cond& cond, Step& step, Do& do_)
|
Chris@16
|
32 {
|
Chris@16
|
33 for (init.eval(env); cond.eval(env); step.eval(env))
|
Chris@16
|
34 do_.eval(env);
|
Chris@16
|
35 }
|
Chris@16
|
36 };
|
Chris@16
|
37
|
Chris@16
|
38 template <typename Init, typename Cond, typename Step>
|
Chris@16
|
39 struct for_gen
|
Chris@16
|
40 {
|
Chris@16
|
41 for_gen(Init const& init, Cond const& cond, Step const& step)
|
Chris@16
|
42 : init(init), cond(cond), step(step) {}
|
Chris@16
|
43
|
Chris@16
|
44 template <typename Do>
|
Chris@16
|
45 actor<typename as_composite<for_eval, Init, Cond, Step, Do>::type>
|
Chris@16
|
46 operator[](Do const& do_) const
|
Chris@16
|
47 {
|
Chris@16
|
48 return compose<for_eval>(init, cond, step, do_);
|
Chris@16
|
49 }
|
Chris@16
|
50
|
Chris@16
|
51 Init init;
|
Chris@16
|
52 Cond cond;
|
Chris@16
|
53 Step step;
|
Chris@16
|
54 };
|
Chris@16
|
55
|
Chris@16
|
56 template <typename Init, typename Cond, typename Step>
|
Chris@16
|
57 inline for_gen<Init, Cond, Step>
|
Chris@16
|
58 for_(Init const& init, Cond const& cond, Step const& step)
|
Chris@16
|
59 {
|
Chris@16
|
60 return for_gen<Init, Cond, Step>(init, cond, step);
|
Chris@16
|
61 }
|
Chris@16
|
62 }}
|
Chris@16
|
63
|
Chris@16
|
64 #endif
|