$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r66470 - in sandbox/SOC/2010/phoenix3: boost/phoenix boost/phoenix/core boost/phoenix/core/detail boost/phoenix/operator libs/phoenix/test libs/phoenix/test/operator
From: thom.heller_at_[hidden]
Date: 2010-11-09 07:34:01
Author: theller
Date: 2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
New Revision: 66470
URL: http://svn.boost.org/trac/boost/changeset/66470
Log:
continued with new design
Added:
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp   (contents, props changed)
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp   (contents, props changed)
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp   (contents, props changed)
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/bitwise.hpp   (contents, props changed)
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/comparision.hpp   (contents, props changed)
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/logical.hpp   (contents, props changed)
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/self.hpp   (contents, props changed)
Text files modified: 
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/actor.hpp                         |   143 ++++++++++++++++++--------------------- 
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/argument.hpp                      |     1                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_operator.hpp         |    38 ++++++----                              
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/actor_result_of.hpp        |     9 ++                                      
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/make_basic_environment.hpp |    17 +++-                                    
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/environment.hpp                   |    81 +++++++++++++--------                   
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator.hpp                           |    47 ++++++++++++                            
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/if_else.hpp                   |    28 ++++++-                                 
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/io.hpp                        |     4                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/member.hpp                    |     9 +                                       
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile                            |    20 ++--                                    
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/arithmetic_tests.cpp      |     1                                         
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/self_tests.cpp            |     2                                         
   13 files changed, 250 insertions(+), 150 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-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -11,15 +11,11 @@
 
 #include <boost/mpl/identity.hpp>
 #include <boost/mpl/eval_if.hpp>
-/*#include <boost/phoenix/core/arity.hpp>
-#include <boost/phoenix/core/compose.hpp>
-#include <boost/phoenix/core/domain.hpp>
-#include <boost/phoenix/core/no_nullary.hpp>*/
 #include <boost/phoenix/core/domain.hpp>
 #include <boost/phoenix/core/environment.hpp>
+#include <boost/phoenix/core/is_nullary.hpp>
 #include <boost/phoenix/core/limits.hpp>
 #include <boost/phoenix/core/meta_grammar.hpp>
-#include <boost/phoenix/core/is_nullary.hpp>
 #include <boost/phoenix/support/iterate.hpp>
 #include <boost/proto/extends.hpp>
 #include <boost/utility/result_of.hpp>
@@ -53,11 +49,11 @@
 
             typedef typename
                 mpl::eval_if<
-                    typename is_nullary<Expr>::type//false//arity == 0 // avoid calling result_of::actor when this is false
+                    typename is_nullary<Expr>::type // avoid calling result_of::actor when this is false
                   , boost::result_of<
                         evaluator(
-                            Expr const&
-                          , fusion::vector2<typename make_basic_environment<>::type&, default_actions>
+                            Expr const &
+                          , typename make_basic_environment<default_actions>::type &
                         )
                     >
                   , mpl::identity<detail::error_expecting_arguments>
@@ -67,48 +63,36 @@
 
         template <typename Expr, typename A0>
         struct actor<Expr, A0>
-            /*: boost::result_of<eval_grammar(
-                ::boost::phoenix::actor<Expr> const &,
-                typename make_basic_environment<A0>::type&)
-            >*/
             : boost::result_of<
                 evaluator(
-                    Expr const&
-                  , fusion::vector2<typename make_basic_environment<A0>::type&, default_actions>
+                    Expr const &
+                  , typename make_basic_environment<default_actions, A0>::type &
                 )
             >
         {};
 
         template <typename Expr, typename A0, typename A1>
         struct actor<Expr, A0, A1>
-            /*: boost::result_of<eval_grammar(
-                ::boost::phoenix::actor<Expr> const &,
-                typename make_basic_environment<A0, A1>::type&)
-            >*/
             : boost::result_of<
                 evaluator(
                     Expr const&
-                  , fusion::vector2<typename make_basic_environment<A0, A1>::type&, default_actions>
+                  , typename make_basic_environment<default_actions, A0, A1>::type &
                 )
             >
         {};
 
         template <typename Expr, typename A0, typename A1, typename A2>
         struct actor<Expr, A0, A1, A2>
