Update of /cvsroot/boost/boost/boost/xpressive/proto
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv8966/proto

Modified Files:
        make_expr.hpp proto_fwd.hpp traits.hpp 
Log Message:
as_expr and as_arg take optional Domain template parameter

Index: make_expr.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/make_expr.hpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- make_expr.hpp       25 May 2007 00:53:40 -0000      1.14
+++ make_expr.hpp       25 May 2007 22:23:54 -0000      1.15
@@ -15,6 +15,7 @@
     #include <boost/preprocessor/cat.hpp>
     #include <boost/preprocessor/iterate.hpp>
     #include <boost/preprocessor/facilities/intercept.hpp>
+    #include <boost/preprocessor/tuple/elem.hpp>
     #include <boost/preprocessor/repetition/enum.hpp>
     #include <boost/preprocessor/repetition/enum_params.hpp>
     #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
@@ -35,23 +36,31 @@
     #include <boost/xpressive/proto/detail/suffix.hpp>
 
     #define BOOST_PROTO_AS_ARG_TYPE(Z, N, DATA)                                
                     \
-        typename proto::result_of::as_arg<BOOST_PP_CAT(DATA, N)>::type         
                     \
+        typename proto::result_of::as_arg<                                     
                     \
+            BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, DATA), N)                   
                     \
+          , BOOST_PP_TUPLE_ELEM(2, 1, DATA)                                    
                     \
+        >::type                                                                
                     \
         /**/
 
     #define BOOST_PROTO_AS_ARG(Z, N, DATA)                                     
                     \
-        proto::as_arg(BOOST_PP_CAT(DATA, N))                                   
                     \
+        proto::as_arg<BOOST_PP_TUPLE_ELEM(2, 1, DATA) >(                       
                     \
+            BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, DATA), N)                   
                     \
+        )                                                                      
                     \
         /**/
 
     #define BOOST_PROTO_AT_TYPE(Z, N, DATA)                                    
                     \
         typename result_of::as_arg<                                            
                     \
             typename remove_reference<                                         
                     \
-                typename fusion::result_of::value_at_c<DATA, N >::type         
                     \
+                typename fusion::result_of::value_at_c<BOOST_PP_TUPLE_ELEM(2, 
0, DATA), N >::type   \
             >::type                                                            
                     \
+          , BOOST_PP_TUPLE_ELEM(2, 1, DATA)                                    
                     \
         >::type                                                                
                     \
         /**/
 
     #define BOOST_PROTO_AT(Z, N, DATA)                                         
                     \
-        proto::as_arg(fusion::at_c<N >(DATA))                                  
                     \
+        proto::as_arg<BOOST_PP_TUPLE_ELEM(2, 1, DATA) >(                       
                     \
+            fusion::at_c<N >(BOOST_PP_TUPLE_ELEM(2, 0, DATA))                  
                     \
+        )                                                                      
                     \
         /**/
 
     namespace boost { namespace fusion
@@ -62,14 +71,14 @@
 
     namespace boost { namespace proto
     {
-        namespace result_of
+        namespace detail
         {
             template<typename Tag, typename Domain, typename Sequence, 
std::size_t Size>
-            struct unpack_expr_detail
+            struct unpack_expr_
             {};
 
             template<typename Domain, typename Sequence>
-            struct unpack_expr_detail<tag::terminal, Domain, Sequence, 1u>
+            struct unpack_expr_<tag::terminal, Domain, Sequence, 1u>
             {
                 typedef expr<
                     tag::terminal
@@ -91,11 +100,11 @@
                 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PROTO_MAX_ARITY, 
typename A, = void BOOST_PP_INTERCEPT)
               , typename _ = void
             >
-            struct make_expr_detail
+            struct make_expr_
             {};
 
             template<typename Domain, typename A>
-            struct make_expr_detail<tag::terminal, Domain, A>
+            struct make_expr_<tag::terminal, Domain, A>
             {
                 typedef typename add_reference<A>::type reference;
                 typedef expr<tag::terminal, args1<reference> > expr_type;
@@ -113,27 +122,29 @@
             /**/
 
         #include BOOST_PP_ITERATE()
+        }
 
+        namespace result_of
+        {
             template<typename Tag, typename Sequence, typename, typename>
             struct unpack_expr
-              : unpack_expr_detail<Tag, default_domain, Sequence, 
fusion::result_of::size<Sequence>::type::value>
+              : detail::unpack_expr_<Tag, default_domain, Sequence, 
fusion::result_of::size<Sequence>::type::value>
             {};
 
             template<typename Tag, typename Domain, typename Sequence>
             struct unpack_expr<Tag, Domain, Sequence, typename 
Domain::boost_proto_is_domain_>
-              : unpack_expr_detail<Tag, Domain, Sequence, 
fusion::result_of::size<Sequence>::type::value>
+              : detail::unpack_expr_<Tag, Domain, Sequence, 
fusion::result_of::size<Sequence>::type::value>
             {};
 
             template<typename Tag 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, typename A), typename, 
typename>
             struct make_expr
-              : make_expr_detail<Tag, default_domain 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
+              : detail::make_expr_<Tag, default_domain 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
             {};
 
             template<typename Tag, typename Domain 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, typename A) >
             struct make_expr<Tag, Domain 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A), typename 
Domain::boost_proto_is_domain_>
-              : make_expr_detail<Tag, Domain 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
+              : detail::make_expr_<Tag, Domain 
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
             {};
-
         }
 
         namespace functional
@@ -272,11 +283,11 @@
     #define N BOOST_PP_ITERATION()
 
         template<typename Tag, typename Domain 
BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A)>
-        struct make_expr_detail<Tag, Domain BOOST_PP_ENUM_TRAILING_PARAMS(N, 
A) >
+        struct make_expr_<Tag, Domain BOOST_PP_ENUM_TRAILING_PARAMS(N, A) >
         {
             typedef expr<
                 Tag
-              , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N, 
BOOST_PROTO_AS_ARG_TYPE, A) >
+              , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N, 
BOOST_PROTO_AS_ARG_TYPE, (A, Domain)) >
             > expr_type;
 
             typedef typename generate<Domain, expr_type>::type type;
