$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r66642 - in sandbox/SOC/2010/phoenix3: boost/phoenix boost/phoenix/core boost/phoenix/object boost/phoenix/object/detail boost/phoenix/operator boost/phoenix/operator/detail libs/phoenix/test libs/phoenix/test/object
From: thom.heller_at_[hidden]
Date: 2010-11-19 06:23:44
Author: theller
Date: 2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
New Revision: 66642
URL: http://svn.boost.org/trac/boost/changeset/66642
Log:
finished refactoring of object module
Added:
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/target.hpp
      - copied, changed from r66641, /sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/cast_target.hpp
Removed:
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/cast_target.hpp
Text files modified: 
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp                 |   173 +++++++++++++++++++++++++++++++++++++++ 
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/unpack.hpp                     |    85 ++++++++++++++++---                     
   sandbox/SOC/2010/phoenix3/boost/phoenix/object.hpp                          |     4                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/const_cast.hpp               |    38 ++------                                
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/construct.hpp                |    74 +++-------------                        
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct.hpp         |     6                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct_eval.hpp    |     4                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new.hpp               |     8                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new_eval.hpp          |     4                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/target.hpp            |     2                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/dynamic_cast.hpp             |    38 ++------                                
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/new.hpp                      |    75 ++++-------------                       
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/reinterpret_cast.hpp         |    38 ++------                                
   sandbox/SOC/2010/phoenix3/boost/phoenix/object/static_cast.hpp              |    38 ++------                                
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp |     2                                         
   sandbox/SOC/2010/phoenix3/boost/phoenix/operator/member.hpp                 |     5 +                                       
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile                         |     4                                         
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/object/new_delete_tests.cpp     |    26 ++++-                                   
   18 files changed, 357 insertions(+), 267 deletions(-)
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/expression.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -13,6 +13,7 @@
 #define PHOENIX_CORE_EXPRESSION_HPP
 
 #include <boost/phoenix/support/iterate.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
 
 namespace boost { namespace phoenix
 {
@@ -39,6 +40,173 @@
 
 }}
 
