|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r66967 - in sandbox/SOC/2010/phoenix3: boost/phoenix/core boost/phoenix/core/detail boost/phoenix/operator boost/phoenix/scope libs/phoenix/test/scope
From: thom.heller_at_[hidden]
Date: 2010-12-02 03:17:34
Author: theller
Date: 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
New Revision: 66967
URL: http://svn.boost.org/trac/boost/changeset/66967
Log:
let refactoring, temporary commit
Text files modified:
sandbox/SOC/2010/phoenix3/boost/phoenix/core/actor.hpp | 19 ++
sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_operator.hpp | 62 ++++++++--
sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_result_of.hpp | 10 +
sandbox/SOC/2010/phoenix3/boost/phoenix/core/environment.hpp | 22 ++-
sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp | 2
sandbox/SOC/2010/phoenix3/boost/phoenix/core/limits.hpp | 2
sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp | 21 +++
sandbox/SOC/2010/phoenix3/boost/phoenix/operator/if_else.hpp | 53 --------
sandbox/SOC/2010/phoenix3/boost/phoenix/scope/let.hpp | 116 +++++++++---------
sandbox/SOC/2010/phoenix3/boost/phoenix/scope/local_variable.hpp | 240 ++++++++++++++++++++++++++++++++-------
sandbox/SOC/2010/phoenix3/boost/phoenix/scope/scoped_environment.hpp | 31 ++++-
sandbox/SOC/2010/phoenix3/libs/phoenix/test/scope/let_tests.cpp | 46 +++++--
12 files changed, 416 insertions(+), 208 deletions(-)
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/actor.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/actor.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/actor.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -11,6 +11,7 @@
#include <boost/mpl/identity.hpp>
#include <boost/mpl/eval_if.hpp>
+#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/phoenix/core/domain.hpp>
#include <boost/phoenix/core/environment.hpp>
#include <boost/phoenix/core/is_nullary.hpp>
@@ -53,7 +54,7 @@
, boost::result_of<
evaluator(
Expr const &
- , typename make_basic_environment<default_actions>::type &
+ , fusion::vector2<fusion::vector0<>&, default_actions>&
)
>
, mpl::identity<detail::error_expecting_arguments>
@@ -66,7 +67,7 @@
: boost::result_of<
evaluator(
Expr const &
- , typename make_basic_environment<default_actions, A0>::type &
+ , fusion::vector2<fusion::vector1<A0>&, default_actions>&
)
>
{};
@@ -76,7 +77,7 @@
: boost::result_of<
evaluator(
Expr const&
- , typename make_basic_environment<default_actions, A0, A1>::type &
+ , fusion::vector2<fusion::vector2<A0, A1>&, default_actions>&
)
>
{};
@@ -86,7 +87,7 @@
: boost::result_of<
evaluator(
Expr const&
- , typename make_basic_environment<default_actions, A0, A1, A2>::type &
+ , fusion::vector2<fusion::vector3<A0, A1, A2>&, default_actions>&
)
>
{};
@@ -125,8 +126,13 @@
typename result_of::actor<Expr>::type
operator()()
{
+ /*
typedef make_basic_environment<default_actions> env_type;
typename env_type::type env = env_type::make();
+ */
+ typedef fusion::vector0<> args_type;
+ args_type args;
+ fusion::vector2<args_type&, default_actions> env(args, default_actions());
return eval(*this, env);
}
@@ -134,8 +140,13 @@
typename result_of::actor<Expr>::type
operator()() const
{
+ /*
typedef make_basic_environment<default_actions> env_type;
typename env_type::type env = env_type::make();
+ */
+ typedef fusion::vector0<> args_type;
+ args_type args;
+ fusion::vector2<args_type&, default_actions> env(args, default_actions());
return eval(*this, env);
}
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_operator.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_operator.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_operator.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -35,8 +35,17 @@
typename result_of::actor<Expr, PHOENIX_A_ref>::type
operator()(PHOENIX_A_ref_a)
{
+ /*
typedef make_basic_environment<default_actions, PHOENIX_A_ref> env_type;
typename env_type::type env = env_type::make(PHOENIX_a);
+ */
+ typedef
+ BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<
+ PHOENIX_A_ref
+ >
+ args_type;
+ args_type args(PHOENIX_a);
+ fusion::vector2<args_type&, default_actions> env(args, default_actions());
return eval(*this, env);
}
@@ -45,8 +54,17 @@
typename result_of::actor<Expr, PHOENIX_A_ref>::type
operator()(PHOENIX_A_ref_a) const
{
+ /*
typedef make_basic_environment<default_actions, PHOENIX_A_ref> env_type;
typename env_type::type env = env_type::make(PHOENIX_a);
+ */
+ typedef
+ BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<
+ PHOENIX_A_ref
+ >
+ args_type;
+ args_type args(PHOENIX_a);
+ fusion::vector2<args_type&, default_actions> env(args, default_actions());
return eval(*this, env);
}
@@ -55,8 +73,17 @@
typename result_of::actor<Expr, PHOENIX_A_const_ref>::type
operator()(PHOENIX_A_const_ref_a)
{
- typedef make_basic_environment<default_actions, PHOENIX_A_const_ref> env_type;
+ /*
+ typedef make_basic_environment<default_actions, PHOENIX_A_ref> env_type;
typename env_type::type env = env_type::make(PHOENIX_a);
+ */
+ typedef
+ BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<
+ PHOENIX_A_const_ref
+ >
+ args_type;
+ args_type args(PHOENIX_a);
+ fusion::vector2<args_type&, default_actions> env(args, default_actions());
return eval(*this, env);
}
@@ -65,8 +92,17 @@
typename result_of::actor<Expr, PHOENIX_A_const_ref>::type
operator()(PHOENIX_A_const_ref_a) const
{
- typedef make_basic_environment<default_actions, PHOENIX_A_const_ref> env_type;
+ /*
+ typedef make_basic_environment<default_actions, PHOENIX_A_ref> env_type;
typename env_type::type env = env_type::make(PHOENIX_a);
+ */
+ typedef
+ BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<
+ PHOENIX_A_const_ref
+ >
+ args_type;
+ args_type args(PHOENIX_a);
+ fusion::vector2<args_type&, default_actions> env(args, default_actions());
return eval(*this, env);
}
@@ -86,11 +122,12 @@
operator()(PHOENIX_PERM_A_a(I)) const \
{ \
typedef \
- make_basic_environment< \
- default_actions, PHOENIX_PERM_A(I) \
- > \
- env_type; \
- typename env_type::type env = env_type::make(PHOENIX_a); \
+ typename fusion::result_of::make_vector<PHOENIX_PERM_A(I)>::type \
+ args_type; \
+ args_type args(PHOENIX_a); \
+ fusion::vector2< \
+ args_type&, default_actions \
+ > env(args, default_actions()); \
\
return eval(*this, env); \
} \
@@ -100,11 +137,12 @@
operator()(PHOENIX_PERM_A_a(I)) \
{ \
typedef \
- make_basic_environment< \
- default_actions, PHOENIX_PERM_A(I) \
- > \
- env_type; \
- typename env_type::type env = env_type::make(PHOENIX_a); \
+ typename fusion::result_of::make_vector<PHOENIX_PERM_A(I)>::type \
+ args_type; \
+ args_type args(PHOENIX_a); \
+ fusion::vector2< \
+ args_type&, default_actions \
+ > env(args, default_actions()); \
\
return eval(*this, env); \
} \
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_result_of.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_result_of.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_result_of.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -25,7 +25,7 @@
#define PHOENIX_ENV( A ) typename make_basic_environment<A>::type
template <typename Expr, PHOENIX_typename_A>
- struct actor<Expr, BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, A)>
+ struct actor<Expr, PHOENIX_A>
/*: boost::result_of<eval_grammar(
::boost::phoenix::actor<Expr> const &,
PHOENIX_ENV(PHOENIX_A)&)>
@@ -33,7 +33,13 @@
: boost::result_of<
evaluator(
Expr const&
- , typename make_basic_environment<default_actions, PHOENIX_A>::type &
+ //, typename make_basic_environment<default_actions, PHOENIX_A>::type &
+ , fusion::vector2<
+ BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<
+ PHOENIX_A
+ >
+ , default_actions
+ >
)
>
{};
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/environment.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/environment.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/environment.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -15,6 +15,8 @@
#include <boost/utility/enable_if.hpp>
#include <boost/utility/result_of.hpp>
+#include <typeinfo>
+
namespace boost { namespace phoenix
{
namespace functional
@@ -55,12 +57,12 @@
template <typename This, typename N, typename Env>
struct result<This(N, Env)>
- : boost::result_of<at<N>(typename boost::result_of<args(Env)>::type)>
+ : boost::result_of<at<N>(typename boost::result_of<args(Env &)>::type)>
{};
template <typename N, typename Env>
typename result<args_at(N, Env &)>::type
- operator()(N const &, Env& env) const
+ operator()(N, Env& env) const
{
return at<N>()(args()(env));
}
@@ -138,18 +140,19 @@
};
*/
+ /*
template <typename Actions, PHOENIX_typename_A_void(PHOENIX_ARG_LIMIT), typename Dummy = void>
- struct make_basic_environment;
+ struct make_environment;
template <typename Actions>
- struct make_basic_environment<Actions>
+ struct make_environment<Actions>
{
typedef fusion::vector0<> params_type;
- typedef fusion::vector2<params_type, Actions> type;
+ typedef fusion::vector2<params_type &, Actions> type;
- static type make()
+ static type make(params_type & params)
{
- return type(params_type(), Actions());
+ return type(params, Actions());
}
};
@@ -157,7 +160,7 @@
struct make_basic_environment<Actions, A0>
{
typedef fusion::vector1<A0> params_type;
- typedef fusion::vector2<params_type, Actions> type;
+ //typedef fusion::vector2<params_type, Actions> type;
static type make(A0 a0)
{
@@ -181,7 +184,7 @@
template <typename Actions, typename A0, typename A1, typename A2>
struct make_basic_environment<Actions, A0, A1, A2>
{
- typedef fusion::vector3<A0, A1, A2> params_type;
+ typedef fusion::vector3<A0, A1, A2> params_type;
typedef fusion::vector2<params_type, Actions> type;
static type make(A0 a0, A1 a1, A2 a2)
@@ -192,6 +195,7 @@
// Bring in the rest
#include <boost/phoenix/core/detail/make_basic_environment.hpp>
+ */
}}
#endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -51,7 +51,7 @@
template <typename Expr>
struct is_nullary
- : boost::result_of<evaluator(Expr const&, make_basic_environment<detail::is_nullary_>::type&)>
+ : boost::result_of<evaluator(Expr const&, fusion::vector2<fusion::vector0<>&, detail::is_nullary_>&)>
{};
}}
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/limits.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/limits.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/limits.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -32,7 +32,7 @@
#endif
#if !defined(PHOENIX_PERFECT_FORWARD_LIMIT)
-# define PHOENIX_PERFECT_FORWARD_LIMIT 4
+# define PHOENIX_PERFECT_FORWARD_LIMIT 3
#elif (PHOENIX_PERFECT_FORWARD_LIMIT > PHOENIX_ACTOR_LIMIT)
# error "PHOENIX_PERFECT_FORWARD_LIMIT > PHOENIX_ACTOR_LIMIT"
#elif (PHOENIX_PERFECT_FORWARD_LIMIT < 3)
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -33,6 +33,27 @@
(divides)
(modulus)
)
+
+ /*
+ struct blubb
+ : proto::callable
+ {
+ typedef int result_type;
+
+ template <typename Env, typename Lhs, typename Rhs>
+ result_type
+ operator()(Env& env, Lhs const& lhs, Rhs const& rhs) const
+ {
+ std::cout << "ok ....\n";
+ return 5;
+ }
+ };
+
+ template <typename Dummy>
+ struct default_actions::when<rule::plus_assign, Dummy>
+ : proto::call<blubb(_env, proto::_child_c<0>, proto::_child_c<0>)>
+ {};
+ */
}}
#endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/if_else.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/operator/if_else.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/if_else.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -30,59 +30,6 @@
{};
using proto::if_else;
-
- /*
- namespace result_of
- {
- template <typename Env, typename Cond, typename Then, typename Else>
- struct if_else
- {
- typedef typename boost::result_of<eval_grammar(Then const&, Env&)>::type then_type;
- typedef typename boost::result_of<eval_grammar(Else const&, Env&)>::type else_type;
-
- typedef typename
- mpl::if_<
- mpl::and_<
- is_same<then_type, else_type>
- , is_reference<then_type>
- >
- , then_type
- , typename remove_reference<then_type>::type
- >::type
- type;
- };
- }
-
- struct if_else_
- {
- template <typename Sig>
- struct result;
-
- template <typename This, typename Env, typename Cond, typename Then, typename Else>
- struct result<This(Env&, Cond const&, Then const&, Else const&)>
- : boost::phoenix::result_of::if_else<Env, Cond, Then, Else>
- {};
-
-
- template <typename Env, typename Cond, typename Then, typename Else>
- typename result_of::if_else<Env, Cond, Then, Else>::type
- operator()(Env& env, Cond const& cond, Then const& then, Else const& else_) const
- {
- return eval(cond, env) ? eval(then, env) : eval(else_, env);
- }
- };
-
-
- template <typename Cond, typename Then, typename Else>
- struct make_if_else : compose<if_else_, Cond, Then, Else> {};
-
- template <typename Cond, typename Then, typename Else>
- typename make_if_else<Cond, Then, Else>::type const
- if_else(Cond const & cond, Then const & then, Else const& else_)
- {
- return make_if_else<Cond, Then, Else>()(cond, then, else_);
- }
- */
}}
#endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/scope/let.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/scope/let.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/scope/let.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -35,25 +35,30 @@
template <typename This, typename Env, typename Locals, typename Let>
struct result<This(Env, Locals const&, Let const&)>
{
+ /*
typedef
- typename boost::result_of<
- functional::args(Env)
+ typename proto::detail::uncvref<
+ Env
>::type
- args_type;
+ env_type;
+ */
typedef
- typename boost::result_of<
- functional::actions(Env)
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ functional::actions(Env)
+ >::type
>::type
actions_type;
typedef
- typename boost::result_of<
- rule::local_var_def_list(
- Locals
- , args_type
- , actions_type
- )
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ rule::local_var_def_list(
+ Locals const &
+ , Env
+ )
+ >::type
>::type
locals_type;
@@ -61,7 +66,7 @@
typename boost::result_of<
evaluator(
Let const &
- , fusion::vector2<scoped_environment<args_type, args_type, locals_type> &, actions_type&>&
+ , fusion::vector2<scoped_environment<Env, Env, locals_type> &, actions_type> &
)
>::type
type;
@@ -72,42 +77,40 @@
operator()(Env & env, Locals const & locals, Let const & let) const
{
typedef
- typename boost::result_of<
- functional::args(Env &)
- >::type
- args_type;
-
- typedef
- typename boost::result_of<
- functional::actions(Env &)
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ functional::actions(Env &)
+ >::type
>::type
actions_type;
typedef
- typename boost::result_of<
- rule::local_var_def_list(
- Locals
- , args_type
- , actions_type
- )
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ rule::local_var_def_list(
+ Locals const &
+ , Env &
+ )
+ >::type
>::type
locals_type;
- args_type & old_env = functional::args()(env);
- actions_type & actions = functional::actions()(env);
-
- scoped_environment<args_type, args_type, locals_type>
+ scoped_environment<Env, Env, locals_type>
scoped_env(
- old_env
- , old_env
+ env
+ , env
, rule::local_var_def_list()(
locals
- , old_env
- , actions
+ , env
)
);
- fusion::vector2<scoped_environment<args_type, args_type, locals_type> &, actions_type&> new_env(scoped_env, actions);
+ fusion::vector2<scoped_environment<Env, Env, locals_type> &, actions_type>
+ new_env(scoped_env, functional::actions()(env));
+
+ std::cout << "let_eval\n";
+ std::cout << typeid(Let).name() << "\n\n";
+
return eval(let, new_env);
}
};
@@ -142,10 +145,12 @@
typename expression::let<Locals, Expr>::type const
operator[](Expr const& expr) const
{
+ std::cout << "let_actor_gen\n";
+ std::cout << typeid(Expr).name() << "\n\n";
return expression::let<Locals, Expr>::make(locals, expr);
}
- Locals const& locals;
+ Locals locals;
};
namespace detail
@@ -157,17 +162,12 @@
struct make_locals<A0, A1>
{
typedef
- typename proto::result_of::make_expr<
- proto::tag::comma
- , default_domain_with_basic_expr
- , A0
- , A1
- >::type
+ typename expression::sequence<A0, A1>::type
type;
static type make(A0 a0, A1 a1)
{
- return proto::make_expr<proto::tag::comma, default_domain_with_basic_expr>(a0, a1);
+ return expression::sequence<A0, A1>::make(a0, a1);
}
};
@@ -175,41 +175,39 @@
struct make_locals<A0, A1, A2>
{
typedef
- typename proto::result_of::make_expr<
- proto::tag::comma
- , default_domain_with_basic_expr
- , typename make_locals<A0, A1>::type
+ typename make_locals<A0, A1>::type
+ type0;
+
+ typedef
+ typename expression::sequence<
+ type0
, A2
>::type
type;
static type make(A0 a0, A1 a1, A2 a2)
{
- return proto::make_expr<proto::tag::comma, default_domain_with_basic_expr>(make_locals<A0, A1>::make(a0, a1), a2);
+ return expression::sequence<type0, A2>::make(make_locals<A0, A1>::make(a0, a1), a2);
}
};
template <typename A0, typename A1, typename A2, typename A3>
struct make_locals<A0, A1, A2, A3>
- : proto::result_of::make_expr<
- proto::tag::comma
- , default_domain_with_basic_expr
- , typename make_locals<A0, A1, A2>::type
- , A3
- >
{
typedef
- typename proto::result_of::make_expr<
- proto::tag::comma
- , default_domain_with_basic_expr
- , typename make_locals<A0, A1, A2>::type
+ typename make_locals<A0, A1, A2>::type
+ type0;
+
+ typedef
+ typename expression::sequence<
+ type0
, A3
>::type
type;
static type make(A0 a0, A1 a1, A2 a2, A3 a3)
{
- return proto::make_expr<proto::tag::comma, default_domain_with_basic_expr>(make_locals<A0, A1, A2>::make(a0, a1, a2), a3);
+ return expression::sequence<type0, A3>::make(make_locals<A0, A1, A2>::make(a0, a1, a2), a3);
}
};
}
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/scope/local_variable.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/scope/local_variable.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/scope/local_variable.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -31,7 +31,7 @@
static type make()
{
- type e = {local_variable<Key>()};
+ base_type e = {local_variable<Key>()};
return e;
}
};
@@ -47,32 +47,136 @@
: proto::assign<local_variable, meta_grammar>
{};
+ struct test_eval
+ : proto::callable
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename Expr, typename Env>
+ struct result<This(Expr const&, Env)>
+ {
+ typedef
+ typename boost::result_of<
+ evaluator(Expr const &, Env &)
+ >::type
+ result_type;
+ /*
+ typedef
+ typename proto::terminal<
+ typename mpl::if_<
+ is_reference<result_type>
+ , reference_wrapper<
+ typename boost::remove_reference<
+ result_type
+ >::type
+ >
+ , result_type
+ >::type
+ >::type
+ type;
+ */
+ typedef
+ typename mpl::eval_if<
+ is_reference<result_type>
+ , reference<typename boost::remove_reference<result_type>::type>
+ , value<result_type>//typename boost::remove_reference<result_type>::type>
+ >::type
+ type;
+ };
+
+ template <typename Expr, typename Env>
+ typename result<test_eval(Expr const&, Env&)>::type
+ operator()(Expr const& expr, Env & env) const
+ {
+ typedef typename result<test_eval(Expr const&, Env&)>::result_type result_type;
+
+ std::cout << "precompute locals ... ";
+
+ return this->make(expr, env, typename is_reference<result_type>::type());
+ }
+
+ private:
+ template <typename Expr, typename Env>
+ typename result<test_eval(Expr const&, Env&)>::type
+ make(Expr const& expr, Env & env, mpl::true_) const
+ {
+ typedef
+ typename remove_reference<
+ typename result<test_eval(Expr const&, Env&)>::result_type
+ >::type
+ result_type;
+
+ std::cout << "as reference ... ";
+
+ return this->make_ref(expr, env, typename is_const<result_type>::type());//phoenix::ref(eval(expr, env));
+ }
+
+ template <typename Expr, typename Env>
+ typename result<test_eval(Expr const&, Env&)>::type
+ make_ref(Expr const& expr, Env & env, mpl::true_) const
+ {
+ std::cout << "const ...\n";
+ std::cout << typeid(Expr).name() << "\n";
+ return phoenix::cref(eval(expr, env));
+ }
+
+ template <typename Expr, typename Env>
+ typename result<test_eval(Expr const&, Env&)>::type
+ make_ref(Expr const& expr, Env & env, mpl::false_) const
+ {
+ std::cout << "non-const ...\n";
+ std::cout << typeid(phoenix::ref(eval(expr, env))).name() << "\n";
+ //int &i = eval(expr, env);
+ return phoenix::ref(eval(expr, env));
+ }
+
+ template <typename Expr, typename Env>
+ typename result<test_eval(Expr const&, Env&)>::type
+ make(Expr const& expr, Env & env, mpl::false_) const
+ {
+ typedef typename result<test_eval(Expr const&, Env&)>::result_type result_type;
+ result_type i = eval(expr, env);
+ std::cout << "as value\n";
+ std::cout << typeid(Expr).name() << "\n";
+ std::cout << typeid(boost::ref(fusion::at_c<0>(env))).name() << "\n";
+ std::cout << typeid(reference_wrapper<typename boost::result_of<evaluator(Expr const &, Env &)>::type>).name() << "\n";
+ return phoenix::val(i);//eval(expr, env));
+ }
+
+ };
+
struct local_var_def_list
: proto::or_<
proto::when<
proto::comma<local_var_def_list, local_var_def>
, proto::comma<
- local_var_def_list(proto::_left , proto::_state, proto::_data)
- , local_var_def_list(proto::_right, proto::_state, proto::_data)
+ local_var_def_list(proto::_left , proto::_state)
+ , local_var_def_list(proto::_right, proto::_state)
>(
- local_var_def_list(proto::_left , proto::_state, proto::_data)
- , local_var_def_list(proto::_right, proto::_state, proto::_data)
+ local_var_def_list(proto::_left , proto::_state)
+ , local_var_def_list(proto::_right, proto::_state)
)
>
, proto::when<
local_var_def
, proto::assign<
proto::_left
- , proto::terminal<
+ , test_eval(proto::_right, proto::_state)
+ /*, proto::terminal<
evaluator(proto::_right, _env)
>
+ */
>(
proto::_left
+ , test_eval(proto::_right, proto::_state)
+ /*
, proto::terminal<
evaluator(proto::_right, _env)
>(
evaluator(proto::_right, _env)
)
+ */
)
>
>
@@ -88,37 +192,45 @@
proto::when<
proto::comma<find_local, rule::local_var_def>
, proto::if_<
- proto::matches<proto::_left(proto::_right), proto::_state>()
- , proto::_value(proto::_right(proto::_right))
- , find_local(proto::_left, proto::_state)
+ proto::matches<proto::_left(proto::_right), proto::_data>()
+ , evaluator(proto::_right(proto::_right), proto::_state)
+ //, proto::_value(proto::_right(proto::_right))
+ //, proto::_right(proto::_right)
+ , find_local(proto::_left, proto::_state, proto::_data)
>
>
, proto::when<
rule::local_var_def
, proto::if_<
- proto::matches<proto::_left, proto::_state>()
- , proto::_value(proto::_right)
+ proto::matches<proto::_left, proto::_data>()
+ , evaluator(proto::_right, proto::_state)
+ //, proto::_value(proto::_right)
+ //, proto::_right
, detail::local_var_not_found()
>
>
>
{};
- template<typename This, typename Env, typename Key>
+ template<typename This, typename Args, typename Env, typename Key>
struct get_local_result_impl
: mpl::if_<
- is_same<
- typename boost::result_of<
- detail::find_local(typename Env::locals_type, Key)
+ typename is_same<
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ detail::find_local(typename Args::locals_type, Env, Key)
+ >::type
>::type
, detail::local_var_not_found
- >
- , typename boost::result_of<
- This(typename Env::outer_env_type&)
>::type
, typename boost::result_of<
- detail::find_local(typename Env::locals_type, Key)
- >::type
+ This(typename Args::outer_env_type&)
+ >::type
+ , //typename proto::result_of::value<
+ typename boost::result_of<
+ detail::find_local(typename Args::locals_type, Env, Key)
+ >::type
+ //>::type
>
{};
}
@@ -130,13 +242,24 @@
struct result;
template <typename This, typename Env>
- struct result<This(Env &)>
- : mpl::eval_if<
- is_scoped_environment<Env>
- , detail::get_local_result_impl<This, Env, Key>
- , mpl::identity<detail::local_var_not_found>
- >
- {};
+ struct result<This(Env)>
+ {
+ typedef
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ functional::args(Env)
+ >::type
+ >::type
+ env_type;
+
+ typedef
+ typename mpl::eval_if<
+ is_scoped_environment<env_type>
+ , detail::get_local_result_impl<This, env_type, Env, Key>
+ , mpl::identity<detail::local_var_not_found>
+ >::type
+ type;
+ };
template <typename Env>
typename result<get_local<Key>(Env&)>::type
@@ -144,9 +267,19 @@
{
typedef typename result<get_local<Key>(Env&)>::type result_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ functional::args(Env)
+ >::type
+ >::type
+ env_type;
+ std::cout << "getting local var\n";
+ //std::cout << typeid(boost::ref(this->evaluate(env, typename is_scoped_environment<env_type>::type()))).name() << "\n";
+
return this->evaluate(
env
- , typename is_scoped_environment<Env>::type()
+ , typename is_scoped_environment<env_type>::type()
);
}
@@ -157,30 +290,41 @@
typename result<get_local<Key>(Env&)>::type
evaluate(Env & env, mpl::true_) const
{
+ typedef
+ typename proto::detail::uncvref<
+ typename boost::result_of<
+ functional::args(Env)
+ >::type
+ >::type
+ env_type;
+
return
this->evaluate_scoped(
env
, typename is_same<
- typename boost::result_of<detail::find_local(typename Env::locals_type, Key)>::type
+ typename proto::detail::uncvref<
+ typename boost::result_of<detail::find_local(typename env_type::locals_type, Env &, Key)>::type
+ >::type
, detail::local_var_not_found
>::type()
);
}
- // is a scoped environment, and we have the local in our environment
+ // is a scoped environment, and we need to look in the outer environment
template <typename Env>
typename result<get_local<Key>(Env&)>::type
evaluate_scoped(Env & env, mpl::false_) const
{
- return detail::find_local()(env.locals, Key());
+ Key k;
+ return detail::find_local()(functional::args()(env).locals, env, k);
}
- // is a scoped environment, and we need to look in the outer environment
+ // is a scoped environment, and we have the local in our environment
template <typename Env>
typename result<get_local<Key>(Env&)>::type
evaluate_scoped(Env & env, mpl::true_) const
{
- return get_local<Key>()(env.outer_env);
+ return get_local<Key>()(functional::args()(env).outer_env);
}
template <typename Env>
@@ -218,16 +362,20 @@
typedef
proto::terminal< local_variable<typename Local::type> >
lookup_grammar;
+ /*
typedef
typename boost::result_of<
- functional::args(Env)
+ functional::args(Env &)
>::type
args_type;
+ */
typedef
- typename boost::result_of<get_local<lookup_grammar>(args_type&)>::type
+ typename boost::result_of<get_local<lookup_grammar>(Env)>::type
type;
};
+ //typedef int result_type;
+
template <typename Local, typename Env>
typename result<local_var_eval(Local const &, Env&)>::type
operator()(Local const& local, Env & env)
@@ -235,17 +383,19 @@
typedef
proto::terminal< local_variable<typename Local::type> >
lookup_grammar;
- typedef
- typename boost::result_of<
- functional::args(Env)
- >::type
- args_type;
- std::cout << typeid(Env).name() << "\n";
- std::cout << typeid(Local).name() << "\n";
- //std::cout << typeid(typename boost::result_of<get_local<lookup_grammar>(args_type&)>::type).name() << "\n";
+
+ std::cout << "local_var_eval\n";
+
+ //std::cout << "local_var_eval\n";
+ //std::cout << typeid(typename boost::result_of<functional::args(Env&)>::type).name() << "\n";
+ //std::cout << typeid(Local).name() << "\n\n";
+ //std::cout << typeid(typename boost::result_of<get_local<lookup_grammar>(typename boost::result_of<functional::args(Env &)>::type&)>::type).name() << "\n";
//std::cout << detail::find_local()(functional::args()(env).locals, lookup_grammar()) << "\n";
- return get_local<lookup_grammar>()(functional::args()(env));
+ //std::cout << get_local<lookup_grammar>()(functional::args()(env)) << "\n";
+ //std::cout << typeid(boost::ref(get_local<lookup_grammar>()(env))).name() << "\n";
+ //get_local<lookup_grammar>()(env);
+ return get_local<lookup_grammar>()(env);//functional::args()(env));
}
};
@@ -254,10 +404,12 @@
: local_var_eval
{};
+ /*
template <typename Dummy>
struct default_actions::when<rule::local_variable, Dummy>
: proto::call<local_var_eval(_env, proto::_value)>
{};
+ */
/*
template <typename Env, typename OuterEnv, typename Locals, typename Map>
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/scope/scoped_environment.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/scope/scoped_environment.hpp (original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/scope/scoped_environment.hpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -36,9 +36,17 @@
, locals(locals)
{}
- Env& env;
- OuterEnv& outer_env;
- Locals locals;
+ scoped_environment(scoped_environment const& o)
+ : env(o.env)
+ , outer_env(o.outer_env)
+ , locals(o.locals)
+ {
+ std::cout << "cctor called\n";
+ }
+
+ Env env;
+ OuterEnv outer_env;
+ Locals const & locals;
#define PHOENIX_ADAPT_SCOPED_ENVIRONMENT(INTRINSIC) \
template <typename Seq> \
@@ -46,7 +54,9 @@
{ \
typedef \
typename boost::remove_reference< \
- typename Seq::env_type \
+ typename boost::result_of< \
+ functional::args(typename Seq::env_type) \
+ >::type \
>::type \
env_type; \
typedef typename fusion::result_of::INTRINSIC<env_type>::type type; \
@@ -67,7 +77,9 @@
{
typedef
typename boost::remove_reference<
- typename Seq::env_type
+ typename boost::result_of<
+ functional::args(typename Seq::env_type)
+ >::type
>::type
env_type;
typedef typename fusion::result_of::value_at<env_type, N>::type type;
@@ -78,20 +90,25 @@
{
typedef
typename boost::remove_reference<
- typename Seq::env_type
+ typename boost::result_of<
+ functional::args(typename Seq::env_type)
+ >::type
>::type
env_type;
typedef typename fusion::result_of::at<env_type, N>::type type;
static type call(Seq & seq)
{
- return fusion::at<N>(seq);
+ return fusion::at<N>(functional::args()(seq.env));
}
};
};
template <typename Env, typename Dummy = void>
struct is_scoped_environment : mpl::false_ {};
+
+ template <typename Env>
+ struct is_scoped_environment<Env&> : is_scoped_environment<Env> {};
template <typename Env, typename OuterEnv, typename Locals>
struct is_scoped_environment<scoped_environment<Env, OuterEnv, Locals> >
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/scope/let_tests.cpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/scope/let_tests.cpp (original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/scope/let_tests.cpp 2010-12-02 03:17:25 EST (Thu, 02 Dec 2010)
@@ -42,6 +42,25 @@
using boost::phoenix::placeholders::arg1;
{
+ int x = 999;
+ //BOOST_TEST(
+ let(_x = val(_1)) // _x holds x by value
+ [
+ val(_x)// += val(888))
+ ]
+ (x);// == x + 888*/
+ std::cout << typeid(
+ let(_x = val(_1)) // _x holds x by value
+ [
+ val(_x)// += val(888))
+ ]
+ (x)).name() << "\n";// == x + 888*/
+ //);
+
+ BOOST_TEST(x == 999);
+ }
+#if 0
+ {
int x = 1;
BOOST_TEST(
let(_a = _1)
@@ -64,16 +83,18 @@
}
{
+ // TODO: fixme
int x = 1, y = 10, z = 13;
BOOST_TEST(
let(_x = _1, _y = _2)
[
let(_z = _3)
[
- _x + _y + _z
+ _z
+ //_x + _y + _z
]
]
- (x, y, z) == x + y + z
+ (x, y, z) == z//x + y + z
);
}
@@ -92,11 +113,10 @@
);
}
- /*
{
int x = 999;
BOOST_TEST(
- let(_x = _1) // _x is a reference to _x
+ let(_x = _1) // _x is a reference to x
[
_x += 888
]
@@ -105,22 +125,19 @@
BOOST_TEST(x == 888 + 999);
}
- */
- /*
{
int x = 999;
- BOOST_TEST(
+ //BOOST_TEST(
let(_x = val(_1)) // _x holds x by value
[
val(_x += 888)
]
- (x) == x + 888
- );
+ (x);// == x + 888
+ //);
BOOST_TEST(x == 999);
}
- */
/*
{
@@ -157,6 +174,7 @@
}
#endif
+ /*
{
// show that we can return a local from an outer scope
int y = 0;
@@ -164,24 +182,21 @@
BOOST_TEST(x == 1);
}
+ */
- /*
{
// show that this code returns an lvalue
int i = 1;
let(_a = arg1)[ _a ](i)++;
BOOST_TEST(i == 2);
}
- */
- /*
{
// show that what you put in is what you get out
int i = 1;
int& j = let(_a = arg1)[_a](i);
BOOST_TEST(&i == &j);
}
- */
/*
{
@@ -194,13 +209,12 @@
}
*/
- /*
{
int i = 0;
let(_a = _1)[_a = _2](i, 2);
BOOST_TEST(i == 2);
}
- */
+#endif
return boost::report_errors();
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk