comparison DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/lambda.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 /*=============================================================================
2 Copyright (c) 2001-2007 Joel de Guzman
3 Copyright (c) 2004 Daniel Wallin
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 PHOENIX_SCOPE_LAMBDA_HPP
9 #define PHOENIX_SCOPE_LAMBDA_HPP
10
11 #include <boost/spirit/home/phoenix/core/limits.hpp>
12 #include <boost/spirit/home/phoenix/core/composite.hpp>
13 #include <boost/spirit/home/phoenix/scope/scoped_environment.hpp>
14 #include <boost/spirit/home/phoenix/scope/detail/local_variable.hpp>
15 #include <boost/spirit/home/phoenix/detail/local_reference.hpp>
16 #include <boost/spirit/home/phoenix/core/actor.hpp>
17 #include <boost/fusion/include/transform.hpp>
18 #include <boost/fusion/include/as_vector.hpp>
19
20 namespace boost { namespace phoenix
21 {
22 template <typename Base, typename OuterEnv, typename Locals, typename Map>
23 struct lambda_eval : Base
24 {
25 template <typename Env>
26 struct result
27 {
28 typedef typename Base::template
29 result<scoped_environment<Env, OuterEnv, Locals, Map> >::type
30 result_type;
31
32 typedef typename
33 detail::unwrap_local_reference<result_type>::type
34 type;
35 };
36
37 lambda_eval(
38 Base const& base
39 , OuterEnv const& outer_env
40 , Locals const& locals)
41 : Base(base)
42 , outer_env(outer_env)
43 , locals(locals) {}
44
45 template <typename Env>
46 typename result<Env>::type
47 eval(Env const& env) const
48 {
49 typedef typename result<Env>::type RT;
50 return RT(Base::eval(
51 scoped_environment<Env, OuterEnv, Locals, Map>(
52 env, outer_env, locals)));
53 }
54
55 OuterEnv outer_env;
56 mutable Locals locals;
57 };
58
59 template <typename Base, typename Vars, typename Map>
60 struct lambda_actor
61 {
62 typedef typename
63 mpl::fold<
64 Vars
65 , mpl::false_
66 , detail::compute_no_nullary
67 >::type
68 no_nullary;
69
70 template <typename Env>
71 struct result
72 {
73 typedef typename
74 fusion::result_of::as_vector<
75 typename fusion::result_of::transform<
76 Vars
77 , detail::initialize_local<Env>
78 >::type
79 >::type
80 locals_type;
81
82 typedef actor<lambda_eval<Base, Env, locals_type, Map> > type;
83 };
84
85 lambda_actor(Base const& f, Vars const& vars)
86 : f(f), vars(vars) {}
87
88 template <typename Env>
89 typename result<Env>::type
90 eval(Env const& env) const
91 {
92 typedef typename result<Env>::type result_type;
93
94 return result_type(
95 f, env, fusion::as_vector(
96 fusion::transform(
97 vars
98 , detail::initialize_local<Env>(env)
99 )));
100 }
101
102 Base f;
103 Vars vars;
104 };
105
106 template <typename Vars, typename Map>
107 struct lambda_actor_gen
108 {
109 template <typename Base>
110 actor<lambda_actor<Base, Vars, Map> > const
111 operator[](actor<Base> const& f) const
112 {
113 return lambda_actor<Base, Vars, Map>(f, vars);
114 }
115
116 lambda_actor_gen(Vars const& vars)
117 : vars(vars) {}
118
119 Vars vars;
120 };
121
122 template <typename Key>
123 struct local_variable; // forward
124 struct assign_eval; // forward
125
126 struct lambda_gen
127 : lambda_actor_gen<
128 fusion::vector<>
129 , detail::map_local_index_to_tuple<> >
130 {
131 typedef
132 lambda_actor_gen<
133 fusion::vector<>
134 , detail::map_local_index_to_tuple<> >
135 base_type;
136
137 lambda_gen()
138 : base_type(fusion::vector<>())
139 {
140 }
141
142 template <typename K0, typename V0>
143 lambda_actor_gen<
144 fusion::vector<V0>
145 , detail::map_local_index_to_tuple<K0>
146 >
147 operator()(
148 actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
149 ) const
150 {
151 return fusion::vector<V0>(fusion::at_c<1>(a0));
152 }
153
154 template <typename K0, typename K1, typename V0, typename V1>
155 lambda_actor_gen<
156 fusion::vector<V0, V1>
157 , detail::map_local_index_to_tuple<K0, K1>
158 >
159 operator()(
160 actor<composite<assign_eval, fusion::vector<local_variable<K0>, V0> > > const& a0
161 , actor<composite<assign_eval, fusion::vector<local_variable<K1>, V1> > > const& a1
162 ) const
163 {
164 return fusion::vector<V0, V1>(fusion::at_c<1>(a0), fusion::at_c<1>(a1));
165 }
166
167 // Bring in the rest...
168 #define PHOENIX_LOCAL_GEN_NAME lambda_actor_gen
169 #include <boost/spirit/home/phoenix/scope/detail/local_gen.hpp>
170 #undef PHOENIX_LOCAL_GEN_NAME
171 };
172
173 lambda_gen const lambda = lambda_gen();
174 }}
175
176 #endif