annotate DEPENDENCIES/generic/include/boost/spirit/home/phoenix/scope/let.hpp @ 25:14ff78c4fa42

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