+#define PHOENIX_DEFINE_EXPRESSION(NAME, SEQ)                                    \
+    namespace tag {                                                             \
+        struct NAME {};                                                         \
+    }                                                                           \
+                                                                                \
+    namespace expression                                                        \
+    {                                                                           \
+        template <BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(SEQ), typename A)>     \
+        struct NAME                                                             \
+            : expr<tag:: NAME, BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(SEQ), A)> \
+        {};                                                                     \
+    }                                                                           \
+                                                                                \
+    namespace rule {                                                            \
+        struct NAME                                                             \
+            : expression:: NAME <BOOST_PP_SEQ_ENUM(SEQ)>                        \
+        {};                                                                     \
+    }                                                                           \
+                                                                                \
+    template <typename Dummy>                                                   \
+    struct meta_grammar::case_<tag:: NAME, Dummy>                               \
+        : proto::when<rule:: NAME, proto::external_transform>                   \
+    {};                                                                         \
+    /**/
+
+#define PHOENIX_DEFINE_EXPRESSION_VARARG_R(_, N, NAME)                          \
+    template <                                                                  \
+        PHOENIX_typename_A(                                                     \
+            BOOST_PP_ADD(                                                       \
+                N                                                               \
+              , BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 1, NAME))              \
+            )                                                                   \
+        )                                                                       \
+    >                                                                           \
+    struct BOOST_PP_TUPLE_ELEM(2, 0, NAME)<                                     \
+        PHOENIX_A(                                                              \
+            BOOST_PP_ADD(N, BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 1, NAME))) \
+        )                                                                       \
+    >                                                                           \
+        : expr<                                                                 \
+            tag:: BOOST_PP_TUPLE_ELEM(2, 0, NAME)                               \
+          , PHOENIX_A(                                                          \
+                BOOST_PP_ADD(                                                   \
+                    N                                                           \
+                  , BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(2, 1, NAME))          \
+                )                                                               \
+            )                                                                   \
+        >                                                                       \
+    {};                                                                         \
+    /**/
+
+#define PHOENIX_DEFINE_EXPRESSION_VARARG(NAME, GRAMMAR, LIMIT)                  \
+    namespace tag {                                                             \
+        struct NAME {};                                                         \
+    }                                                                           \
+                                                                                \
+    namespace expression                                                        \
+    {                                                                           \
+        template <                                                              \
+            PHOENIX_typename_A_void(                                            \
+                BOOST_PP_ADD(LIMIT, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR)))   \
+            )                                                                   \
+          , typename Dummy = void                                               \
+        >                                                                       \
+        struct NAME;                                                            \
+                                                                                \
+        BOOST_PP_REPEAT_FROM_TO(                                                \
+            1                                                                   \
+          , BOOST_PP_ADD(LIMIT, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR)))       \
+          , PHOENIX_DEFINE_EXPRESSION_VARARG_R                                  \
+          , (NAME, BOOST_PP_SEQ_POP_BACK(GRAMMAR))                              \
+        )                                                                       \
+    }                                                                           \
+                                                                                \
+    namespace rule {                                                            \
+        struct NAME                                                             \
+            : expression:: NAME <                                               \
+                BOOST_PP_IF(                                                    \
+                    BOOST_PP_EQUAL(1, BOOST_PP_SEQ_SIZE(GRAMMAR))               \
+                  , BOOST_PP_EMPTY()                                            \
+                  , BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_POP_BACK(GRAMMAR))           \
+                )                                                               \
+                BOOST_PP_COMMA_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR)))     \
+                proto::vararg<                                                  \
+                    BOOST_PP_SEQ_ELEM(                                          \
+                        BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(GRAMMAR))                \
+                      , GRAMMAR                                                 \
+                    )                                                           \
+                >                                                               \
+            >                                                                   \
+        {};                                                                     \
+    }                                                                           \
+                                                                                \
+    template <typename Dummy>                                                   \
+    struct meta_grammar::case_<tag:: NAME, Dummy>                               \
+        : proto::when<rule:: NAME, proto::external_transform>                   \
+    {};                                                                         \
+    /**/
+
+#define PHOENIX_DEFINE_EXPRESSION_EXT(ACTOR, NAME, SEQ)                         \
+    namespace tag {                                                             \
+        struct NAME {};                                                         \
+    }                                                                           \
+                                                                                \
+    namespace expression                                                        \
+    {                                                                           \
+        template <BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(SEQ), typename A)>     \
+        struct NAME                                                             \
+            : expr_ext<                                                         \
+                ACTOR                                                           \
+              , tag:: NAME, BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(SEQ), A)>    \
+        {};                                                                     \
+    }                                                                           \
+                                                                                \
+    namespace rule {                                                            \
+        struct NAME                                                             \
+            : expression:: NAME <BOOST_PP_SEQ_ENUM(SEQ)>                        \
+        {};                                                                     \
+    }                                                                           \
+                                                                                \
+    template <typename Dummy>                                                   \
+    struct meta_grammar::case_<tag:: NAME, Dummy>                               \
+        : proto::when<rule:: NAME, proto::external_transform>                   \
+    {};                                                                         \
+    /**/
+
+#if 0
+//TODO: adapt
+#define PHOENIX_DEFINE_EXPRESSION_EXT_VARARG_R(_, N, NAME)                      \
+    template <PHOENIX_typename_A(N)>                                            \
+    struct BOOST_PP_TUPLE_ELEM(2, 1, NAME) <PHOENIX_A(N)>                       \
+        : expr_ext<                                                             \
+            BOOST_PP_TUPLE_ELEM(2, 0, NAME)                                     \
+          , tag:: BOOST_PP_TUPLE_ELEM(2, 1, NAME)                               \
+          , PHOENIX_A(N)>                                                       \
+    {};                                                                         \
+    /**/
+
+#define PHOENIX_DEFINE_EXPRESSION_EXT_VARARG(ACTOR, NAME, GRAMMAR, LIMIT)       \
+    namespace tag {                                                             \
+        struct NAME {};                                                         \
+    }                                                                           \
+                                                                                \
+    namespace expression                                                        \
+    {                                                                           \
+        template <PHOENIX_typename_A_void(LIMIT), typename Dummy = void>        \
+        struct NAME;                                                            \
+                                                                                \
+        BOOST_PP_REPEAT_FROM_TO(                                                \
+            1                                                                   \
+          , LIMIT                                                               \
+          , PHOENIX_DEFINE_EXPRESSION_VARARG_R, (ACTOR, NAME))                  \
+    }                                                                           \
+                                                                                \
+    namespace rule {                                                            \
+        struct NAME                                                             \
+            : expression:: NAME <proto::vararg<GRAMMAR> >                       \
+        {};                                                                     \
+    }                                                                           \
+                                                                                \
+    template <typename Dummy>                                                   \
+    struct meta_grammar::case_<tag:: NAME, Dummy>                               \
+        : proto::when<rule:: NAME, proto::external_transform>                   \
+    {};                                                                         \
+    /**/
+#endif
+
 #endif
 
 #else