@@ -284,18 +295,18 @@
             static type const call(BOOST_PP_ENUM_BINARY_PARAMS(N, A, &a))
             {
                 expr_type that = {
-                    BOOST_PP_ENUM(N, BOOST_PROTO_AS_ARG, a)
+                    BOOST_PP_ENUM(N, BOOST_PROTO_AS_ARG, (a, Domain))
                 };
                 return generate<Domain, expr_type>::make(that);
             }
         };
 
         template<typename Tag, typename Domain, typename Sequence>
-        struct unpack_expr_detail<Tag, Domain, Sequence, N>
+        struct unpack_expr_<Tag, Domain, Sequence, N>
         {
             typedef expr<
                 Tag
-              , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N, BOOST_PROTO_AT_TYPE, 
Sequence const) >
+              , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N, BOOST_PROTO_AT_TYPE, 
(Sequence const, Domain)) >
             > expr_type;
 
             typedef typename generate<Domain, expr_type>::type type;
@@ -303,7 +314,7 @@
             static type const call(Sequence const &sequence)
             {
                 expr_type that = {
-                    BOOST_PP_ENUM(N, BOOST_PROTO_AT, sequence)
+                    BOOST_PP_ENUM(N, BOOST_PROTO_AT, (sequence, Domain))
                 };
                 return generate<Domain, expr_type>::make(that);
             }