-            /*: boost::result_of<eval_grammar(
-                ::boost::phoenix::actor<Expr> const &,
-                typename make_basic_environment<A0, A1, A2>::type&)
-            >*/
             : boost::result_of<
                 evaluator(
                     Expr const&
-                  , fusion::vector2<typename make_basic_environment<A0, A1, A2>::type&, default_actions>
+                  , typename make_basic_environment<default_actions, A0, A1, A2>::type &
                 )
             >
         {};
 
         // Bring in the rest
-        //#include <boost/phoenix/core/detail/actor_result_of.hpp>
+        #include <boost/phoenix/core/detail/actor_result_of.hpp>
     }
     
     /*
@@ -146,15 +130,10 @@
         typename result_of::actor<Expr>::type
         operator()() const
         {
-            typename make_basic_environment<>::type args;
+            typedef make_basic_environment<default_actions> env_type;
+            typename env_type::type env = env_type::make();
 
-            typedef make_basic_environment<>::type params_type;
-            typedef fusion::vector2<params_type, default_actions> env_type;
-            
-            env_type env(args, default_actions());
             return eval(*this, env);
-
-            //return eval(this->proto_base(), args);
         }
 
         template <typename This, typename A0>
@@ -166,32 +145,30 @@
         typename result_of::actor<Expr, A0&>::type
         operator()(A0& a0) const
         {
-            typename make_basic_environment<A0&>::type args(a0);
-            typedef typename make_basic_environment<A0&>::type params_type;
-            typedef fusion::vector2<params_type, default_actions> env_type;
-            
-            env_type env(args, default_actions());
+            typedef make_basic_environment<default_actions, A0&> env_type;
+            typename env_type::type env = env_type::make(a0);
 
             return eval(*this, env);
         }
 
-        /*
         template <typename A0>
         typename result_of::actor<Expr, A0 const&>::type
         operator()(A0 const& a0) const
         {
-            typename make_basic_environment<A0 const&>::type args(a0);
+            typedef make_basic_environment<default_actions, A0 const&> env_type;
+            typename env_type::type env = env_type::make(a0);
             
-            return eval(*this, args);
+            return eval(*this, env);
         }
 
+		  /*
         template <typename A0>
         typename compose<actor_fun_eval<actor<Expr>, actor<A0> >, actor<Expr>, actor<A0> >::type const
         operator()(actor<A0> const& a0) const
         {
             return compose<actor_fun_eval<actor<Expr>, actor<A0> >, actor<Expr>, actor<A0> >()(*this, a0);
         }
-        */
+		  */
 
         template <typename This, typename A0, typename A1>
         struct result<This(A0&, A1&)>
@@ -202,43 +179,43 @@
         typename result_of::actor<Expr, A0&, A1&>::type
         operator()(A0& a0, A1& a1) const
         {
-            typedef typename make_basic_environment<A0&, A1&>::type params_type;
-            params_type args(a0, a1);
-            typedef fusion::vector2<params_type, default_actions> env_type;
-            
-            env_type env(args, default_actions());
+            typedef make_basic_environment<default_actions, A0&, A1&> env_type;
+            typename env_type::type env = env_type::make(a0, a1);
 
             return eval(*this, env);
         }
 