@@ -47,12 +215,13 @@
         : proto::transform<expr_ext<Actor, Tag, PHOENIX_A>, int>
     {
         typedef typename proto::result_of::make_expr<Tag, default_domain_with_basic_expr, PHOENIX_A>::type base_type;
-        typedef Actor<base_type> type;
+        typedef Actor<base_type const> type;
         typedef typename proto::nary_expr<Tag, PHOENIX_A>::proto_grammar proto_grammar;
         
         static type const make(PHOENIX_A_a)
         {
-            type const e = {PHOENIX_a};
+            base_type const b = proto::make_expr<Tag, default_domain_with_basic_expr>(PHOENIX_a);
+            type const e = {b};
             return e;
         }
 
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/unpack.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/unpack.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/unpack.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -14,6 +14,7 @@
 #include <boost/fusion/include/size.hpp>
 #include <boost/fusion/container/vector.hpp>
 #include <boost/proto/proto.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
 
 #define M3(_, N, MAX)                                                       \
     BOOST_PP_COMMA_IF(BOOST_PP_SUB(MAX, N))                                 \
@@ -77,7 +78,69 @@
                 typename proto::detail::uncvref<typename proto::when<proto::_, Seq>::template impl<Expr, State, Data>::result_type>::type
             >::value>
         struct unpack_impl;
-
+        
+        template <typename Expr, typename State, typename Data, typename Seq, typename Fun, typename R>
+        struct unpack_impl<Expr, State, Data, Seq, Fun, R(), 0>
+            : proto::transform_impl<Expr, State, Data>
+        {
+            struct fun_type : proto::when<proto::_, Fun> {};
+            
+            typedef proto::call<R()> which;
+
+            typedef typename which::template impl<Expr, State, Data>::result_type result_type;
+
+            result_type
+            operator()(
+                typename unpack_impl::expr_param e
+              , typename unpack_impl::state_param s
+              , typename unpack_impl::data_param d
+            ) const
+            {
+                return typename which::template impl<Expr, State, Data>()(e, s, d);
+            }
+        };
+        
+        template <typename Expr, typename State, typename Data, typename Seq, typename Fun, typename R>
+        struct unpack_impl<Expr, State, Data, Seq, Fun, R(unpack), 0>
+            : proto::transform_impl<Expr, State, Data>
+        {
+            struct fun_type : proto::when<proto::_, Fun> {};
+            
+            typedef proto::call<R()> which;
+
+            typedef typename which::template impl<Expr, State, Data>::result_type result_type;
+
+            result_type
+            operator()(
+                typename unpack_impl::expr_param e
+              , typename unpack_impl::state_param s
+              , typename unpack_impl::data_param d
+            ) const
+            {
+                return typename which::template impl<Expr, State, Data>()(e, s, d);
+            }
+        };
+        
+        template <typename Expr, typename State, typename Data, typename Seq, typename Fun, typename R, typename A0>
+        struct unpack_impl<Expr, State, Data, Seq, Fun, R(A0, unpack), 0>
+            : proto::transform_impl<Expr, State, Data>
+        {
+            struct fun_type : proto::when<proto::_, Fun> {};
+            
+            typedef proto::call<R(A0)> which;
+
+            typedef typename which::template impl<Expr, State, Data>::result_type result_type;
+
+            result_type
+            operator()(
+                typename unpack_impl::expr_param e
+              , typename unpack_impl::state_param s
+              , typename unpack_impl::data_param d
+            ) const
+            {
+                return typename which::template impl<Expr, State, Data>()(e, s, d);
+            }
+        };
 
 #define M5(_, N, __) fun_type(fusion_at_c< N >(Seq))
         
@@ -88,12 +151,7 @@
         { \
             struct fun_type : proto::when<proto::_, Fun> {}; \
             \
-            typedef \
-                typename mpl::if_c< \
-                    proto::is_callable<R>::value \
-                  , proto::call<R(M2(BOOST_PP_ENUM(EXPR_N, M5, EXPR_N), N, ARITY))> \
-                  , proto::make<R(M2(BOOST_PP_ENUM(EXPR_N, M5, EXPR_N), N, ARITY))> \
-                >::type \
+            typedef proto::call<R(M2(BOOST_PP_ENUM(EXPR_N, M5, EXPR_N), N, ARITY))> \
                 which; \
             \
             typedef typename which::template impl<Expr, State, Data>::result_type result_type; \
@@ -111,14 +169,13 @@
         }; \
         /**/
         
-
-        
-#define PHOENIX_ITERATION_PARAMS                                                \
-        (3, (1, BOOST_PROTO_MAX_ARITY,                                            \
-        <boost/phoenix/core/unpack.hpp>))
+        #define PHOENIX_ITERATION_PARAMS                                        \
+            (3, (1, BOOST_PROTO_MAX_ARITY,                                      \
+            <boost/phoenix/core/unpack.hpp>))
 #include PHOENIX_ITERATE()
 
         #undef M1
+
         }
 }}
 
@@ -159,7 +216,7 @@
                 template <typename Expr, typename State, typename Data>                 \
                 struct impl                                                             \
                         : phoenix::detail::unpack_impl<                                     \
-                Expr, State, Data, Seq, proto::_, R()>                          \
+                Expr, State, Data, typename boost::remove_pointer<Seq>::type, proto::_, R(M2(phoenix::unpack, N, ARITY))>                          \
                 {                                                                       \
         };                                                                      \
         };                                                                          \
