$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r61425 - in trunk/boost/spirit/home: karma/action karma/detail qi/action qi/detail support
From: hartmut.kaiser_at_[hidden]
Date: 2010-04-20 10:30:21
Author: hkaiser
Date: 2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
New Revision: 61425
URL: http://svn.boost.org/trac/boost/changeset/61425
Log:
Spirit: added transform_attribute customization point to Qi and Karma semantic actions
Text files modified: 
   trunk/boost/spirit/home/karma/action/action.hpp     |     6 +++++-                                  
   trunk/boost/spirit/home/karma/detail/attributes.hpp |     1 +                                       
   trunk/boost/spirit/home/qi/action/action.hpp        |     6 +++++-                                  
   trunk/boost/spirit/home/qi/detail/attributes.hpp    |     1 +                                       
   trunk/boost/spirit/home/support/action_dispatch.hpp |     1 -                                       
   trunk/boost/spirit/home/support/attributes.hpp      |     2 --                                      
   trunk/boost/spirit/home/support/attributes_fwd.hpp  |    12 ++++++++++++                            
   7 files changed, 24 insertions(+), 5 deletions(-)
Modified: trunk/boost/spirit/home/karma/action/action.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/action/action.hpp	(original)
+++ trunk/boost/spirit/home/karma/action/action.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -56,7 +56,11 @@
             // create a attribute if none is supplied
             // this creates a _copy_ of the attribute because the semantic
             // action will likely change parts of this
-            typename make_attribute::value_type attr = make_attribute::call(attr_);
+            typedef traits::transform_attribute<
+                typename make_attribute::type, attr_type, domain> transform;
+
+            typename transform::type attr = 
+                traits::pre_transform<domain, attr_type>(make_attribute::call(attr_));
 
             // call the function, passing the attribute, the context and a bool 
             // flag that the client can set to false to fail generating.
Modified: trunk/boost/spirit/home/karma/detail/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/detail/attributes.hpp	(original)
+++ trunk/boost/spirit/home/karma/detail/attributes.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -8,6 +8,7 @@
 #define SPIRIT_KARMA_DETAIL_ATTRIBUTES_APR_18_2010_0453PM
 
 #include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
 #include <boost/spirit/home/support/attributes.hpp>
 
 ///////////////////////////////////////////////////////////////////////////////
Modified: trunk/boost/spirit/home/qi/action/action.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/action/action.hpp	(original)
+++ trunk/boost/spirit/home/qi/action/action.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -53,7 +53,11 @@
             typedef traits::make_attribute<attr_type, Attribute> make_attribute;
 
             // create an attribute if one is not supplied
-            typename make_attribute::type attr = make_attribute::call(attr_);
+            typedef traits::transform_attribute<
+                typename make_attribute::type, attr_type, domain> transform;
+
+            typename make_attribute::type made_attr = make_attribute::call(attr_);
+            typename transform::type attr = transform::pre(made_attr);
 
             if (subject.parse(first, last, context, skipper, attr))
             {
Modified: trunk/boost/spirit/home/qi/detail/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/detail/attributes.hpp	(original)
+++ trunk/boost/spirit/home/qi/detail/attributes.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -8,6 +8,7 @@
 #define SPIRIT_QI_DETAIL_ATTRIBUTES_APR_18_2010_0458PM
 
 #include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/support/attributes_fwd.hpp>
 #include <boost/spirit/home/support/attributes.hpp>
 
 ///////////////////////////////////////////////////////////////////////////////
Modified: trunk/boost/spirit/home/support/action_dispatch.hpp
==============================================================================
--- trunk/boost/spirit/home/support/action_dispatch.hpp	(original)
+++ trunk/boost/spirit/home/support/action_dispatch.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -78,7 +78,6 @@
             return true;
         }
     };
-
 }}}
 
 #endif
Modified: trunk/boost/spirit/home/support/attributes.hpp
==============================================================================
--- trunk/boost/spirit/home/support/attributes.hpp	(original)
+++ trunk/boost/spirit/home/support/attributes.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -17,8 +17,6 @@
 #include <boost/spirit/home/support/attributes_fwd.hpp>
 #include <boost/spirit/home/support/detail/hold_any.hpp>
 #include <boost/spirit/home/support/detail/as_variant.hpp>
-#include <boost/spirit/home/qi/domain.hpp>
-#include <boost/spirit/home/karma/domain.hpp>
 #include <boost/optional/optional.hpp>
 #include <boost/fusion/include/transform.hpp>
 #include <boost/fusion/include/filter_if.hpp>
Modified: trunk/boost/spirit/home/support/attributes_fwd.hpp
==============================================================================
--- trunk/boost/spirit/home/support/attributes_fwd.hpp	(original)
+++ trunk/boost/spirit/home/support/attributes_fwd.hpp	2010-04-20 10:30:19 EDT (Tue, 20 Apr 2010)
@@ -82,9 +82,21 @@
     template <typename Attribute, typename Iterator, typename Enable = void>
     struct assign_to_attribute_from_iterators;
 
+    template <typename Iterator, typename Attribute>
+    void assign_to(Iterator const& first, Iterator const& last, Attribute& attr);
+
+    template <typename Iterator>
+    void assign_to(Iterator const&, Iterator const&, unused_type);
+
     template <typename Attribute, typename T, typename Enable = void>
     struct assign_to_attribute_from_value;
 
+    template <typename T, typename Attribute>
+    void assign_to(T const& val, Attribute& attr);
+
+    template <typename T>
+    void assign_to(T const&, unused_type);
+
     ///////////////////////////////////////////////////////////////////////////
     // Karma only
     template <typename Attribute, typename Exposed, typename Enable = void>