$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r66622 - sandbox/SOC/2010/phoenix3/boost/phoenix/core
From: thom.heller_at_[hidden]
Date: 2010-11-17 09:13:05
Author: theller
Date: 2010-11-17 09:12:59 EST (Wed, 17 Nov 2010)
New Revision: 66622
URL: http://svn.boost.org/trac/boost/changeset/66622
Log:
unpack almost working
Text files modified: 
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/unpack.hpp |   152 +++++++++++++++++++++++++++++++-------- 
   1 files changed, 119 insertions(+), 33 deletions(-)
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-17 09:12:59 EST (Wed, 17 Nov 2010)
@@ -1,3 +1,5 @@
+#if !PHOENIX_IS_ITERATING
+
 /*=============================================================================
     Copyright (c) 2005-2010 Joel de Guzman
     Copyright (c) 2010 Eric Niebler
@@ -10,14 +12,60 @@
 #define PHOENIX_CORE_UNPACK_HPP
 
 #include <boost/fusion/include/size.hpp>
+#include <boost/fusion/container/vector.hpp>
 #include <boost/proto/proto.hpp>
 
+#define M3(_, N, MAX)                                                       \
+    BOOST_PP_COMMA_IF(BOOST_PP_SUB(MAX, N))                                 \
+    BOOST_PP_CAT(A, N)                                                      \
+/**/
+
+#define M2(UNPACK, N, ARITY)                                                \
+    BOOST_PP_ENUM_PARAMS(N, A)                                              \
+    BOOST_PP_COMMA_IF(N)                                                    \
+    UNPACK BOOST_PP_REPEAT_FROM_TO(N, ARITY, M3, ARITY)                     \
+/**/
+
+#define M0(_, N, __) BOOST_PP_REPEAT(BOOST_PP_INC(N), M1, N)
+
 namespace boost { namespace phoenix
 {
     struct unpack {};
     
     namespace detail
     {
+        template <unsigned N>
+        struct fusion_at_c
+            : proto::callable
+        {
+            template <typename Sig>
+            struct result;
+
+            template <typename This, typename Seq>
+            struct result<This(Seq)>
+                : result<This(Seq const &)>
+            {};
+
+            template <typename This, typename Seq>
+            struct result<This(Seq &)>
+                : fusion::result_of::at_c<Seq, N>
+            {};
+
+            template <typename Seq>
+            typename fusion::result_of::at_c<Seq, N>::type
+            operator()(Seq & seq) const
+            {
+                return fusion::at_c<N>(seq);
+            }
+
+            template <typename Seq>
+            typename fusion::result_of::at_c<Seq const, N>::type
+            operator()(Seq const & seq) const
+            {
+                return fusion::at_c<N>(seq);
+            }
+        };
+
         template <
             typename Expr
           , typename State
@@ -77,8 +125,8 @@
             typedef
                 typename mpl::if_c<
                     proto::is_callable<R>::value
-                  , proto::call<R(fun_type(proto::_child_c<0>(Seq)), fun_type(proto::_child_c<1>(Seq)), fun_type(proto::_child_c<2>(Seq)))> // "R" is a function to call
-                  , proto::make<R(fun_type(proto::_child_c<0>(Seq)), fun_type(proto::_child_c<1>(Seq)), fun_type(proto::_child_c<2>(Seq)))> // "R" is an object to constructa
+                  , proto::call<R(fun_type(fusion_at_c<0>(Seq)), fun_type(fusion_at_c<1>(Seq)), fun_type(fusion_at_c<2>(Seq)))> // "R" is a function to call
+                  , proto::make<R(fun_type(fusion_at_c<0>(Seq)), fun_type(fusion_at_c<1>(Seq)), fun_type(fusion_at_c<2>(Seq)))> // "R" is an object to constructa
                 >::type
                 which;
             
@@ -94,43 +142,81 @@
                 return typename which::template impl<Expr, State, Data>()(e, s, d);
             }
                 };
+
+        #define M1(Z, N, ARITY)
+
+        BOOST_PP_REPEAT(BOOST_PROTO_MAX_ARITY, M0, _)
+
+        #undef M1
         }
 }}
 