Index: proto_fwd.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/proto_fwd.hpp,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -d -r1.65 -r1.66
--- proto_fwd.hpp       25 May 2007 00:53:40 -0000      1.65
+++ proto_fwd.hpp       25 May 2007 22:23:54 -0000      1.66
@@ -220,15 +220,12 @@
 
     namespace result_of
     {
-        template<typename T, typename EnableIf = void>
+        template<typename T, typename Domain = default_domain, typename 
EnableIf = void>
         struct as_expr;
 
-        template<typename T, typename EnableIf = void>
+        template<typename T, typename Domain = default_domain, typename 
EnableIf = void>
         struct as_arg;
 
-        template<typename Expr, typename State, typename Visitor, typename 
DomainTag>
-        struct compile;
-
         template<typename Expr, typename N = mpl::long_<0> >
         struct arg;
 
@@ -351,11 +348,15 @@
         struct compile;
         struct left;
         struct right;
-        struct as_expr;
-        struct as_arg;
         struct unref;
         struct deep_copy;
 
+        template<typename Domain = default_domain>
+        struct as_expr;
+
+        template<typename Domain = default_domain>
+        struct as_arg;
+
         template<typename N = mpl::long_<0> >
         struct arg;
 

Index: traits.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/traits.hpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- traits.hpp  24 May 2007 23:25:40 -0000      1.52
+++ traits.hpp  25 May 2007 22:23:54 -0000      1.53
@@ -42,8 +42,10 @@
 
     #if BOOST_WORKAROUND( BOOST_MSVC, == 1310 )
         #define BOOST_PROTO_IS_ARRAY_(T) boost::is_array<typename 
boost::remove_const<T>::type>
+        #define BOOST_PROTO_WITH_ALIAS_(X,Y) template<typename Y>
     #else
         #define BOOST_PROTO_IS_ARRAY_(T) boost::is_array<T>
+        #define BOOST_PROTO_WITH_ALIAS_(X,Y) typedef X Y;
     #endif
 
     #if BOOST_WORKAROUND( BOOST_MSVC, == 1400 )
@@ -79,7 +81,7 @@
         namespace result_of
         {
             // as_expr
-            template<typename T, typename EnableIf>
+            template<typename T, typename Domain, typename EnableIf>
             struct as_expr
             {
                 typedef typename mpl::if_<
@@ -88,54 +90,54 @@
                   , typename remove_cv<T>::type
                 >::type arg0_type;
 
-                typedef expr<proto::tag::terminal, args1<arg0_type> > type;
+                typedef expr<proto::tag::terminal, args1<arg0_type> > 
expr_type;
+                typedef typename generate<Domain, expr_type>::type type;
                 typedef type result_type;
 
-            #if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
-                template<typename T2>
+                BOOST_PROTO_WITH_ALIAS_(T, T2)
                 static result_type call(T2 &t)
                 {
-                    return type::make(t);
-                }
-            #else
-                static result_type call(T &t)
-                {
-                    return type::make(t);
+                    return generate<Domain, 
expr_type>::make(expr_type::make(t));
                 }
-            #endif
             };
 
-            template<typename T>
-            struct as_expr<T, typename T::is_boost_proto_expr_>
+            template<typename T, typename Domain>
+            struct as_expr<T, Domain, typename T::is_boost_proto_expr_>
             {
                 typedef typename T::boost_proto_expr_type_ type;
                 typedef T &result_type;
 
-            #if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
-                template<typename T2>
+                BOOST_PROTO_WITH_ALIAS_(T, T2)
                 static result_type call(T2 &t)
                 {
                     return t;
                 }
-            #else
-                static result_type call(T &t)
-                {
-                    return t;
-                }
-            #endif
             };
 
             // as_arg
-            template<typename T, typename EnableIf>
+            template<typename T, typename Domain, typename EnableIf>
             struct as_arg
             {
-                typedef expr<proto::tag::terminal, args1<T &> > type;
+                typedef expr<proto::tag::terminal, args1<T &> > expr_type;
+                typedef typename generate<Domain, expr_type>::type type;
+
+                BOOST_PROTO_WITH_ALIAS_(T, T2)
+                static type call(T2 &t)
+                {
+                    return generate<Domain, 
expr_type>::make(expr_type::make(t));
+                }
             };
 
-            template<typename T>
-            struct as_arg<T, typename T::is_boost_proto_expr_>
+            template<typename T, typename Domain>
+            struct as_arg<T, Domain, typename T::is_boost_proto_expr_>
             {
                 typedef ref_<T> type;
+
+                BOOST_PROTO_WITH_ALIAS_(T, T2)
+                static type call(T2 &t)
+                {
+                    return type::make(t);
+                }
             };
 
             template<typename Expr, typename N>
@@ -305,6 +307,7 @@
 
         namespace functional
         {
+            template<typename Domain>
             struct as_expr
             {
                 template<typename Sig>
@@ -312,22 +315,25 @@
 
                 template<typename This, typename T>
                 struct result<This(T)>
-                  : result_of::as_expr<typename remove_reference<T>::type>
+                  : result_of::as_expr<typename remove_reference<T>::type, 
Domain>
                 {};
 
                 template<typename T>
-                typename result_of::as_expr<T>::result_type operator()(T &t) 
const
+                typename result_of::as_expr<T, Domain>::result_type
+                operator ()(T &t) const
                 {
-                    return result_of::as_expr<T>::call(t);
+                    return result_of::as_expr<T, Domain>::call(t);
                 }
 
                 template<typename T>
-                typename result_of::as_expr<T const>::result_type operator()(T 
const &t) const
+                typename result_of::as_expr<T const, Domain>::result_type
+                operator ()(T const &t) const
                 {
-                    return result_of::as_expr<T const>::call(t);
+                    return result_of::as_expr<T const, Domain>::call(t);
                 }
             };
 
+            template<typename Domain>
             struct as_arg
             {
                 template<typename Sig>
@@ -335,21 +341,21 @@
 
                 template<typename This, typename T>
                 struct result<This(T)>
-                  : result_of::as_arg<typename remove_reference<T>::type>
+                  : result_of::as_arg<typename remove_reference<T>::type, 
Domain>
                 {};
 
                 template<typename T>
-                typename result_of::as_arg<T>::type operator()(T &t) const
+                typename result_of::as_arg<T, Domain>::type
+                operator ()(T &t) const
                 {
-                    typename result_of::as_arg<T>::type that = {t};
-                    return that;
+                    return result_of::as_arg<T, Domain>::call(t);
                 }
 
                 template<typename T>
-                typename result_of::as_arg<T const>::type operator()(T const 
&t) const
+                typename result_of::as_arg<T const, Domain>::type
+                operator ()(T const &t) const
                 {
-                    typename result_of::as_arg<T const>::type that = {t};
-                    return that;
+                    return result_of::as_arg<T const, Domain>::call(t);
                 }
             };
 
@@ -365,13 +371,13 @@
                 {};
 
                 template<typename Expr>
-                typename result_of::arg_c<Expr, N>::reference operator()(Expr 
&expr) const
+                typename result_of::arg_c<Expr, N>::reference operator ()(Expr 
&expr) const
                 {
                     return result_of::arg_c<Expr, N>::call(expr);
                 }
 
                 template<typename Expr>
-                typename result_of::arg_c<Expr, N>::const_reference 
operator()(Expr const &expr) const
+                typename result_of::arg_c<Expr, N>::const_reference operator 
()(Expr const &expr) const
                 {
                     return result_of::arg_c<Expr, N>::call(expr);
                 }
@@ -389,13 +395,13 @@
                 {};
 
                 template<typename Expr>
-                typename result_of::arg<Expr, N>::reference operator()(Expr 
&expr) const
+                typename result_of::arg<Expr, N>::reference operator ()(Expr 
&expr) const
                 {
                     return result_of::arg<Expr, N>::call(expr);
                 }
 
                 template<typename Expr>
-                typename result_of::arg<Expr, N>::const_reference 
operator()(Expr const &expr) const
+                typename result_of::arg<Expr, N>::const_reference operator 
()(Expr const &expr) const
                 {
                     return result_of::arg<Expr, N>::call(expr);
                 }
@@ -412,13 +418,13 @@
                 {};
 
                 template<typename Expr>
-                typename result_of::left<Expr>::reference operator()(Expr 
&expr) const
+                typename result_of::left<Expr>::reference operator ()(Expr 
&expr) const
                 {
                     return proto::unref(expr.cast().arg0);
                 }
 
                 template<typename Expr>
-                typename result_of::left<Expr>::const_reference 
operator()(Expr const &expr) const
+                typename result_of::left<Expr>::const_reference operator 
()(Expr const &expr) const
                 {
                     return proto::unref(expr.cast().arg0);
                 }
@@ -435,13 +441,13 @@
                 {};
 
                 template<typename Expr>
-                typename result_of::right<Expr>::reference operator()(Expr 
&expr) const
+                typename result_of::right<Expr>::reference operator ()(Expr 
&expr) const
                 {
                     return proto::unref(expr.cast().arg1);
                 }
 
                 template<typename Expr>
-                typename result_of::right<Expr>::const_reference 
operator()(Expr const &expr) const
+                typename result_of::right<Expr>::const_reference operator 
()(Expr const &expr) const
                 {
                     return proto::unref(expr.cast().arg1);
                 }
@@ -449,11 +455,81 @@
 
         }
 
-        functional::as_expr const as_expr = {};
-        functional::as_arg const as_arg = {};
         functional::left const left = {};
         functional::right const right = {};
 
+        /// as_expr
+        ///
+        template<typename T>
+        typename result_of::as_expr<T>::result_type
+        as_expr(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+        {
+            return result_of::as_expr<T>::call(t);
+        }
+
+        /// \overload
+        ///
+        template<typename T>
+        typename result_of::as_expr<T const>::result_type
+        as_expr(T const &t)
+        {
+            return result_of::as_expr<T const>::call(t);
+        }
+
+        /// \overload
+        ///
+        template<typename Domain, typename T>
+        typename result_of::as_expr<T, Domain>::result_type
+        as_expr(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+        {
+            return result_of::as_expr<T, Domain>::call(t);
+        }
+
+        /// \overload
+        ///
+        template<typename Domain, typename T>
+        typename result_of::as_expr<T const, Domain>::result_type
+        as_expr(T const &t)
+        {
+            return result_of::as_expr<T const, Domain>::call(t);
+        }
+
+        /// as_arg
+        ///
+        template<typename T>
+        typename result_of::as_arg<T>::type
+        as_arg(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+        {
+            return result_of::as_arg<T>::call(t);
+        }
+
+        /// \overload
+        ///
+        template<typename T>
+        typename result_of::as_arg<T const>::type
+        as_arg(T const &t)
+        {
+            return result_of::as_arg<T const>::call(t);
+        }
+
+        /// \overload
+        ///
+        template<typename Domain, typename T>
+        typename result_of::as_arg<T, Domain>::type
+        as_arg(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+        {
+            return result_of::as_arg<T, Domain>::call(t);
+        }
+
+        /// \overload
+        ///
+        template<typename Domain, typename T>
+        typename result_of::as_arg<T const, Domain>::type
+        as_arg(T const &t)
+        {
+            return result_of::as_arg<T const, Domain>::call(t);
+        }
+
         /// arg
         ///
         template<typename Expr>


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs

Reply via email to