$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: hartmut.kaiser_at_[hidden]
Date: 2008-05-07 00:20:06
Author: hkaiser
Date: 2008-05-07 00:20:04 EDT (Wed, 07 May 2008)
New Revision: 45187
URL: http://svn.boost.org/trac/boost/changeset/45187
Log:
Spirit.Karma: Fixed output iterator issue
Text files modified: 
   trunk/boost/spirit/home/karma/generate.hpp         |   114 ++++++++++++++++++++++++++++++++++++++++
   trunk/libs/spirit/example/karma/calc2_ast_dump.cpp |    10 +-                                      
   trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp  |    16 +++--                                   
   3 files changed, 128 insertions(+), 12 deletions(-)
Modified: trunk/boost/spirit/home/karma/generate.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/generate.hpp	(original)
+++ trunk/boost/spirit/home/karma/generate.hpp	2008-05-07 00:20:04 EDT (Wed, 07 May 2008)
@@ -45,6 +45,27 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
+    template <typename OutputIterator, typename Expr>
+    inline bool
+    generate(detail::output_iterator<OutputIterator>& sink, Expr const& xpr)
+    {
+        typedef spirit::traits::is_component<karma::domain, Expr> is_component;
+
+        // report invalid expression error as early as possible
+        BOOST_MPL_ASSERT_MSG(is_component::value,
+            xpr_is_not_convertible_to_a_generator, 
+            (OutputIterator, Expr));
+
+        typedef
+            typename result_of::as_component<karma::domain, Expr>::type
+        component;
+        typedef typename component::director director;
+
+        component c = spirit::as_component(karma::domain(), xpr);
+        return director::generate(c, sink, unused, unused, unused);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator, typename Expr, typename Parameter>
     inline bool
     generate(OutputIterator target_sink, Expr const& xpr, Parameter const& param)
@@ -69,6 +90,28 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
+    template <typename OutputIterator, typename Expr, typename Parameter>
+    inline bool
+    generate(detail::output_iterator<OutputIterator>& sink, Expr const& xpr, 
+        Parameter const& param)
+    {
+        typedef spirit::traits::is_component<karma::domain, Expr> is_component;
+
+        // report invalid expression error as early as possible
+        BOOST_MPL_ASSERT_MSG(is_component::value,
+            xpr_is_not_convertible_to_a_generator, 
+            (OutputIterator, Expr, Parameter));
+
+        typedef
+            typename result_of::as_component<karma::domain, Expr>::type
+        component;
+        typedef typename component::director director;
+
+        component c = spirit::as_component(karma::domain(), xpr);
+        return director::generate(c, sink, unused, unused, param);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator, typename Expr, typename Delimiter>
     inline bool
     generate_delimited(OutputIterator target_sink, Expr const& xpr,
@@ -107,6 +150,41 @@
     }
 
     ///////////////////////////////////////////////////////////////////////////
+    template <typename OutputIterator, typename Expr, typename Delimiter>
+    inline bool
+    generate_delimited(detail::output_iterator<OutputIterator>& sink, 
+        Expr const& xpr, Delimiter const& delimiter)
+    {
+        typedef
+            spirit::traits::is_component<karma::domain, Expr>
+        expr_is_component;
+        typedef
+            spirit::traits::is_component<karma::domain, Delimiter>
+        delimiter_is_component;
+
+        // report invalid expression errors as early as possible
+        BOOST_MPL_ASSERT_MSG(expr_is_component::value,
+            xpr_is_not_convertible_to_a_generator, 
+            (OutputIterator, Expr, Delimiter));
+
+        BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
+            delimiter_is_not_convertible_to_a_generator, 
+            (OutputIterator, Expr, Delimiter));
+        
+        typedef
+            typename result_of::as_component<karma::domain, Expr>::type
+        component;
+        typedef typename component::director director;
+        typedef
+            typename result_of::as_component<karma::domain, Delimiter>::type
+        delim_component;
+
+        component c = spirit::as_component(karma::domain(), xpr);
+        delim_component d = spirit::as_component(karma::domain(), delimiter);
+        return director::generate(c, sink, unused, d, unused);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
     template <typename OutputIterator, typename Expr, typename Parameter,
         typename Delimiter>
     inline bool
@@ -145,6 +223,42 @@
         return director::generate(c, sink, unused, d, param);
     }
 
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename OutputIterator, typename Expr, typename Parameter,
+        typename Delimiter>
+    inline bool
+    generate_delimited(detail::output_iterator<OutputIterator>& sink, 
+        Expr const& xpr, Parameter const& param, Delimiter const& delimiter)
+    {
+        typedef
+            spirit::traits::is_component<karma::domain, Expr>
+        expr_is_component;
+        typedef
+            spirit::traits::is_component<karma::domain, Delimiter>
+        delimiter_is_component;
+
+        // report invalid expression errors as early as possible
+        BOOST_MPL_ASSERT_MSG(expr_is_component::value,
+            xpr_is_not_convertible_to_a_generator, 
+            (OutputIterator, Expr, Parameter, Delimiter));
+
+        BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
+            delimiter_is_not_convertible_to_a_generator, 
+            (OutputIterator, Expr, Parameter, Delimiter));
+        
+        typedef
+            typename result_of::as_component<karma::domain, Expr>::type
+        component;
+        typedef typename component::director director;
+        typedef
+            typename result_of::as_component<karma::domain, Delimiter>::type
+        delim_component;
+
+        component c = spirit::as_component(karma::domain(), xpr);
+        delim_component d = spirit::as_component(karma::domain(), delimiter);
+        return director::generate(c, sink, unused, d, param);
+    }
+
 }}}
 
 #endif