+
 namespace boost { namespace proto
 {
-	template <typename R>
-	struct call<R(phoenix::unpack)>
-		: proto::transform<call<R(phoenix::unpack)> >
-	{
-		template <typename Expr, typename State, typename Data>
-		struct impl
-			: phoenix::detail::unpack_impl<Expr, State, Data, Expr, proto::_, R()>//R(phoenix::unpack(Expr, proto::_))>
-		{};
-	};
-	
-	template <typename R, typename Seq>
-	struct call<R(phoenix::unpack(Seq))>
-		: proto::transform<call<R(phoenix::unpack(Seq))> >
-	{
-
-		template <typename Expr, typename State, typename Data>
-		struct impl
-			: phoenix::detail::unpack_impl<Expr, State, Data, Seq, proto::_, R()>//R(phoenix::unpack(Expr, proto::_))>
-		{
-        };
-	};
-	
-	template <typename R, typename Seq, typename Fun>
-	struct call<R(phoenix::unpack(Seq, Fun))>
-		: proto::transform<call<R(phoenix::unpack(Seq, Fun))> >
-	{
-		template <typename Expr, typename State, typename Data>
-		struct impl
-			: phoenix::detail::unpack_impl<Expr, State, Data, Seq, Fun, R()>//R(phoenix::unpack(Expr, proto::_))>
-		{};
-	};
+    template <unsigned N>
+    struct is_callable<phoenix::detail::fusion_at_c<N> > : mpl::true_ {};
+
+    #define M1(Z, N, ARITY)                                                     \
+    template <typename R BOOST_PP_ENUM_TRAILING_PARAMS(ARITY, typename A)>      \
+    struct call<R(M2(phoenix::unpack(), N, ARITY))>                             \
+		: proto::transform<call<R(M2(phoenix::unpack(), N, ARITY))> >           \
+	{                                                                           \
+		template <typename Expr, typename State, typename Data>                 \
+		struct impl                                                             \
+			: phoenix::detail::unpack_impl<                                     \
+                Expr, State, Data, proto::_, proto::_, R()>                     \
+		{};                                                                     \
+	};                                                                          \
+	                                                                            \
+    template <typename R BOOST_PP_ENUM_TRAILING_PARAMS(ARITY, typename A)>      \
+    struct call<R(M2(phoenix::unpack, N, ARITY))>                               \
+		: proto::transform<call<R(M2(phoenix::unpack, N, ARITY))> >             \
+	{                                                                           \
+		template <typename Expr, typename State, typename Data>                 \
+		struct impl                                                             \
+			: phoenix::detail::unpack_impl<                                     \
+                Expr, State, Data, proto::_, proto::_, R()>                     \
+		{};                                                                     \
+	};                                                                          \
+	                                                                            \
+	template <typename R, typename Seq                                          \
+        BOOST_PP_ENUM_TRAILING_PARAMS(ARITY, typename A)>                       \
+	struct call<R(M2(phoenix::unpack(Seq), N, ARITY))>                          \
+		: proto::transform<call<R(M2(phoenix::unpack(Seq), N, ARITY))> >        \
+	{                                                                           \
+		template <typename Expr, typename State, typename Data>                 \
+		struct impl                                                             \
+			: phoenix::detail::unpack_impl<                                     \
+                Expr, State, Data, Seq, proto::_, R()>                          \
+		{                                                                       \
+        };                                                                      \
+	};                                                                          \
+                                                                                \
+	template <typename R, typename Seq, typename Fun                            \
+        BOOST_PP_ENUM_TRAILING_PARAMS(ARITY, typename A)>                       \
+	struct call<R(M2(phoenix::unpack(Seq, Fun), N, ARITY))>                     \
+		: proto::transform<call<R(M2(phoenix::unpack(Seq, Fun), N, ARITY))> >   \
+	{                                                                           \
+		template <typename Expr, typename State, typename Data>                 \
+		struct impl                                                             \
+			: phoenix::detail::unpack_impl<Expr, State, Data, Seq, Fun, R()>    \
+		{};                                                                     \
+	};                                                                          \
+    /**/
+    
+    BOOST_PP_REPEAT(BOOST_PROTO_MAX_ARITY, M0, _)
+
+    #undef M1
 
 }}
+    
+#undef M3
+#undef M2
+#undef M0
+
+#endif
+
+#else // BOOST_PP_IS_ITERATING
 
 #endif