summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/phoenix/scope/let.hpp')
-rw-r--r--3rdParty/Boost/src/boost/phoenix/scope/let.hpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/phoenix/scope/let.hpp b/3rdParty/Boost/src/boost/phoenix/scope/let.hpp
new file mode 100644
index 0000000..8c84571
--- /dev/null
+++ b/3rdParty/Boost/src/boost/phoenix/scope/let.hpp
@@ -0,0 +1,204 @@
+/*==============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2004 Daniel Wallin
+ Copyright (c) 2010 Thomas Heller
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef BOOST_PHOENIX_SCOPE_LET_HPP
+#define BOOST_PHOENIX_SCOPE_LET_HPP
+
+#include <boost/phoenix/core/limits.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/phoenix/core/call.hpp>
+#include <boost/phoenix/core/expression.hpp>
+#include <boost/phoenix/core/meta_grammar.hpp>
+#include <boost/phoenix/scope/scoped_environment.hpp>
+#include <boost/phoenix/scope/local_variable.hpp>
+#include <boost/phoenix/support/iterate.hpp>
+#include <boost/phoenix/support/vector.hpp>
+
+BOOST_PHOENIX_DEFINE_EXPRESSION(
+ (boost)(phoenix)(let_)
+ , (proto::terminal<proto::_>) // Locals
+ (proto::terminal<proto::_>) // Map
+ (meta_grammar)
+)
+
+namespace boost { namespace phoenix
+{
+ struct let_eval
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Vars, typename Map, typename Expr, typename Context>
+ struct result<This(Vars, Map, Expr, Context)>
+ {
+ typedef
+ typename proto::detail::uncvref<
+ typename result_of::env<Context>::type
+ >::type
+ env_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename result_of::actions<Context>::type
+ >::type
+ actions_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename proto::result_of::value<Vars>::type
+ >::type
+ vars_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename proto::result_of::value<Map>::type
+ >::type
+ map_type;
+
+ typedef typename
+ detail::result_of::initialize_locals<
+ vars_type
+ , Context
+ >::type
+ locals_type;
+
+ typedef typename
+ result_of::eval<
+ Expr
+ , typename result_of::context<
+ scoped_environment<
+ env_type
+ , env_type
+ , locals_type
+ , map_type
+ >
+ , actions_type
+ >::type
+ >::type
+ type;
+ };
+
+ template <typename Vars, typename Map, typename Expr, typename Context>
+ typename result<let_eval(Vars const&, Map const&, Expr const &, Context const &)>::type const
+ operator()(Vars const & vars, Map, Expr const & expr, Context const & ctx) const
+ {
+ typedef
+ typename proto::detail::uncvref<
+ typename result_of::env<Context>::type
+ >::type
+ env_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename proto::result_of::value<Vars>::type
+ >::type
+ vars_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename proto::result_of::value<Map>::type
+ >::type
+ map_type;
+
+ typedef typename
+ detail::result_of::initialize_locals<
+ vars_type
+ , Context
+ >::type
+ locals_type;
+
+ locals_type locals = initialize_locals(proto::value(vars), ctx);
+
+ scoped_environment<
+ env_type
+ , env_type
+ , locals_type
+ , map_type
+ >
+ env(phoenix::env(ctx), phoenix::env(ctx), locals);
+
+ return eval(expr, phoenix::context(env, phoenix::actions(ctx)));
+ }
+ };
+
+ template <typename Dummy>
+ struct default_actions::when<rule::let_, Dummy>
+ : call<let_eval, Dummy>
+ {};
+
+ template <typename Locals, typename Map>
+ struct let_actor_gen
+ {
+ let_actor_gen(Locals const & locals)
+ : locals(locals)
+ {}
+
+ let_actor_gen(let_actor_gen const & o)
+ : locals(o.locals)
+ {}
+
+ template <typename Expr>
+ typename expression::let_<
+ Locals
+ , Map
+ , Expr
+ >::type const
+ operator[](Expr const & expr) const
+ {
+ return expression::let_<Locals, Map, Expr>::make(locals, Map(), expr);
+ }
+
+ Locals locals;
+ };
+
+#define BOOST_PHOENIX_SCOPE_ACTOR_GEN_NAME let_actor_gen
+#define BOOST_PHOENIX_SCOPE_ACTOR_GEN_FUNCTION let
+#define BOOST_PHOENIX_SCOPE_ACTOR_GEN_CONST
+ #include <boost/phoenix/scope/detail/local_gen.hpp>
+#undef BOOST_PHOENIX_SCOPE_ACTOR_GEN_NAME
+#undef BOOST_PHOENIX_SCOPE_ACTOR_GEN_FUNCTION
+#undef BOOST_PHOENIX_SCOPE_ACTOR_GEN_CONST
+
+ template <typename Dummy>
+ struct is_nullary::when<rule::let_, Dummy>
+ : proto::make<
+ mpl::and_<
+ proto::fold<
+ proto::call<proto::_value(proto::_child_c<0>)>
+ , proto::make<mpl::true_()>
+ , proto::make<
+ mpl::and_<
+ proto::_state
+ , proto::call<
+ evaluator(
+ proto::_
+ , _context
+ , proto::make<proto::empty_env()>
+ )
+ >
+ >()
+ >
+ >
+ , evaluator(
+ proto::_child_c<2>
+ , proto::call<
+ functional::context(
+ proto::make<
+ mpl::true_()
+ >
+ , proto::make<
+ detail::scope_is_nullary_actions()
+ >
+ )
+ >
+ , proto::make<
+ proto::empty_env()
+ >
+ )
+ >()
+ >
+ {};
+}}
+
+#endif