-        /*
         template <typename A0, typename A1>
         typename result_of::actor<Expr, A0&, A1 const&>::type
         operator()(A0& a0, A1 const& a1) const
         {
-            typename make_basic_environment<A0&, A1 const&>::type args(a0, a1);
+            typedef make_basic_environment<default_actions, A0&, A1 const&> env_type;
+            typename env_type::type env = env_type::make(a0, a1);
             
-            return eval(*this, args);
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1>
         typename result_of::actor<Expr, A0 const&, A1&>::type
         operator()(A0 const& a0, A1& a1) const
         {
-            typename make_basic_environment<A0 const&, A1&>::type args(a0, a1);
+            typedef make_basic_environment<default_actions, A0 const&, A1 &> env_type;
+            typename env_type::type env = env_type::make(a0, a1);
             
-            return eval(*this, args);
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1>
         typename result_of::actor<Expr, A0 const&, A1 const&>::type
         operator()(A0 const& a0, A1 const& a1) const
         {
-            typename make_basic_environment<A0 const&, A1 const&>::type args(a0, a1);
+            typedef make_basic_environment<default_actions, A0 const&, A1 const&> env_type;
+            typename env_type::type env = env_type::make(a0, a1);
             
-            return eval(this->proto_base(), args);
+            return eval(this->proto_base(), env);
         }
 
+        /*
         template <typename A0, typename A1>
         typename compose<
             actor_fun_eval<
@@ -253,6 +230,7 @@
               , actor<Expr>, actor<A0>, actor<A1>
               >()(*this, a0, a1);
         }
+		  */
 
         template <typename This, typename A0, typename A1, typename A2>
         struct result<This(A0, A1, A2)>
@@ -263,74 +241,83 @@
         typename result_of::actor<Expr, A0&, A1&, A2&>::type
         operator()(A0& a0, A1& a1, A2& a2) const
         {
-            typename make_basic_environment<A0&, A1&, A2&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0&, A1&, A2&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0 const&, A1&, A2&>::type
         operator()(A0 const& a0, A1& a1, A2& a2) const
         {
-            typename make_basic_environment<A0 const&, A1&, A2&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0 const&, A1&, A2&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         } 
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0&, A1 const&, A2&>::type
         operator()(A0& a0, A1 const& a1, A2& a2) const
         {
-            typename make_basic_environment<A0&, A1 const&, A2&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0&, A1 const&, A2&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0&, A1&, A2 const&>::type
         operator()(A0& a0, A1& a1, A2 const& a2) const
         {
-            typename make_basic_environment<A0&, A1&, A2 const&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0&, A1&, A2 const&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0 const&, A1 const&, A2&>::type
         operator()(A0 const& a0, A1 const& a1, A2& a2) const
         {
-            typename make_basic_environment<A0 const&, A1 const&, A2&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0 const&, A1 const&, A2&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0&, A1 const&, A2 const&>::type
         operator()(A0& a0, A1 const& a1, A2 const& a2) const
         {
-            typename make_basic_environment<A0&, A1 const&, A2 const&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0&, A1 const&, A2 const&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         } 
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0 const&, A1&, A2 const&>::type
         operator()(A0 const& a0, A1& a1, A2 const& a2) const
         {
-            typename make_basic_environment<A0 const&, A1&, A2 const&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0 const&, A1&, A2 const&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         }
 
         template <typename A0, typename A1, typename A2>
         typename result_of::actor<Expr, A0 const&, A1 const&, A2 const&>::type
         operator()(A0 const& a0, A1 const& a1, A2 const& a2) const
         {
-            typename make_basic_environment<A0 const&, A1 const&, A2 const&>::type args(a0, a1, a2);
-            
-            return eval(*this, args);
+            typedef make_basic_environment<default_actions, A0 const&, A1 const&, A2 const&> env_type;
+            typename env_type::type env = env_type::make(a0, a1, a2);
+
+            return eval(*this, env);
         }
 
+		  /*
         template <typename A0, typename A1, typename A2>
         typename compose<
             actor_fun_eval<
@@ -345,10 +332,10 @@
               , actor<Expr>, actor<A0>, actor<A1>, actor<A2>
               >()(*this, a0, a1, a2);
         }
+        */
 
         // Bring in the rest
         #include <boost/phoenix/core/detail/actor_operator.hpp>
-        */
     };
 
     /*
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/argument.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/argument.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/argument.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -18,6 +18,7 @@
 */
 #include <boost/phoenix/core/limits.hpp>
 #include <boost/phoenix/core/actor.hpp>
+#include <boost/phoenix/core/terminal.hpp>
 
 #include <boost/fusion/sequence/intrinsic/at.hpp>
 
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-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -35,18 +35,20 @@
         typename result_of::actor<Expr, PHOENIX_A_ref>::type
         operator()(PHOENIX_A_ref_a) const
         {
-            PHOENIX_ENV(PHOENIX_A_ref) args( PHOENIX_a);
+            typedef make_basic_environment<default_actions, PHOENIX_A_ref> env_type;
+            typename env_type::type env = env_type::make(PHOENIX_a);
 
-            return eval(*this, args);
+            return eval(*this, env);
         }
 
         template <PHOENIX_typename_A>
         typename result_of::actor<Expr, PHOENIX_A_const_ref>::type
         operator()(PHOENIX_A_const_ref_a) const
         {
-            PHOENIX_ENV(PHOENIX_A_const_ref) args( PHOENIX_a);
+            typedef make_basic_environment<default_actions, PHOENIX_A_const_ref> env_type;
+            typename env_type::type env = env_type::make(PHOENIX_a);
 
-            return eval(*this, args);
+            return eval(*this, env);
         }
 
 #else
@@ -58,23 +60,28 @@
 // if PHOENIX_ITERATION > PHOENIX_LIMIT_PERFECT_FORWARD
 // only operator()(A const &...a) and operator()(A &...a) are generated
 // this is all handled by the PP mumbo jumbo above
-#define PHOENIX_ACTOR_OPERATOR(_, I, __)                                       \
-        template <PHOENIX_typename_A>                                          \
-        typename result_of::actor<Expr, PHOENIX_PERM_A(I)>::type               \
-        operator()(PHOENIX_PERM_A_a(I)) const                                  \
-        {                                                                      \
-            BOOST_PROTO_ASSERT_MATCHES(*this, eval_grammar);                   \
-            PHOENIX_ENV(PHOENIX_PERM_A(I)) args(PHOENIX_a);                    \
-                                                                               \
-            return eval(*this, args);                                          \
-        }
+#define PHOENIX_ACTOR_OPERATOR(_, I, __)                                        \
+        template <PHOENIX_typename_A>                                           \
+        typename result_of::actor<Expr, PHOENIX_PERM_A(I)>::type                \
+        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);            \
+                                                                                \
+            return eval(*this, env);                                            \
+        }                                                                       \
+        /**/
 
         BOOST_PP_REPEAT( PHOENIX_PERM_SIZE, PHOENIX_ACTOR_OPERATOR, _)
 
 #undef PHOENIX_ACTOR_OPERATOR
 
 #endif
-
+/*
         template <PHOENIX_typename_A>
         typename compose<
             actor_fun_eval<
@@ -89,6 +96,7 @@
               , actor<Expr>, BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, actor<A, > BOOST_PP_INTERCEPT)
               >()(*this, a0, a1, a2);
         }
+*/
 
 #undef PHOENIX_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-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -26,9 +26,16 @@
 
         template <typename Expr, PHOENIX_typename_A>
         struct actor<Expr, BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, A)>
