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

Modified Files:
        generate.hpp proto_fwd.hpp ref.hpp 
Log Message:
add by_value_generator

Index: generate.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/generate.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- generate.hpp        6 Jul 2007 02:55:54 -0000       1.6
+++ generate.hpp        23 Jul 2007 04:21:42 -0000      1.7
@@ -1,93 +1,186 @@
-///////////////////////////////////////////////////////////////////////////////
-/// \file generate.hpp
-/// Contains definition of generate\<\> class template, which end users can
-/// specialize for generating domain-specific expression wrappers.
-//
-//  Copyright 2004 Eric Niebler. 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 BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
-#define BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
+#ifndef BOOST_PP_IS_ITERATING
+    
///////////////////////////////////////////////////////////////////////////////
+    /// \file generate.hpp
+    /// Contains definition of generate\<\> class template, which end users can
+    /// specialize for generating domain-specific expression wrappers.
+    //
+    //  Copyright 2004 Eric Niebler. 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)
 
-#include <boost/xpressive/proto/detail/prefix.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/xpressive/proto/proto_fwd.hpp>
-#include <boost/xpressive/proto/matches.hpp>
-#include <boost/xpressive/proto/detail/suffix.hpp>
+    #ifndef BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
+    #define BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
 
-namespace boost { namespace proto
-{
+    #include <boost/xpressive/proto/detail/prefix.hpp>
+    #include <boost/preprocessor/cat.hpp>
+    #include <boost/preprocessor/selection/max.hpp>
+    #include <boost/preprocessor/iteration/iterate.hpp>
+    #include <boost/preprocessor/repetition/enum.hpp>
+    #include <boost/utility/enable_if.hpp>
+    #include <boost/xpressive/proto/proto_fwd.hpp>
+    #include <boost/xpressive/proto/matches.hpp>
+    #include <boost/xpressive/proto/detail/suffix.hpp>
 
-    namespace generatorns_
+    namespace boost { namespace proto
     {
-        struct default_generator
+
+        namespace detail
         {
+            template<typename Domain, typename Expr>
+            struct generate_if
+              : lazy_enable_if<
+                    matches<Expr, typename Domain::grammar>
+                  , typename Domain::template apply<Expr>
+                >
+            {};
+
+            // Optimization, generate fewer templates...
             template<typename Expr>
-            struct apply
+            struct generate_if<proto::default_domain, Expr>
             {
                 typedef Expr type;
             };
 
             template<typename Expr>
-            static Expr const &make(Expr const &expr)
-            {
-                return expr;
-            };
-        };
+            struct arity_;
+
+            template<typename Tag, typename Args, long N>
+            struct arity_<expr<Tag, Args, N> >
+              : mpl::long_<N>
+            {};
 
-        template<template<typename> class Extends>
-        struct generator
-        {
             template<typename Expr>
-            struct apply
+            struct tag_;
+
+            template<typename Tag, typename Args, long N>
+            struct tag_<expr<Tag, Args, N> >
             {
-                typedef Extends<Expr> type;
+                typedef Tag type;
             };
 
             template<typename Expr>
-            static Extends<Expr> make(Expr const &expr)
+            struct args_;
+
+            template<typename Tag, typename Args, long N>
+            struct args_<expr<Tag, Args, N> >
             {
-                return Extends<Expr>(expr);
-            }
-        };
+                typedef Args type;
+            };
 
-        template<template<typename> class Extends>
-        struct pod_generator
+            template<typename Expr, long Arity = detail::arity_<Expr>::value>
+            struct by_value_generator_;
+
+        #define BOOST_PROTO_DEFINE_BY_VALUE_TYPE(Z, N, Expr)\
+            typename result_of::unref<typename 
args_<Expr>::type::BOOST_PP_CAT(arg, N) >::type
+
+        #define BOOST_PROTO_DEFINE_BY_VALUE(Z, N, expr)\
+            proto::unref(expr.BOOST_PP_CAT(arg, N))
+
+        #define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PROTO_MAX_ARITY, 
<boost/xpressive/proto/generate.hpp>))
+        #include BOOST_PP_ITERATE()
+
+        #undef BOOST_PROTO_DEFINE_BY_VALUE
+        #undef BOOST_PROTO_DEFINE_BY_VALUE_TYPE
+
+        }
+
+        namespace generatorns_
         {
-            template<typename Expr>
-            struct apply
+            struct default_generator
             {
-                typedef Extends<Expr> type;
+                template<typename Expr>
+                struct apply
+                {
+                    typedef Expr type;
+                };
+
+                template<typename Expr>
+                static Expr const &make(Expr const &expr)
+                {
+                    return expr;
+                };
             };
 
-            template<typename Expr>
-            static Extends<Expr> make(Expr const &expr)
+            template<template<typename> class Extends>
+            struct generator
             {
-                Extends<Expr> that = {expr};
-                return that;
-            }
-        };
-    }
+                template<typename Expr>
+                struct apply
+                {
+                    typedef Extends<Expr> type;
+                };
 
