$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r53597 - in trunk: boost/spirit/home/karma/auxiliary boost/spirit/home/qi/auxiliary libs/spirit/test/karma libs/spirit/test/qi
From: hartmut.kaiser_at_[hidden]
Date: 2009-06-03 08:48:11
Author: hkaiser
Date: 2009-06-03 08:48:10 EDT (Wed, 03 Jun 2009)
New Revision: 53597
URL: http://svn.boost.org/trac/boost/changeset/53597
Log:
Spirit: applied patch allowing to use lazy constructs in directives for Karma
Text files modified: 
   trunk/boost/spirit/home/karma/auxiliary/lazy.hpp |    66 +++++++++++++++++++++++++-------------- 
   trunk/boost/spirit/home/qi/auxiliary/lazy.hpp    |     6 +-                                      
   trunk/libs/spirit/test/karma/case_handling.cpp   |     8 ++++                                    
   trunk/libs/spirit/test/qi/no_case.cpp            |     6 +-                                      
   4 files changed, 56 insertions(+), 30 deletions(-)
Modified: trunk/boost/spirit/home/karma/auxiliary/lazy.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/auxiliary/lazy.hpp	(original)
+++ trunk/boost/spirit/home/karma/auxiliary/lazy.hpp	2009-06-03 08:48:10 EDT (Wed, 03 Jun 2009)
@@ -42,14 +42,19 @@
 namespace boost { namespace spirit { namespace karma
 {
     using spirit::lazy;
+    typedef modify<karma::domain> karma_modify;
 
-    template <typename Function>
-    struct lazy_generator : generator<lazy_generator<Function> >
+    template <typename Function, typename Modifiers>
+    struct lazy_generator : generator<lazy_generator<Function, Modifiers> >
     {
         template <typename Context, typename Unused>
         struct attribute
         {
             typedef typename
+                boost::result_of<karma_modify(tag::lazy_eval, Modifiers)>::type
+            modifier;
+
+            typedef typename
                 remove_reference<
                     typename boost::result_of<Function(unused_type, Context)>::type
                 >::type
@@ -61,7 +66,7 @@
             BOOST_SPIRIT_ASSERT_MATCH(karma::domain, expr_type)
 
             typedef typename
-                result_of::compile<karma::domain, expr_type, tag::lazy_eval>::type
+                result_of::compile<karma::domain, expr_type, modifier>::type
             generator_type;
 
             typedef typename
@@ -69,9 +74,8 @@
             type;
         };
 
-        lazy_generator(Function const& func)
-          : func(func) 
-        {}
+        lazy_generator(Function const& func, Modifiers const& modifiers)
+          : func(func), modifiers(modifiers) {}
 
         template <
             typename OutputIterator, typename Context, 
@@ -80,7 +84,8 @@
         bool generate(OutputIterator& sink, Context& context, 
             Delimiter const& d, Attribute const& attr) const
         {
-            return compile<karma::domain>(func(unused, context), tag::lazy_eval())
+            return compile<karma::domain>(func(unused, context)
+              , karma_modify()(tag::lazy_eval(), modifiers))
                 .generate(sink, context, d, attr);
         }
 
@@ -88,17 +93,20 @@
         info what(Context& context) const
         {
             return info("lazy"
-              , compile<karma::domain>(func(unused, context), tag::lazy_eval())
+              , compile<karma::domain>(func(unused, context)
+                , karma_modify()(tag::lazy_eval(), modifiers))
                     .what(context)
             );
         }
 
         Function func;
+        Modifiers modifiers;
     };
 
     ///////////////////////////////////////////////////////////////////////////
-    template <typename Function, typename Subject>
-    struct lazy_directive : unary_generator<lazy_directive<Function, Subject> >
+    template <typename Function, typename Subject, typename Modifiers>
+    struct lazy_directive 
+      : unary_generator<lazy_directive<Function, Subject, Modifiers> >
     {
         typedef Subject subject_type;
 
@@ -106,6 +114,10 @@
         struct attribute
         {
             typedef typename
+                boost::result_of<karma_modify(tag::lazy_eval, Modifiers)>::type
+            modifier;
+
+            typedef typename
                 remove_reference<
                     typename boost::result_of<Function(unused_type, Context)>::type
                 >::type
@@ -125,7 +137,7 @@
             BOOST_SPIRIT_ASSERT_MATCH(karma::domain, expr_type)
 
             typedef typename
-                result_of::compile<karma::domain, expr_type, tag::lazy_eval>::type
+                result_of::compile<karma::domain, expr_type, modifier>::type
             generator_type;
 
             typedef typename
@@ -133,8 +145,9 @@
             type;
         };
 
-        lazy_directive(Function const& function, Subject const& subject)
-          : function(function), subject(subject) {}
+        lazy_directive(Function const& function, Subject const& subject
+              , Modifiers const& modifiers)
+          : function(function), subject(subject), modifiers(modifiers) {}
 
         template <typename OutputIterator, typename Context, typename Delimiter
           , typename Attribute>
@@ -143,7 +156,8 @@
         {
             return compile<karma::domain>(
                 proto::make_expr<proto::tag::subscript>(
-                    function(unused, ctx), subject), tag::lazy_eval())
+                    function(unused, ctx), subject)
+                  , karma_modify()(tag::lazy_eval(), modifiers))
                 .generate(sink, ctx, d, attr);
         }
 
@@ -153,13 +167,15 @@
             return info("lazy-directive"
               , compile<karma::domain>(
                     proto::make_expr<proto::tag::subscript>(
-                        function(unused, ctx), subject), tag::lazy_eval())
+                        function(unused, ctx), subject)
+                      , karma_modify()(tag::lazy_eval(), modifiers))
                     .what(ctx)
             );
         }
 
         Function function;
         Subject subject;
