Chris@16
|
1 /*==============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2010 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2010 Thomas Heller
|
Chris@16
|
4
|
Chris@16
|
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 ==============================================================================*/
|
Chris@16
|
8 #ifndef BOOST_PHOENIX_STATEMENT_FOR_HPP
|
Chris@16
|
9 #define BOOST_PHOENIX_STATEMENT_FOR_HPP
|
Chris@16
|
10
|
Chris@16
|
11 #include <boost/phoenix/core/limits.hpp>
|
Chris@16
|
12 #include <boost/phoenix/core/call.hpp>
|
Chris@16
|
13 #include <boost/phoenix/core/expression.hpp>
|
Chris@16
|
14 #include <boost/phoenix/core/meta_grammar.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 BOOST_PHOENIX_DEFINE_EXPRESSION(
|
Chris@16
|
17 (boost)(phoenix)(for_)
|
Chris@16
|
18 , (meta_grammar) // Cond
|
Chris@16
|
19 (meta_grammar) // Init
|
Chris@16
|
20 (meta_grammar) // Step
|
Chris@16
|
21 (meta_grammar) // Do
|
Chris@16
|
22 )
|
Chris@16
|
23
|
Chris@16
|
24 namespace boost { namespace phoenix
|
Chris@16
|
25 {
|
Chris@16
|
26 struct for_eval
|
Chris@16
|
27 {
|
Chris@16
|
28 typedef void result_type;
|
Chris@16
|
29
|
Chris@16
|
30 template <
|
Chris@16
|
31 typename Init
|
Chris@16
|
32 , typename Cond
|
Chris@16
|
33 , typename Step
|
Chris@16
|
34 , typename Do
|
Chris@16
|
35 , typename Context
|
Chris@16
|
36 >
|
Chris@16
|
37 result_type
|
Chris@16
|
38 operator()(
|
Chris@16
|
39 Init const& init
|
Chris@16
|
40 , Cond const& cond
|
Chris@16
|
41 , Step const& step
|
Chris@101
|
42 , Do const& do_it
|
Chris@16
|
43 , Context const & ctx
|
Chris@16
|
44 ) const
|
Chris@16
|
45 {
|
Chris@16
|
46 for(boost::phoenix::eval(init, ctx); boost::phoenix::eval(cond, ctx); boost::phoenix::eval(step, ctx))
|
Chris@101
|
47 boost::phoenix::eval(do_it, ctx);
|
Chris@16
|
48 }
|
Chris@16
|
49 };
|
Chris@16
|
50
|
Chris@16
|
51 template <typename Dummy>
|
Chris@16
|
52 struct default_actions::when<rule::for_, Dummy>
|
Chris@16
|
53 : call<for_eval, Dummy>
|
Chris@16
|
54 {};
|
Chris@16
|
55
|
Chris@16
|
56 template <typename Init, typename Cond, typename Step>
|
Chris@16
|
57 struct for_gen
|
Chris@16
|
58 {
|
Chris@101
|
59 for_gen(Init const& init_, Cond const& cond_, Step const& step_)
|
Chris@101
|
60 : init(init_), cond(cond_), step(step_) {}
|
Chris@16
|
61
|
Chris@16
|
62 template <typename Do>
|
Chris@16
|
63 typename expression::for_<Init, Cond, Step, Do>::type const
|
Chris@101
|
64 operator[](Do const& do_it) const
|
Chris@16
|
65 {
|
Chris@16
|
66 return
|
Chris@16
|
67 expression::
|
Chris@16
|
68 for_<Init, Cond, Step, Do>::
|
Chris@101
|
69 make(init, cond, step, do_it);
|
Chris@16
|
70 }
|
Chris@16
|
71
|
Chris@16
|
72 Init init;
|
Chris@16
|
73 Cond cond;
|
Chris@16
|
74 Step step;
|
Chris@16
|
75 };
|
Chris@16
|
76
|
Chris@16
|
77 template <typename Init, typename Cond, typename Step>
|
Chris@16
|
78 inline
|
Chris@16
|
79 for_gen<Init, Cond, Step> const
|
Chris@16
|
80 for_(Init const& init, Cond const& cond, Step const& step)
|
Chris@16
|
81 {
|
Chris@16
|
82 return for_gen<Init, Cond, Step>(init, cond, step);
|
Chris@16
|
83 }
|
Chris@16
|
84
|
Chris@16
|
85 }}
|
Chris@16
|
86
|
Chris@16
|
87 #endif
|