$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: eric_at_[hidden]
Date: 2007-12-02 23:53:38
Author: eric_niebler
Date: 2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
New Revision: 41631
URL: http://svn.boost.org/trac/boost/changeset/41631
Log:
require user disambiguation of call/make transforms
Added:
   branches/proto/v3/boost/xpressive/proto/transform/bind.hpp   (contents, props changed)
Text files modified: 
   branches/proto/v3/boost/xpressive/detail/static/grammar.hpp |    48 +++++++++++++++----------               
   branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp       |     4 ++                                      
   branches/proto/v3/boost/xpressive/proto/transform.hpp       |     2 +                                       
   branches/proto/v3/boost/xpressive/proto/transform/call.hpp  |    73 ++++++++++++++++++++++++++++++++++++++++
   branches/proto/v3/boost/xpressive/proto/transform/when.hpp  |    45 ++++++++++++++---------                 
   5 files changed, 135 insertions(+), 37 deletions(-)
Modified: branches/proto/v3/boost/xpressive/detail/static/grammar.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/detail/static/grammar.hpp	(original)
+++ branches/proto/v3/boost/xpressive/detail/static/grammar.hpp	2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
@@ -329,7 +329,7 @@
           : or_<
                 when<
                     comma<ListSet<Char>, CharLiteral<Char> >
-                  , mpl::next<ListSet<Char>(_left)>()
+                  , mpl::next<call<ListSet<Char>(_left)> >()
                 >
               , when<
                     assign<terminal<set_initializer>, CharLiteral<Char> >
@@ -483,12 +483,16 @@
             {};
 
             // Here are some transforms ...
+            struct as_regex
+              : call<Gram>
+            {};
+
             struct as_independent
-              : call<Gram(_make_shift_right(_, true_matcher()), no_next())>
+              : call<as_regex(_make_shift_right(_, true_matcher()), no_next())>
             {};
 
             struct as_alternate
-              : call<Gram(_make_shift_right(_, alternate_end_matcher()), no_next())>
+              : call<as_regex(_make_shift_right(_, alternate_end_matcher()), no_next())>
             {};
 
             struct as_alternates_list
@@ -582,10 +586,13 @@
               : if_<
                     use_simple_repeat<_arg, Char>()
                   , as_simple_repeat<Greedy>
-                  , Gram(as_default_repeat<Greedy, tag_of<_> >(_))
+                  , as_regex(bind<as_default_repeat<Greedy, tag_of<_> > >)
                 >
             {};
 
+            struct as_greedy_repeat         : as_repeat<greedy_t>       {};
+            struct as_non_greedy_repeat     : as_repeat<non_greedy_t>   {};
+
             template<typename Greedy>
             struct as_optional
               : if_<
@@ -595,10 +602,13 @@
                 >
             {};
 
+            struct as_greedy_optional       : as_optional<greedy_t>     {};
+            struct as_non_greedy_optional   : as_optional<non_greedy_t> {};
+
             struct as_list_set
               : call<
                     fill_list_set(
-                        set_matcher<traits(_visitor), ListSet<Char>(_) >()
+                        set_matcher<traits(_visitor), call<ListSet<Char> > >()
                       , _
                       , _visitor
                     )
@@ -617,7 +627,7 @@
                           , compound_charset<traits(_visitor)>()
                         >
                     >()
-                  , merge_charset(_state, Gram(_make_shift_right(_, end_matcher()), no_next()), _visitor)
+                  , merge_charset(_state, as_regex(_make_shift_right(_, end_matcher()), no_next()), _visitor)
                 >
             {};
 
@@ -638,7 +648,7 @@
               : when<
                     // _ >> 'a'
                     shift_right<Gram, Gram>
-                  , reverse_fold_tree<_, _state, in_sequence(Gram, _state)>
+                  , reverse_fold_tree<_, _state, in_sequence(as_regex, _state)>
                 >
             {};
 
@@ -654,38 +664,38 @@
             template<typename Dummy>
             struct case_<tag::dereference, Dummy>
                 // *_