-            : boost::result_of<eval_grammar(
+            /*: boost::result_of<eval_grammar(
                 ::boost::phoenix::actor<Expr> const &,
                     PHOENIX_ENV(PHOENIX_A)&)>
+						  */
+            : boost::result_of<
+                evaluator(
+                    Expr const&
+                  , typename make_basic_environment<default_actions, PHOENIX_A>::type &
+                )
+            >
         {};
 
 #undef PHOENIX_ENV
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/make_basic_environment.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/make_basic_environment.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/detail/make_basic_environment.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -20,9 +20,18 @@
 
 #else
 
-    template <PHOENIX_typename_A>
-    struct make_basic_environment<PHOENIX_A>
-        : mpl::identity<
-            BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<PHOENIX_A> > {};
+    template <typename Actions, PHOENIX_typename_A>
+    struct make_basic_environment<Actions, PHOENIX_A>
+    {
+		 typedef
+			 BOOST_PP_CAT(fusion::vector, PHOENIX_ITERATION)<PHOENIX_A>
+			 params_type;
+		 typedef fusion::vector2<params_type, Actions> type;
+
+		 static type make(PHOENIX_A_a)
+		 {
+			 return type(params_type(PHOENIX_a), Actions());
+		 }
+	 };
 
 #endif
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-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -9,6 +9,7 @@
 
 #include <boost/phoenix/core/limits.hpp>
 #include <boost/fusion/sequence/intrinsic/at.hpp>
+#include <boost/fusion/container/vector.hpp>
 #include <boost/fusion/support/is_sequence.hpp>
 #include <boost/phoenix/support/iterate.hpp>
 #include <boost/utility/enable_if.hpp>
@@ -137,39 +138,57 @@
     };
     */
     
