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