@@ -171,7 +228,7 @@
         {                                                                           \
                 template <typename Expr, typename State, typename Data>                 \
                 struct impl                                                             \
-			: phoenix::detail::unpack_impl<Expr, State, Data, Seq, Fun, R(M2(phoenix::unpack, N, ARITY))>    \
+			: phoenix::detail::unpack_impl<Expr, State, Data, typename boost::remove_pointer<Seq>::type, Fun, R(M2(phoenix::unpack, N, ARITY))>    \
                 {};                                                                     \
         };                                                                          \
     /**/
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -9,10 +9,10 @@
 #define PHOENIX_OBJECT_HPP
 
 #include <boost/phoenix/object/const_cast.hpp>
-//#include <boost/phoenix/object/construct.hpp>
+#include <boost/phoenix/object/construct.hpp>
 #include <boost/phoenix/object/delete.hpp>
 #include <boost/phoenix/object/dynamic_cast.hpp>
-//#include <boost/phoenix/object/new.hpp>
+#include <boost/phoenix/object/new.hpp>
 #include <boost/phoenix/object/reinterpret_cast.hpp>
 #include <boost/phoenix/object/static_cast.hpp>
 
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/const_cast.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/const_cast.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/const_cast.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -9,34 +9,16 @@
 #define PHOENIX_OBJECT_CONST_CAST_HPP
 
 #include <boost/phoenix/core/expression.hpp>