-    template </*typename Actions,*/ PHOENIX_typename_A_void(PHOENIX_ARG_LIMIT), typename Dummy = void>
+    template <typename Actions, PHOENIX_typename_A_void(PHOENIX_ARG_LIMIT), typename Dummy = void>
     struct make_basic_environment;
     
-    //template <typename Actions>
-    template <>
-    struct make_basic_environment<>//<Actions>
-        : mpl::identity<//fusion::vector2<
-        fusion::vector0<>
-        //, Actions>
-        >
-        {};
-
-    //template <typename Actions, typename A0>
-    template <typename A0>
-    struct make_basic_environment</*Actions,*/ A0>
-        : mpl::identity<//fusion::vector2<
-        fusion::vector1<A0>
-        //, Actions>
-        >
-        {};
-
-    template <typename A0, typename A1>
-    struct make_basic_environment<A0, A1>
-        : mpl::identity<//fusion::vector2<
-            fusion::vector2<A0, A1>
-            //, Actions>
-            > 
-        {};
-
-    template <typename A0, typename A1, typename A2>
-    struct make_basic_environment<A0, A1, A2>
-        : mpl::identity<fusion::vector3<A0, A1, A2> >
-        {};
+    template <typename Actions>
+    struct make_basic_environment<Actions>
+    {
+		 typedef fusion::vector0<>                     params_type;
+		 typedef fusion::vector2<params_type, Actions> type;
+
+		 static type make()
+		 {
+			 return type(params_type(), Actions());
+		 }
+	 };
+
+    template <typename Actions, typename A0>
+    struct make_basic_environment<Actions, A0>
+    {
+		 typedef fusion::vector1<A0>                   params_type;
+		 typedef fusion::vector2<params_type, Actions> type;
+
+		 static type make(A0 a0)
+		 {
+			 return type(params_type(a0), Actions());
+		 }
+	 };
+
+    template <typename Actions, typename A0, typename A1>
+    struct make_basic_environment<Actions, A0, A1>
+    {
+		 typedef fusion::vector2<A0, A1>               params_type;
+		 typedef fusion::vector2<params_type, Actions> type;
+
+		 static type make(A0 a0, A1 a1)
+		 {
+			 params_type params(a0, a1);
+			 return type(params, Actions());
+		 }
+	 };
+
+    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::vector2<params_type, Actions> type;
+
+		 static type make(A0 a0, A1 a1, A2 a2)
+		 {
+			 return type(params_type(a0, a1, a2), Actions());
+		 }
+	 };
 
     // Bring in the rest
     #include <boost/phoenix/core/detail/make_basic_environment.hpp>
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,37 @@
+
+#ifndef BOOST_PP_IS_ITERATING
+
+/*=============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    Copyright (c) 2010 Eric Niebler
+    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 PHOENIX_CORE_IS_NULLARY_HPP
+#define PHOENIX_CORE_IS_NULLARY_HPP
+
+namespace boost { namespace phoenix
+{
+	template <typename Expr> struct actor;
+
+	template <
+		template <typename> Actor
+	 , PHOENIX_A_void(PHOENIX_LIMIT)
+	 , typename Dummy = void>
+	struct expr_ext;
+
+	template <PHOENIX_A_void(PHOENIX_LIMIT)>
+	struct expr : expr_ext<actor, PHOENIX_A(PHOENIX_LIMIT)> {};
+
+}}
+
+#endif
+
+#else
+	
+template <
+struct 
+
+#endif
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/is_nullary.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,60 @@
+/*=============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    Copyright (c) 2010 Eric Niebler
+    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 PHOENIX_CORE_IS_NULLARY_HPP
+#define PHOENIX_CORE_IS_NULLARY_HPP
+
+#include <boost/proto/proto.hpp>
+#include <boost/phoenix/core/environment.hpp>
+#include <boost/phoenix/core/meta_grammar.hpp>
+#include <boost/phoenix/core/terminal.hpp>
+
+namespace boost { namespace phoenix
+{
+	namespace detail
+	{
+		struct is_nullary_
+		{
+			template <typename Rule, typename Dummy = void>
+			struct when
+				: proto::fold<
+				    proto::_
+				  , mpl::true_()
+				  , mpl::and_<
+				      proto::_state
+				    , evaluator(proto::_, _env)
+				    >()
+				>
+			{};
+		};
+
+		template <typename Dummy>
+		struct is_nullary_::when<rule::argument, Dummy>
+			: proto::make<mpl::false_()>
+		{};
+
+		template <typename Dummy>
+		struct is_nullary_::when<rule::custom_terminal, Dummy>
+			: proto::make<mpl::true_()>
+		{};
+
+		template <typename Dummy>
+		struct is_nullary_::when<rule::terminal, Dummy>
+			: proto::make<mpl::true_()>
+		{};
+	}
+
+	template <typename Expr>
+	struct is_nullary
+		: boost::result_of<evaluator(Expr const&, make_basic_environment<detail::is_nullary_>::type&)>
+	{};
+
+}}
+
+#endif
+
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/operator.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/operator.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -7,10 +7,53 @@
 #ifndef PHOENIX_OPERATOR_HPP
 #define PHOENIX_OPERATOR_HPP
 
+#define PHOENIX_UNARY_RULE(_, __, name)                                         \
+		struct name                                                               \
+		  : proto::unary_expr<proto::tag::name, meta_grammar>                     \
+		{};                                                                       \
+	/**/
+
+#define PHOENIX_BINARY_RULE(_, __, name)                                        \
+		struct name                                                               \
+		  : proto::binary_expr<proto::tag::name, meta_grammar, meta_grammar>      \
+		{};                                                                       \
+	/**/
+
+#define PHOENIX_GRAMMAR(_, __, name)                                            \
+	template <typename Dummy>                                                    \
+	struct meta_grammar::case_<proto::tag::name, Dummy>                          \
+		: proto::when<rule::name, proto::external_transform>                      \
+	{};                                                                          \
+	/**/
+
+#define PHOENIX_UNARY_OPERATORS(ops)                                            \
+	namespace rule {                                                             \
+		BOOST_PP_SEQ_FOR_EACH(PHOENIX_UNARY_RULE, _, ops)                         \
+	}                                                                            \
+	BOOST_PP_SEQ_FOR_EACH(PHOENIX_GRAMMAR, _, ops)                               \
+	/**/
+
+#define PHOENIX_BINARY_OPERATORS(ops)                                           \
+	namespace rule {                                                             \
+		BOOST_PP_SEQ_FOR_EACH(PHOENIX_BINARY_RULE, _, ops)                        \
+	}                                                                            \
+	BOOST_PP_SEQ_FOR_EACH(PHOENIX_GRAMMAR, _, ops)                               \
+	/**/
+
 #include <boost/phoenix/version.hpp>