+        Modifiers modifiers;
     };
 
     ///////////////////////////////////////////////////////////////////////////
@@ -168,21 +184,23 @@
     template <typename Eval, typename Modifiers>
     struct make_primitive<phoenix::actor<Eval>, Modifiers>
     {
-        typedef lazy_generator<phoenix::actor<Eval> > result_type;
-        result_type operator()(phoenix::actor<Eval> const& f, unused_type) const
+        typedef lazy_generator<phoenix::actor<Eval>, Modifiers> result_type;
+        result_type operator()(phoenix::actor<Eval> const& f
+          , Modifiers const& modifiers) const
         {
-            return result_type(f);
+            return result_type(f, modifiers);
         }
     };
 
     template <typename Terminal, typename Actor, int Arity, typename Modifiers>
     struct make_primitive<lazy_terminal<Terminal, Actor, Arity>, Modifiers>
     {
-        typedef lazy_generator<Actor> result_type;
+        typedef lazy_generator<Actor, Modifiers> result_type;
         result_type operator()(
-            lazy_terminal<Terminal, Actor, Arity> const& lt, unused_type) const
+            lazy_terminal<Terminal, Actor, Arity> const& lt
+          , Modifiers const& modifiers) const
         {
-            return result_type(lt.actor);
+            return result_type(lt.actor, modifiers);
         }
     };
 
@@ -192,12 +210,12 @@
     struct make_directive<lazy_terminal<Terminal, Actor, Arity>
       , Subject, Modifiers>
     {
-        typedef lazy_directive<Actor, Subject> result_type;
+        typedef lazy_directive<Actor, Subject, Modifiers> result_type;
         result_type operator()(
             lazy_terminal<Terminal, Actor, Arity> const& lt
-          , Subject const& subject, unused_type) const
+          , Subject const& subject, Modifiers const& modifiers) const
         {
-            return result_type(lt.actor, subject);
+            return result_type(lt.actor, subject, modifiers);
         }
     };
 
Modified: trunk/boost/spirit/home/qi/auxiliary/lazy.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/auxiliary/lazy.hpp	(original)
+++ trunk/boost/spirit/home/qi/auxiliary/lazy.hpp	2009-06-03 08:48:10 EDT (Wed, 03 Jun 2009)
@@ -52,7 +52,7 @@
             typedef typename
                 boost::result_of<qi_modify(tag::lazy_eval, Modifiers)>::type
             modifier;
-            
+
             typedef typename
                 remove_reference<
                     typename boost::result_of<Function(unused_type, Context)>::type
@@ -105,7 +105,7 @@
     template <typename Function, typename Subject, typename Modifiers>
     struct lazy_directive 
         : unary_parser<lazy_directive<Function, Subject, Modifiers> >
-    {       
+    {
         typedef Subject subject_type;
 
         template <typename Context, typename Iterator>
@@ -114,7 +114,7 @@
             typedef typename
                 boost::result_of<qi_modify(tag::lazy_eval, Modifiers)>::type
             modifier;
-                
+
             typedef typename
                 remove_reference<
                     typename boost::result_of<Function(unused_type, Context)>::type
Modified: trunk/libs/spirit/test/karma/case_handling.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/case_handling.cpp	(original)
+++ trunk/libs/spirit/test/karma/case_handling.cpp	2009-06-03 08:48:10 EDT (Wed, 03 Jun 2009)
@@ -255,5 +255,13 @@
         BOOST_TEST(test("ÄÄ", upper["Ää"]));
     }
 
+    {
+        using namespace boost::spirit::ascii;
+        using boost::phoenix::val;
+
+        BOOST_TEST(test("x", lower[val('X')]));
+        BOOST_TEST(test("x", lower[val('x')]));
+    }
+
     return boost::report_errors();
 }
Modified: trunk/libs/spirit/test/qi/no_case.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/no_case.cpp	(original)
+++ trunk/libs/spirit/test/qi/no_case.cpp	2009-06-03 08:48:10 EDT (Wed, 03 Jun 2009)
@@ -160,9 +160,9 @@
         BOOST_TEST(test("x", no_case[char_(val('x'))][ref(ch) = _1]));
         BOOST_TEST(ch == 'x');
     }
-    
+
     {   // lazy no_case lits
-        
+
         using namespace boost::spirit::ascii;
         using boost::phoenix::val;
 
@@ -170,6 +170,6 @@
         BOOST_TEST(test("BOCHI BOCHI", no_case[val("bochi bochi")]));
         BOOST_TEST(!test("Vavoo", no_case[val("bochi bochi")]));
     }
-    
+
     return boost::report_errors();
 }