Modified: trunk/libs/spirit/example/karma/calc2_ast_dump.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/calc2_ast_dump.cpp	(original)
+++ trunk/libs/spirit/example/karma/calc2_ast_dump.cpp	2008-05-07 00:20:04 EDT (Wed, 07 May 2008)
@@ -71,22 +71,22 @@
     dump_ast()
     {
         ast_node %= 
-                int_        [_1 = _int(_r0)]
-            |   binary_node [_1 = _bin_op(_r0)]
-            |   unary_node  [_1 = _unary_op(_r0)]
+                int_        [_1 = _int(_val)]
+            |   binary_node [_1 = _bin_op(_val)]
+            |   unary_node  [_1 = _unary_op(_val)]
             ;
             
         binary_node = 
                 ('(' << ast_node << char_ << ast_node << ')')
                 [ 
-                    _1 = _left(_r0), _2 = _op(_r0), _3 = _right(_r0)
+                    _1 = _left(_val), _2 = _op(_val), _3 = _right(_val)
                 ]
             ;
 
         unary_node =
                 ('(' << char_ << ast_node << ')')
                 [
-                    _1 = _op(_r0), _2 = _right(_r0)
+                    _1 = _op(_val), _2 = _right(_val)
                 ]
             ;
     }
Modified: trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp
==============================================================================
--- trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp	(original)
+++ trunk/libs/spirit/example/karma/calc2_ast_rpn.cpp	2008-05-07 00:20:04 EDT (Wed, 07 May 2008)
@@ -72,22 +72,24 @@
     ast_rpn()
     {
         ast_node %= 
-                int_        [_1 = _int(_r0)]
-            |   binary_node [_1 = _bin_op(_r0)]
-            |   unary_node  [_1 = _unary_op(_r0)]
+                int_        [_1 = _int(_val)]
+            |   binary_node [_1 = _bin_op(_val)]
+            |   unary_node  [_1 = _unary_op(_val)]
             ;
             
         binary_node = 
                 (ast_node << ast_node << char_)
                 [ 
-                    _1 = _left(_r0), _2 = _right(_r0), _3 = _op(_r0)
+                    _1 = _left(_val), _2 = _right(_val), _3 = _op(_val)
                 ]
             ;
 
         unary_node =
-                verbatim['(' << ast_node << char_ << ')']
-                [
-                    _1 = _right(_r0), _2 = _op(_r0)
+                verbatim [
+                    ('(' << ast_node << char_ << ')')
+                    [
+                        _1 = _right(_val), _2 = _op(_val)
+                    ]
                 ]
             ;
     }