-#include <boost/phoenix/operator/operator.hpp>
+#include <boost/phoenix/operator/arithmetic.hpp>
+#include <boost/phoenix/operator/bitwise.hpp>
+#include <boost/phoenix/operator/comparision.hpp>
 #include <boost/phoenix/operator/if_else.hpp>
+#include <boost/phoenix/operator/self.hpp>
+#include <boost/phoenix/operator/logical.hpp>
 #include <boost/phoenix/operator/io.hpp>
-//#include <boost/phoenix/operator/member.hpp>
+#include <boost/phoenix/operator/member.hpp>
+
+#undef PHOENIX_UNARY_RULE
+#undef PHOENIX_BINARY_RULE
+#undef PHOENIX_GRAMMAR
+#undef PHOENIX_UNARY_OPERATORS
+#undef PHOENIX_BINARY_OPERATORS
 
 #endif
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/arithmetic.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,38 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    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 PHOENIX_OPERATOR_ARITHMETIC_HPP
+#define PHOENIX_OPERATOR_ARITHMETIC_HPP
+
+#include <boost/phoenix/core/meta_grammar.hpp>
+
+namespace boost { namespace phoenix
+{
+	PHOENIX_UNARY_OPERATORS(
+		(negate)
+		(unary_plus)
+		(pre_inc)
+		(pre_dec)
+		(post_inc)
+		(post_dec)
+	)
+	
+	PHOENIX_BINARY_OPERATORS(
+		(plus_assign)
+		(minus_assign)
+		(multiplies_assign)
+		(divides_assign)
+		(modulus_assign)
+		(plus)
+		(minus)
+		(multiplies)
+		(divides)
+		(modulus)
+	)
+}}
+
+#endif
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/bitwise.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/bitwise.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,30 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    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 PHOENIX_OPERATOR_BITWISE_HPP
+#define PHOENIX_OPERATOR_BITWISE_HPP
+
+#include <boost/phoenix/core/meta_grammar.hpp>
+
+namespace boost { namespace phoenix
+{
+	
+	PHOENIX_BINARY_OPERATORS(
+		(bitwise_and_assign)
+		(bitwise_or_assign)
+		(bitwise_xor_assign)
+		(shift_left_assign)
+		(shift_right_assign)
+		(bitwise_and)
+		(bitwise_or)
+		(bitwise_xor)
+		(shift_left)
+		(shift_right)
+	)
+}}
+
+#endif
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/comparision.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/comparision.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,26 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    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 PHOENIX_OPERATOR_COMPARISION_HPP
+#define PHOENIX_OPERATOR_COMPARISION_HPP
+
+#include <boost/phoenix/core/meta_grammar.hpp>
+
+namespace boost { namespace phoenix
+{
+	
+	PHOENIX_BINARY_OPERATORS(
+		(equal_to)
+		(not_equal_to)
+		(less_equal)
+		(greater_equal)
+		(less)
+		(greater)
+	)
+}}
+
+#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-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -5,14 +5,33 @@
     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 PHOENIX_OBJECT_IF_ELSE_HPP