-#include <boost/phoenix/object/detail/cast_target.hpp>
+#include <boost/phoenix/object/detail/target.hpp>
 
 namespace boost { namespace phoenix
 {
-    namespace tag {
-        struct const_cast_ {};
-    }
+    PHOENIX_DEFINE_EXPRESSION(
+        const_cast_
+      , (proto::terminal<detail::target<proto::_> >)
+        (meta_grammar)
+    )
 
-    namespace expression
-    {
-        template <typename T, typename U>
-        struct const_cast_
-            : expr<tag::const_cast_, T, U>
-        {};
-    }
-
-	namespace rule
-	{
-		struct const_cast_
-            : expression::const_cast_<proto::terminal<detail::cast_target<proto::_> >, meta_grammar>
-		{};
-	}
-
-	template <typename Dummy>
-	struct meta_grammar::case_<tag::const_cast_, Dummy>
-		: proto::when<rule::const_cast_, proto::external_transform>
-	{};
-    
     template <typename T>
     struct const_cast_eval
         : proto::callable
@@ -57,17 +39,17 @@
     {};
 
     template <typename T, typename U>
-    typename expression::const_cast_<detail::cast_target<T>, U>::type const
+    typename expression::const_cast_<detail::target<T>, U>::type const
     const_cast_(U const& u)
     {
-        return expression::const_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::const_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
     
     template <typename T, typename U>
-    typename expression::const_cast_<detail::cast_target<T>, U>::type const
+    typename expression::const_cast_<detail::target<T>, U>::type const
     const_cast_(U & u)
     {
-        return expression::const_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::const_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
 
 }}
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/construct.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/construct.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/construct.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -8,51 +8,30 @@
 #ifndef PHOENIX_OBJECT_CONSTRUCT_HPP
 #define PHOENIX_OBJECT_CONSTRUCT_HPP
 
+#include <boost/phoenix/core/expression.hpp>
+#include <boost/phoenix/core/unpack.hpp>
 #include <boost/phoenix/support/iterate.hpp>
-#include <boost/phoenix/core/compose.hpp>
+#include <boost/proto/fusion.hpp>
 
 namespace boost { namespace phoenix
 {
-    namespace result_of
-    {
-        template <typename Env, typename T, PHOENIX_typename_A_void(PHOENIX_COMPOSITE_LIMIT)>
-        struct construct
-        {
-            typedef T type;
-        };
-    }
+    PHOENIX_DEFINE_EXPRESSION_VARARG(
+        construct
+      , (proto::terminal<detail::target<proto::_> >)
+        (meta_grammar)
+      , PHOENIX_COMPOSITE_LIMIT
+    )
 
     template <typename T>
     struct construct_eval
     {
-        typedef T result_type;
+        typedef typename T::type result_type;
 
         template <typename Env>
         result_type
         operator()(Env& env) const
         {
-            return T();
-        }
-
-        template <typename Env, typename A0>
-        result_type
-        operator()(Env& env, A0 const& a0) const
-        {
-            return T(eval(a0, env));
-        }
-
-        template <typename Env, typename A0, typename A1>
-        result_type
-        operator()(Env& env, A0 const& a0, A1 const& a1) const
-        {
-            return T(eval(a0, env), eval(a1, env));
-        }
-
-        template <typename Env, typename A0, typename A1, typename A2>
-        result_type
-        operator()(Env& env, A0 const& a0, A1 const& a1, A2 const& a2) const
-        {
-            return T(eval(a0, env), eval(a1, env), eval(a2, env));
+            return result_type();
         }
 
         // Bring in the rest
@@ -60,39 +39,18 @@
 
     };
 
-    template <typename T, PHOENIX_typename_A_void(PHOENIX_COMPOSITE_LIMIT)>
-    struct make_construct
-        : compose<construct_eval<T>, PHOENIX_A(PHOENIX_COMPOSITE_LIMIT)>
+    template <typename Dummy>
+    struct default_actions::when<rule::construct, Dummy>
+        : proto::lazy<construct_eval<proto::_value(proto::_child_c<0>)>(_env, unpack(proto::functional::pop_front(proto::_)))>
     {};
 
     template <typename T>
-    typename make_construct<T>::type const
+    typename expression::construct<detail::target<T> >::type const
     construct()
     {
-        make_construct<T>()();
-    }
-
-    template <typename T, typename A0>
-    typename make_construct<T, A0>::type const
-    construct(A0 const& a0)
-    {
-        return make_construct<T, A0>()(a0);
+        return expression::construct<detail::target<T> >::make(detail::target<T>());
     }
 
-    template <typename T, typename A0, typename A1>
-    typename make_construct<T, A0, A1>::type const
-    construct(A0 const& a0, A1 const& a1)
-    {
-        return make_construct<T, A0, A1>()(a0, a1);
-    }
-
-    template <typename T, typename A0, typename A1, typename A2>
-    typename make_construct<T, A0, A1, A2>::type const
-    construct(A0 const& a0, A1 const& a1, A2 const& a2)
-    {
-        return make_construct<T, A0, A1, A2>()(a0, a1, a2);
-    }
-        
     // Bring in the rest
     #include <boost/phoenix/object/detail/construct.hpp>
 
Deleted: sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/cast_target.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/cast_target.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
+++ (empty file)
@@ -1,23 +0,0 @@
-/*==============================================================================
-    Copyright (c) 2001-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_OBJECT_DETAIL_CAST_TARGET_HPP
-#define PHOENIX_OBJECT_DETAIL_CAST_TARGET_HPP
-
-namespace boost { namespace phoenix
-{
-    namespace detail
-    {
-        template <typename T>
-        struct cast_target
-        {
-            typedef T type;
-        };
-    }
-}}
-
-#endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -12,7 +12,7 @@
 #define PHOENIX_OBJECT_DETAIL_CONSTRUCT_HPP
 
 #define PHOENIX_ITERATION_PARAMS                                                \
-        (3, (4, PHOENIX_COMPOSITE_LIMIT,                                        \
+        (3, (1, PHOENIX_COMPOSITE_LIMIT,                                        \
         <boost/phoenix/object/detail/construct.hpp>))
 #include PHOENIX_ITERATE()
 
@@ -21,10 +21,10 @@
 #else
 
     template <typename T, PHOENIX_typename_A>
-    typename make_construct<T, PHOENIX_A>::type const
+    typename expression::construct<detail::target<T>, PHOENIX_A>::type const
     construct(PHOENIX_A_const_ref_a)
     {
-        return make_construct<T, PHOENIX_A>()(PHOENIX_a);
+        return expression::construct<detail::target<T>, PHOENIX_A>::make(detail::target<T>(), PHOENIX_a);
     }
 
 #endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct_eval.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct_eval.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/construct_eval.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -12,7 +12,7 @@
 #define PHOENIX_OBJECT_DETAIL_CONSTRUCT_EVAL_HPP
 
 #define PHOENIX_ITERATION_PARAMS                                                \
-        (3, (4, PHOENIX_COMPOSITE_LIMIT,                                        \
+        (3, (1, PHOENIX_COMPOSITE_LIMIT,                                        \
         <boost/phoenix/object/detail/construct_eval.hpp>))
 #include PHOENIX_ITERATE()
 
@@ -27,7 +27,7 @@
 #define EVAL_a(_,n,__) \
             BOOST_PP_COMMA_IF(n) eval(a ## n, env)
 
-            return T(BOOST_PP_REPEAT(PHOENIX_ITERATION, EVAL_a, _));
+            return result_type(BOOST_PP_REPEAT(PHOENIX_ITERATION, EVAL_a, _));
 #undef EVAL_a
         }
 
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -12,8 +12,8 @@
 #define PHOENIX_OBJECT_DETAIL_NEW_HPP
 
 #define PHOENIX_ITERATION_PARAMS                                                \
-    (3, (4, PHOENIX_COMPOSITE_LIMIT,                                            \
-    <boost/phoenix/object/new.hpp>))
+    (3, (1, PHOENIX_COMPOSITE_LIMIT,                                            \
+    <boost/phoenix/object/detail/new.hpp>))
 #include PHOENIX_ITERATE()
 
 #endif
@@ -21,10 +21,10 @@
 #else
 
     template <typename T, PHOENIX_typename_A>
-    typename make_new<T, PHOENIX_A>::type const
+    typename expression::new_<detail::target<T>, PHOENIX_A>::type const
     new_(PHOENIX_A_const_ref_a)
     {
-        return make_new<T, PHOENIX_A>()(PHOENIX_a);
+        return expression::new_<detail::target<T>, PHOENIX_A>::make(detail::target<T>(), PHOENIX_a);
     }
 
 #endif
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new_eval.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new_eval.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/new_eval.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -12,7 +12,7 @@
 #define PHOENIX_OBJECT_DETAIL_NEW_EVAL_HPP
 
 #define PHOENIX_ITERATION_PARAMS                                                \
-        (3, (4, PHOENIX_COMPOSITE_LIMIT,                                        \
+        (3, (1, PHOENIX_COMPOSITE_LIMIT,                                        \
         <boost/phoenix/object/detail/new_eval.hpp>))
 #include PHOENIX_ITERATE()
 
@@ -27,7 +27,7 @@
 #define EVAL_a(_,n,__) \
             BOOST_PP_COMMA_IF(n) eval(a ## n, env)
 
-            return new T(BOOST_PP_REPEAT(PHOENIX_ITERATION, EVAL_a, _));
+            return new construct_type(BOOST_PP_REPEAT(PHOENIX_ITERATION, EVAL_a, _));
 #undef EVAL_a
         }
 
Copied: sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/target.hpp (from r66641, /sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/cast_target.hpp)
==============================================================================
--- /sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/cast_target.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/detail/target.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -13,7 +13,7 @@
     namespace detail
     {
         template <typename T>
-        struct cast_target
+        struct target
         {
             typedef T type;
         };
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/dynamic_cast.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/dynamic_cast.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/dynamic_cast.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -9,33 +9,15 @@
 #define PHOENIX_OBJECT_DYNAMIC_CAST_HPP
 
 #include <boost/phoenix/core/expression.hpp>
-#include <boost/phoenix/object/detail/cast_target.hpp>
+#include <boost/phoenix/object/detail/target.hpp>
 
 namespace boost { namespace phoenix
 {
-    namespace tag {
-        struct dynamic_cast_ {};
-    }
-
-    namespace expression
-    {
-        template <typename T, typename U>
-        struct dynamic_cast_
-            : expr<tag::dynamic_cast_, T, U>
-        {};
-    }
-
-	namespace rule
-	{
-		struct dynamic_cast_
-            : expression::dynamic_cast_<proto::terminal<detail::cast_target<proto::_> >, meta_grammar>
-		{};
-	}
-
-	template <typename Dummy>
-	struct meta_grammar::case_<tag::dynamic_cast_, Dummy>
-		: proto::when<rule::dynamic_cast_, proto::external_transform>
-	{};
+    PHOENIX_DEFINE_EXPRESSION(
+        dynamic_cast_
+      , (proto::terminal<detail::target<proto::_> >)
+        (meta_grammar)
+    )
     
     template <typename T>
     struct dynamic_cast_eval
@@ -57,17 +39,17 @@
     {};
 
     template <typename T, typename U>
-    typename expression::dynamic_cast_<detail::cast_target<T>, U>::type const
+    typename expression::dynamic_cast_<detail::target<T>, U>::type const
     dynamic_cast_(U const& u)
     {
-        return expression::dynamic_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::dynamic_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
     
     template <typename T, typename U>
-    typename expression::dynamic_cast_<detail::cast_target<T>, U>::type const
+    typename expression::dynamic_cast_<detail::target<T>, U>::type const
     dynamic_cast_(U & u)
     {
-        return expression::dynamic_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::dynamic_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
 }}
 
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/new.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/new.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/new.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -8,87 +8,48 @@
 #ifndef PHOENIX_OBJECT_NEW_HPP
 #define PHOENIX_OBJECT_NEW_HPP
 
-#include <boost/phoenix/core/compose.hpp>
+#include <boost/phoenix/core/expression.hpp>
+#include <boost/phoenix/core/unpack.hpp>
 #include <boost/phoenix/support/iterate.hpp>
+#include <boost/proto/fusion.hpp>
 
 namespace boost { namespace phoenix
 {
-    namespace result_of
-    {
-        template <typename Env, typename T, PHOENIX_typename_A_void(PHOENIX_COMPOSITE_LIMIT)>
-        struct new_
-        {
-            typedef T* type;
-        };
-    }
+    PHOENIX_DEFINE_EXPRESSION_VARARG(
+        new_
+      , (proto::terminal<detail::target<proto::_> >)
+        (meta_grammar)
+      , PHOENIX_COMPOSITE_LIMIT
+    )
 
     template <typename T>
     struct new_eval
+        : proto::callable
     {
-        typedef T* result_type;
+        typedef typename T::type construct_type;
+        typedef typename T::type* result_type;
 
         template <typename Env>
         result_type
         operator()(Env& env) const
         {
-            return new T;
-        }
-
-        template <typename Env, typename A0>
-        result_type
-        operator()(Env& env, A0 const& a0) const
-        {
-            return new T(eval(a0, env));
-        }
-
-        template <typename Env, typename A0, typename A1>
-        result_type
-        operator()(Env& env, A0 const& a0, A1 const& a1) const
-        {
-            return new T(eval(a0, env), eval(a1, env));
-        }
-
-        template <typename Env, typename A0, typename A1, typename A2>
-        result_type
-        operator()(Env& env, A0 const& a0, A1 const& a1, A2 const& a2) const
-        {
-            return new T(eval(a0, env), eval(a1, env), eval(a2, env));
+            return new construct_type;
         }
 
         // Bring in the rest
         #include <boost/phoenix/object/detail/new_eval.hpp>
     };
 
-    template <typename T, PHOENIX_typename_A_void(PHOENIX_COMPOSITE_LIMIT)>
-    struct make_new : compose<new_eval<T>, PHOENIX_A(PHOENIX_COMPOSITE_LIMIT)>
+    template <typename Dummy>
+    struct default_actions::when<rule::new_, Dummy>
+        : proto::lazy<new_eval<proto::_value(proto::_child_c<0>)>(_env, unpack(proto::functional::pop_front(proto::_)))>
     {};
 
     template <typename T>
-    typename make_new<T>::type const
+    typename expression::new_<detail::target<T> >::type const
     new_()
     {
-        return make_new<T>()();
-    }
-
-    template <typename T, typename A0>
-    typename make_new<T, A0>::type const
-    new_(A0 const& a0)
-    {
-        return make_new<T, A0>()(a0);
-    }
-
-    template <typename T, typename A0, typename A1>
-    typename make_new<T, A0, A1>::type const
-    new_(A0 const& a0, A1 const& a1)
-    {
-        return make_new<T, A0, A1>()(a0, a1);
-    }
-
-    template <typename T, typename A0, typename A1, typename A2>
-    typename make_new<T, A0, A1, A2>::type const
-    new_(A0 const& a0, A1 const& a1, A2 const& a2)
-    {
-        return make_new<T, A0, A1, A2>()(a0, a1, a2);
+        return expression::new_<detail::target<T> >::make(detail::target<T>());
     }
 
     // Bring in the rest
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/reinterpret_cast.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/reinterpret_cast.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/reinterpret_cast.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -9,33 +9,15 @@
 #define PHOENIX_OBJECT_REINTERPRET_CAST_HPP
 
 #include <boost/phoenix/core/expression.hpp>
-#include <boost/phoenix/object/detail/cast_target.hpp>
+#include <boost/phoenix/object/detail/target.hpp>
 
 namespace boost { namespace phoenix
 {
-    namespace tag {
-        struct reinterpret_cast_ {};
-    }
-
-    namespace expression
-    {
-        template <typename T, typename U>
-        struct reinterpret_cast_
-            : expr<tag::reinterpret_cast_, T, U>
-        {};
-    }
-
-	namespace rule
-	{
-		struct reinterpret_cast_
-            : expression::reinterpret_cast_<proto::terminal<detail::cast_target<proto::_> >, meta_grammar>
-		{};
-	}
-
-	template <typename Dummy>
-	struct meta_grammar::case_<tag::reinterpret_cast_, Dummy>
-		: proto::when<rule::reinterpret_cast_, proto::external_transform>
-	{};
+    PHOENIX_DEFINE_EXPRESSION(
+        reinterpret_cast_
+      , (proto::terminal<detail::target<proto::_> >)
+        (meta_grammar)
+    )
     
     template <typename T>
     struct reinterpret_cast_eval
@@ -57,17 +39,17 @@
     {};
 
     template <typename T, typename U>
-    typename expression::reinterpret_cast_<detail::cast_target<T>, U>::type const
+    typename expression::reinterpret_cast_<detail::target<T>, U>::type const
     reinterpret_cast_(U const& u)
     {
-        return expression::reinterpret_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::reinterpret_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
     
     template <typename T, typename U>
-    typename expression::reinterpret_cast_<detail::cast_target<T>, U>::type const
+    typename expression::reinterpret_cast_<detail::target<T>, U>::type const
     reinterpret_cast_(U & u)
     {
-        return expression::reinterpret_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::reinterpret_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
 
 }}
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/object/static_cast.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/object/static_cast.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/object/static_cast.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -9,33 +9,15 @@
 #define PHOENIX_OBJECT_STATIC_CAST_HPP
 
 #include <boost/phoenix/core/expression.hpp>
-#include <boost/phoenix/object/detail/cast_target.hpp>
+#include <boost/phoenix/object/detail/target.hpp>
 
 namespace boost { namespace phoenix
 {
-    namespace tag {
-        struct static_cast_ {};
-    }
-
-    namespace expression
-    {
-        template <typename T, typename U>
-        struct static_cast_
-            : expr<tag::static_cast_, T, U>
-        {};
-    }
-
-	namespace rule
-	{
-		struct static_cast_
-            : expression::static_cast_<proto::terminal<detail::cast_target<proto::_> >, meta_grammar>
-		{};
-	}
-
-	template <typename Dummy>
-	struct meta_grammar::case_<tag::static_cast_, Dummy>
-		: proto::when<rule::static_cast_, proto::external_transform>
-	{};
+    PHOENIX_DEFINE_EXPRESSION(
+        static_cast_
+      , (proto::terminal<detail::target<proto::_> >)
+        (meta_grammar)
+    )
     
     template <typename T>
     struct static_cast_eval
@@ -57,17 +39,17 @@
     {};
 
     template <typename T, typename U>
-    typename expression::static_cast_<detail::cast_target<T>, U>::type const
+    typename expression::static_cast_<detail::target<T>, U>::type const
     static_cast_(U const& u)
     {
-        return expression::static_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::static_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
     
     template <typename T, typename U>
-    typename expression::static_cast_<detail::cast_target<T>, U>::type const
+    typename expression::static_cast_<detail::target<T>, U>::type const
     static_cast_(U & u)
     {
-        return expression::static_cast_<detail::cast_target<T>, U>::make(detail::cast_target<T>(), u);
+        return expression::static_cast_<detail::target<T>, U>::make(detail::target<T>(), u);
     }
 
 }}
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -15,7 +15,7 @@
 {
         namespace tag
         {
-		struct mem_fun_ptr {};
+		struct mem_fun_ptr;
         }
 
         namespace detail {
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-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -11,6 +11,7 @@
 #include <boost/proto/make_expr.hpp>
 #include <boost/proto/tags.hpp>
 #include <boost/type_traits/is_member_object_pointer.hpp>*/
+#include <boost/phoenix/core/expression.hpp>
 #include <boost/phoenix/core/unpack.hpp>
 #include <boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp>
 #include <boost/phoenix/support/iterate.hpp>
@@ -23,6 +24,9 @@
                 (mem_ptr)
         )
 
+    PHOENIX_DEFINE_EXPRESSION_VARARG(mem_fun_ptr, (meta_grammar), PHOENIX_LIMIT)
+
+    /*
         namespace rule
         {
                 struct mem_fun_ptr
@@ -34,6 +38,7 @@
         struct meta_grammar::case_<tag::mem_fun_ptr, Dummy>
                 : proto::when<rule::mem_fun_ptr, proto::external_transform>
         {};
+    */
 
         template <typename Object, typename MemPtr>
     typename enable_if<
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-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -35,8 +35,8 @@
     ;
 
 test-suite phoenix_object :
-#    [ run object/cast_tests.cpp ] 
-#    [ run object/new_delete_tests.cpp ] 
+    [ run object/cast_tests.cpp ] 
+    [ run object/new_delete_tests.cpp ] 
     ;
 
 test-suite phoenix_function :
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/object/new_delete_tests.cpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/object/new_delete_tests.cpp	(original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/object/new_delete_tests.cpp	2010-11-19 06:23:38 EST (Fri, 19 Nov 2010)
@@ -29,9 +29,9 @@
 main()
 {
     using boost::phoenix::arg_names::arg1;
-    //using boost::phoenix::construct;
+    using boost::phoenix::construct;
     using boost::phoenix::delete_;
-    //using boost::phoenix::new_;
+    using boost::phoenix::new_;
 
     using std::for_each;
     using std::vector;
@@ -39,21 +39,33 @@
     {
         vector<X*> v(10);
 
-        //for_each(v.begin(), v.end(), arg1 = new_<X>());
+        for_each(v.begin(), v.end(), arg1 = new_<X>());
         for_each(v.begin(), v.end(), delete_(arg1));
 
-        //for_each(v.begin(), v.end(), arg1 = new_<X>(1, 2, 3));
+        for_each(v.begin(), v.end(), arg1 = new_<X>(1, 2, 3));
         for_each(v.begin(), v.end(), delete_(arg1));
     }
 
     {
         using boost::shared_ptr;
         vector<shared_ptr<X> > v(10);
-        //for_each(v.begin(), v.end(),
-        //    arg1 = construct<shared_ptr<X> >(new_<X>())
-        //);
+        for_each(v.begin(), v.end(),
+            arg1 = construct<shared_ptr<X> >(new_<X>())
+        );
     }
 
     BOOST_TEST(n == 0);
     return boost::report_errors();
 }
+//PHOENIX_DEFINE_EXPRESSION_VARARG(new_, (proto::terminal<detail::target<proto::_> >)(meta_grammar), PHOENIX_LIMIT)
+
+/*
+#include <boost/preprocessor/comparison/equal.hpp>
+
+
+#define SEQ (h)
+
+BOOST_PP_SEQ_ELEM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(SEQ)), SEQ)
+
+BOOST_PP_IF(BOOST_PP_EQUAL(1, BOOST_PP_SEQ_SIZE(SEQ)), BOOST_PP_EMPTY(), BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_POP_BACK(SEQ)))
+*/