-              : when<dereference<Gram>, as_repeat<greedy_t> >
+              : when<dereference<Gram>, as_greedy_repeat>
             {};
 
             template<typename Dummy>
             struct case_<tag::posit, Dummy>
                 // +_
-              : when<posit<Gram>, as_repeat<greedy_t> >
+              : when<posit<Gram>, as_greedy_repeat>
             {};
 
             template<uint_t Min, uint_t Max, typename Dummy>
             struct case_<generic_quant_tag<Min, Max>, Dummy>
                 // repeat<0,42>(_)
-              : when<unary_expr<generic_quant_tag<Min, Max>, Gram>, as_repeat<greedy_t> >
+              : when<unary_expr<generic_quant_tag<Min, Max>, Gram>, as_greedy_repeat>
             {};
 
             template<typename Dummy>
             struct case_<tag::logical_not, Dummy>
                 // !_
-              : when<logical_not<Gram>, as_optional<greedy_t>(_arg)>
+              : when<logical_not<Gram>, as_greedy_optional(_arg)>
             {};
 
             template<typename Dummy>
             struct case_<tag::negate, Dummy>
               : or_<
                     // -*_
-                    when<negate<dereference<Gram> > , as_repeat<non_greedy_t>(_arg)>
+                    when<negate<dereference<Gram> > , as_non_greedy_repeat(_arg)>
                     // -+_
-                  , when<negate<posit<Gram> >       , as_repeat<non_greedy_t>(_arg)>
+                  , when<negate<posit<Gram> >       , as_non_greedy_repeat(_arg)>
                     // -repeat<0,42>(_)
-                  , when<negate<GenericQuant>       , as_repeat<non_greedy_t>(_arg)>
+                  , when<negate<GenericQuant>       , as_non_greedy_repeat(_arg)>
                     // -!_
-                  , when<negate<logical_not<Gram> > , as_optional<non_greedy_t>(_arg(_arg))>
+                  , when<negate<logical_not<Gram> > , as_non_greedy_optional(_arg(_arg))>
                 >
             {};
 
@@ -693,7 +703,7 @@
             struct case_<tag::assign, Dummy>
               : or_<
                     // (s1= ...)
-                    when<assign<terminal<mark_placeholder>, Gram>, Gram(as_marker)>
+                    when<assign<terminal<mark_placeholder>, Gram>, as_regex(as_marker)>
                     // (set= 'a')
                   , when<ListSet<Char>, as_matcher(_arg(_right), _visitor)>
                 >
@@ -787,7 +797,7 @@
                             complement<subscript<terminal<set_initializer>, terminal<_> > >
                           , complement<assign<terminal<set_initializer>, terminal<_> > >
                         >
-                      , Gram(_make_complement(_right(_arg)))
+                      , as_regex(_make_complement(_right(_arg)))
                     >
                     // ~set['a' | alpha | ... ] or ~(set='a','b','c')
                   , when<
@@ -795,7 +805,7 @@
                             complement<subscript<terminal<set_initializer>, bitwise_or<Gram, Gram> > >
                           , complement<ListSet<Char> >
                         >
-                      , invert(Gram(_arg))
+                      , invert(as_regex(_arg))
                     >
                 >
             {};
@@ -820,7 +830,7 @@
             struct case_<modifier_tag, Dummy>
               : when<
                     binary_expr<modifier_tag, terminal<_>, Gram>
-                  , Gram(_right, _state, modify(_arg(_left), _visitor))
+                  , as_regex(_right, _state, modify(_arg(_left), _visitor))
                 >
             {};
         };
Modified: branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp	(original)
+++ branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp	2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
@@ -349,6 +349,9 @@
         template<typename Fun, typename... Args>
         struct make;
 
+        template<typename Fun, typename... Args>
+        struct bind;
+
         template<typename Sequence, typename State, typename Fun>
         struct fold;
 
@@ -408,6 +411,7 @@
     using transform::_arg_c;
     using transform::call;
     using transform::make;
+    using transform::bind;
     using transform::fold;
     using transform::always;
     using transform::reverse_fold;