-#define PHOENIX_OBJECT_IF_ELSE_HPP
+#ifndef PHOENIX_OPERATOR_IF_ELSE_HPP
+#define PHOENIX_OPERATOR_IF_ELSE_HPP
 
-#include <boost/phoenix/core/compose.hpp>
-#include <boost/utility/result_of.hpp>
+//#include <boost/phoenix/core/compose.hpp>
+//#include <boost/utility/result_of.hpp>
 
 namespace boost { namespace phoenix
 {
+	namespace rule
+	{
+		struct if_else
+		  : proto::nary_expr<
+		    proto::tag::if_else_
+		  , meta_grammar
+		  , meta_grammar
+		  , meta_grammar>
+		{};
+	}
+
+	template <typename Dummy>
+	struct meta_grammar::case_<proto::tag::if_else_, Dummy>
+		: proto::when<rule::if_else, proto::external_transform>
+	{};
+
+	using proto::if_else;
+
+	/*
     namespace result_of
     {
         template <typename Env, typename Cond, typename Then, typename Else>
@@ -63,6 +82,7 @@
     {
         return make_if_else<Cond, Then, Else>()(cond, then, else_);
     }
+	 */
 }}
 
 #endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/io.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/operator/io.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/io.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -8,8 +8,8 @@
 #ifndef PHOENIX_OPERATOR_IO_HPP
 #define PHOENIX_OPERATOR_IO_HPP
 
-#include <boost/phoenix/core/actor.hpp>
-#include <boost/phoenix/core/domain.hpp>
+//#include <boost/phoenix/core/actor.hpp>
+//#include <boost/phoenix/core/domain.hpp>
 #include <boost/proto/make_expr.hpp>
 #include <boost/proto/tags.hpp>
 
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/logical.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/logical.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,25 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    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 PHOENIX_OPERATOR_LOGICAL_HPP
+#define PHOENIX_OPERATOR_LOGICAL_HPP
+
+#include <boost/phoenix/core/meta_grammar.hpp>
+
+namespace boost { namespace phoenix
+{
+	
+	PHOENIX_UNARY_OPERATORS(
+		(logical_not)
+	)
+	PHOENIX_BINARY_OPERATORS(
+		(logical_and)
+		(logical_or)
+	)
+}}
+
+#endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/member.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/operator/member.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/member.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -11,7 +11,7 @@
 #ifndef PHOENIX_OPERATOR_MEMBER_HPP
 #define PHOENIX_OPERATOR_MEMBER_HPP
 