-    namespace detail
-    {
-        template<typename Domain, typename Expr>
-        struct generate_if
-          : lazy_enable_if<
-                matches<Expr, typename Domain::grammar>
-              , typename Domain::template apply<Expr>
-            >
-        {};
+                template<typename Expr>
+                static Extends<Expr> make(Expr const &expr)
+                {
+                    return Extends<Expr>(expr);
+                }
+            };
 
-        // Optimization, generate fewer templates...
-        template<typename Expr>
-        struct generate_if<proto::default_domain, Expr>
-        {
-            typedef Expr type;
-        };
-    }
+            template<template<typename> class Extends>
+            struct pod_generator
+            {
+                template<typename Expr>
+                struct apply
+                {
+                    typedef Extends<Expr> type;
+                };
 
-}}
+                template<typename Expr>
+                static Extends<Expr> make(Expr const &expr)
+                {
+                    Extends<Expr> that = {expr};
+                    return that;
+                }
+            };
+
+            template<typename Generator>
+            struct by_value_generator
+            {
+                template<typename Expr>
+                struct apply
+                  : Generator::template apply<
+                        typename detail::by_value_generator_<Expr>::type
+                    >
+                {};
+
+                template<typename Expr>
+                static typename apply<Expr>::type make(Expr const &expr)
+                {
+                    return 
Generator::make(detail::by_value_generator_<Expr>::make(expr));
+                }
+            };
+        }
+
+    }}
+
+    #endif // BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
+
+#else // BOOST_PP_IS_ITERATING
+
+    #define N BOOST_PP_ITERATION()
+
+            template<typename Expr>
+            struct by_value_generator_<Expr, N>
+            {
+                typedef expr<
+                    typename tag_<Expr>::type
+                  , BOOST_PP_CAT(args, N)<
+                        // typename result_of::unref<typename 
args_<Expr>::type::arg0>::type, ...
+                        BOOST_PP_ENUM(BOOST_PP_MAX(N, 1), 
BOOST_PROTO_DEFINE_BY_VALUE_TYPE, Expr)
+                    >
+                > type;
+
+                static type const make(Expr const &expr)
+                {
+                    type that = {
+                        // proto::unref(expr.arg0), ...
+                        BOOST_PP_ENUM(BOOST_PP_MAX(N, 1), 
BOOST_PROTO_DEFINE_BY_VALUE, expr)
+                    };
+                    return that;
+                }
+            };
+
+    #undef N
 
 #endif

Index: proto_fwd.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/proto_fwd.hpp,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- proto_fwd.hpp       14 Jul 2007 07:36:26 -0000      1.89
+++ proto_fwd.hpp       23 Jul 2007 04:21:42 -0000      1.90
@@ -137,11 +137,15 @@
 
         template<template<typename> class Extends>
         struct pod_generator;
+
+        template<typename Generator = default_generator>
+        struct by_value_generator;
     }
 
     using generatorns_::default_generator;
     using generatorns_::generator;
     using generatorns_::pod_generator;
+    using generatorns_::by_value_generator;
 
     namespace domainns_
     {

Index: ref.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/ref.hpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- ref.hpp     6 Jul 2007 08:54:43 -0000       1.31
+++ ref.hpp     23 Jul 2007 04:21:42 -0000      1.32
@@ -79,12 +79,20 @@
         template<typename T>
         struct unref<ref_<T> >
         {
-            typedef typename T::proto_derived_expr type;
+            typedef T type;
             typedef T &reference;
             typedef T &const_reference;
         };
 
         template<typename T>
+        struct unref<ref_<T const> >
+        {
+            typedef T type;
+            typedef T const &reference;
+            typedef T const &const_reference;
+        };
+
+        template<typename T>
         struct unref<T &>
         {
             typedef T type;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs

Reply via email to