Modified: branches/proto/v3/boost/xpressive/proto/transform.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/transform.hpp	(original)
+++ branches/proto/v3/boost/xpressive/proto/transform.hpp	2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
@@ -10,7 +10,9 @@
 #define BOOST_PROTO_TRANSFORM_HPP_EAN_10_29_2007
 
 #include <boost/xpressive/proto/transform/arg.hpp>
+#include <boost/xpressive/proto/transform/bind.hpp>
 #include <boost/xpressive/proto/transform/call.hpp>
+#include <boost/xpressive/proto/transform/make.hpp>
 #include <boost/xpressive/proto/transform/fold.hpp>
 #include <boost/xpressive/proto/transform/fold_tree.hpp>
 #include <boost/xpressive/proto/transform/when.hpp>
Added: branches/proto/v3/boost/xpressive/proto/transform/bind.hpp
==============================================================================
--- (empty file)
+++ branches/proto/v3/boost/xpressive/proto/transform/bind.hpp	2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
@@ -0,0 +1,63 @@
+///////////////////////////////////////////////////////////////////////////////
+/// \file bind.hpp
+/// Contains definition of the bind<> transform.
+//
+//  Copyright 2007 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_TRANSFORM_BIND_HPP_EAN_12_02_2007
+#define BOOST_PROTO_TRANSFORM_BIND_HPP_EAN_12_02_2007
+
+#include <boost/utility/result_of.hpp>
+#include <boost/xpressive/proto/proto_fwd.hpp>
+#include <boost/xpressive/proto/transform/make.hpp>
+#include <boost/xpressive/proto/transform/call.hpp>
+
+namespace boost { namespace proto
+{
+
+    namespace transform
+    {
+        template<typename Return, typename... Args>
+        struct bind : transform_base
+        {
+            template<typename Sig>
+            struct result;
+
+            template<typename This, typename Expr, typename State, typename Visitor>
+            struct result<This(Expr, State, Visitor)>
+              : boost::result_of<
+                    call<
+                        typename boost::result_of<make<Return>(Expr, State, Visitor)>::type
+                      , Args...
+                    >(Expr, State, Visitor)
+                >
+            {};
+
+            template<typename Expr, typename State, typename Visitor>
+            typename result<bind(Expr, State, Visitor)>::type
+            operator()(Expr const &expr, State const &state, Visitor &visitor) const
+            {
+                return call<
+                    typename boost::result_of<make<Return>(Expr, State, Visitor)>::type
+                  , Args...
+                >()(expr, state, visitor);
+            }
+        };
+
+        template<typename Fun, typename... Args>
+        struct bind<Fun(Args...)>
+          : bind<Fun, Args...>
+        {};
+
+    }
+
+    template<typename Fun, typename... Args>
+    struct is_transform<transform::bind<Fun, Args...> >
+      : mpl::true_
+    {};
+
+}}
+
+#endif
Modified: branches/proto/v3/boost/xpressive/proto/transform/call.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/transform/call.hpp	(original)
+++ branches/proto/v3/boost/xpressive/proto/transform/call.hpp	2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
@@ -13,6 +13,13 @@
 #include <boost/xpressive/proto/proto_fwd.hpp>
 #include <boost/xpressive/proto/traits.hpp>
 