-#include <boost/get_pointer.hpp>
+/*#include <boost/get_pointer.hpp>
 #include <boost/phoenix/core/actor.hpp>
 #include <boost/phoenix/core/compose.hpp>
 #include <boost/phoenix/core/domain.hpp>
@@ -20,10 +20,14 @@
 #include <boost/proto/make_expr.hpp>
 #include <boost/proto/tags.hpp>
 #include <boost/type_traits/is_member_function_pointer.hpp>
-#include <boost/type_traits/is_member_object_pointer.hpp>
+#include <boost/type_traits/is_member_object_pointer.hpp>*/
 
 namespace boost { namespace phoenix
 {
+	PHOENIX_BINARY_OPERATORS(
+		(mem_ptr)
+	)
+	/*
     namespace detail
     {
 
@@ -116,6 +120,7 @@
     {
         return make_mem_obj_ptr<actor<Object>, MemPtr>()(obj, ptr);
     }
+*/
 
 }}
 
Added: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/self.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/self.hpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -0,0 +1,25 @@
+/*==============================================================================
+    Copyright (c) 2005-2010 Joel de Guzman
+    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 PHOENIX_OPERATOR_SELF_HPP
+#define PHOENIX_OPERATOR_SELF_HPP
+
+#include <boost/phoenix/core/meta_grammar.hpp>
+
+namespace boost { namespace phoenix
+{
+	PHOENIX_UNARY_OPERATORS(
+		(address_of)
+		(dereference)
+	)
+	PHOENIX_BINARY_OPERATORS(
+		(assign)
+		(subscript)
+	)
+}}
+
+#endif
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile	(original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -22,16 +22,16 @@
     ;
 
 test-suite phoenix_operator :
-#    [ run operator/arithmetic_tests.cpp ] 
-#    [ run operator/bitwise_tests.cpp ]
-#    [ run operator/comparison_tests.cpp ] 
-#    [ run operator/if_else_tests.cpp ]
-#    [ run operator/io_tests.cpp ]
-#    [ run operator/logical_tests.cpp ]
-#    [ run operator/misc_binary_tests.cpp ]
-#    [ run operator/self_tests.cpp ]
-#    [ run operator/unary_tests.cpp ] 
-#    [ run operator/member.cpp ]
+    [ run operator/arithmetic_tests.cpp ] 
+    [ run operator/bitwise_tests.cpp ]
+    [ run operator/comparison_tests.cpp ] 
+    [ run operator/if_else_tests.cpp ]
+    [ run operator/io_tests.cpp ]
+    [ run operator/logical_tests.cpp ]
+    [ run operator/misc_binary_tests.cpp ]
+    [ run operator/self_tests.cpp ]
+    [ run operator/unary_tests.cpp ] 
+    [ run operator/member.cpp ]
     ;
 
 test-suite phoenix_object :
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/arithmetic_tests.cpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/arithmetic_tests.cpp	(original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/arithmetic_tests.cpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -39,6 +39,7 @@
     }
 
     {
+        BOOST_TEST((-val(123))() == -123);
         BOOST_TEST((val(123) + 456)() == 123 + 456);
         BOOST_TEST((val(123) - 456)() == 123 - 456);
         BOOST_TEST((val(123) * 456)() == 123 * 456);
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/self_tests.cpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/self_tests.cpp	(original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/operator/self_tests.cpp	2010-11-09 07:33:41 EST (Tue, 09 Nov 2010)
@@ -26,7 +26,7 @@
     {
         int x = 123;
         BOOST_TEST((&arg1)(x) == &x);
-        BOOST_TEST((*&arg1)(x) == 123);
+        //BOOST_TEST((*&arg1)(x) == 123);
 
         int y = 968;
         (ref(x) = arg1)(y);