+// BUGBUG these are not the same:
+//   as_foo< transform(_arg) >(_)
+//   call<as_foo< transform(_arg) >(_)>
+//
+// The problem is that in the second, the inner transform is
+// evaluated, but in the first it isn't.
+
 namespace boost { namespace proto
 {
 
@@ -42,6 +49,14 @@
             no_type check_fun_arity(private_type_ const &);
 
             template<typename Fun>
+            struct callable0_wrap : Fun
+            {
+                callable0_wrap();
+                typedef private_type_ const &(*pfun0)();
+                operator pfun0() const;
+            };
+
+            template<typename Fun>
             struct callable1_wrap : Fun
             {
                 callable1_wrap();
@@ -58,6 +73,17 @@
             };
 
             template<typename Fun, typename A0>
+            struct arity0
+            {
+                static callable0_wrap<Fun> &fun;
+
+                static int const value =
+                    sizeof(yes_type) == sizeof(check_fun_arity((fun(), 0)))
+                  ? 0
+                  : 3;
+            };
+
+            template<typename Fun, typename A0>
             struct arity1
             {
                 static callable1_wrap<Fun> &fun;
@@ -96,6 +122,25 @@
             };
 
             template<typename Fun, typename Expr, typename State, typename Visitor
+              , int Arity = arity0<Fun, Expr>::value>
+            struct call0
+              : call3<Fun, Expr, State, Visitor>
+            {};
+
+            template<typename Fun, typename Expr, typename State, typename Visitor>
+            struct call0<Fun, Expr, State, Visitor, 0>
+            {
+                typedef typename boost::result_of<Fun()>::type type;
+
+                template<typename A, typename B, typename C>
+                static type call(A &&, B &&, C &&)
+                {
+                    Fun f;
+                    return f();
+                }
+            };
+
+            template<typename Fun, typename Expr, typename State, typename Visitor
               , int Arity = arity1<Fun, Expr>::value>
             struct call1
               : call3<Fun, Expr, State, Visitor>
@@ -156,6 +201,34 @@
             }
         };
 
+        template<typename Fun>
+        struct call<Fun> : transform_base
+        {
+            template<typename Sig>
+            struct result;
+
+            template<typename This, typename Expr, typename State, typename Visitor>
+            struct result<This(Expr, State, Visitor)>
+              : detail::call0<
+                    Fun
+                  , Expr
+                  , State
+                  , Visitor
+                >
+            {};
+
+            template<typename Expr, typename State, typename Visitor>
+            typename result<call(Expr, State, Visitor)>::type
+            operator()(Expr const &expr, State const &state, Visitor &visitor) const
+            {
+                return result<call(Expr, State, Visitor)>::call(
+                    expr
+                  , state
+                  , visitor
+                );
+            }
+        };
+
         template<typename Fun, typename Arg0>
         struct call<Fun, Arg0> : transform_base
         {
Modified: branches/proto/v3/boost/xpressive/proto/transform/when.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/transform/when.hpp	(original)
+++ branches/proto/v3/boost/xpressive/proto/transform/when.hpp	2007-12-02 23:53:38 EST (Sun, 02 Dec 2007)
@@ -78,28 +78,37 @@
             >
             struct apply
             {
-                typedef 
-                    typename boost::result_of<
-                        transform::make<Return, Args...>(Expr, State, Visitor)
-                    >::type
-                lambda_type;
-
-                // If the result of applying the lambda on the return type is a transform,
-                // apply the transform rather than trying to construct it.
-                typedef
-                    typename mpl::if_<
-                        proto::detail::is_transform2_<lambda_type>
-                      , transform::call<lambda_type, Args...>
-                      , transform::make<Return, Args...>
-                    >::type
-                transform_type;
-
-                typedef typename boost::result_of<transform_type(Expr, State, Visitor)>::type type;
+                typedef typename boost::result_of<
+                    transform::make<Return, Args...>(Expr, State, Visitor)
+                >::type type;
 
                 static type call(Expr const &expr, State const &state, Visitor &visitor)
                 {
-                    return transform_type()(expr, state, visitor);
+                    return transform::make<Return, Args...>()(expr, state, visitor);
                 }
+
+                //typedef 
+                //    typename boost::result_of<
+                //        transform::make<Return, Args...>(Expr, State, Visitor)
+                //    >::type
+                //lambda_type;
+
+                //// If the result of applying the lambda on the return type is a transform,
+                //// apply the transform rather than trying to construct it.
+                //typedef
+                //    typename mpl::if_<
+                //        proto::detail::is_transform2_<lambda_type>
+                //      , transform::call<lambda_type, Args...>
+                //      , transform::make<Return, Args...>
+                //    >::type
+                //transform_type;
+
+                //typedef typename boost::result_of<transform_type(Expr, State, Visitor)>::type type;
+
+                //static type call(Expr const &expr, State const &state, Visitor &visitor)
+                //{
+                //    return transform_type()(expr, state, visitor);
+                //}
             };
 
             template<