Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r61323 - in trunk/boost/spirit/home: karma/string support
From: hartmut.kaiser_at_[hidden]
Date: 2010-04-16 14:13:37


Author: hkaiser
Date: 2010-04-16 14:13:37 EDT (Fri, 16 Apr 2010)
New Revision: 61323
URL: http://svn.boost.org/trac/boost/changeset/61323

Log:
Spirit: extended attribute handling capabilities of the karma::symbols generator
Text files modified:
   trunk/boost/spirit/home/karma/string/symbols.hpp | 49 ++++++++++++++++++++++-----------------
   trunk/boost/spirit/home/support/attributes.hpp | 12 ++++++++-
   2 files changed, 38 insertions(+), 23 deletions(-)

Modified: trunk/boost/spirit/home/karma/string/symbols.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/string/symbols.hpp (original)
+++ trunk/boost/spirit/home/karma/string/symbols.hpp 2010-04-16 14:13:37 EDT (Fri, 16 Apr 2010)
@@ -30,22 +30,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 namespace boost { namespace spirit { namespace traits
 {
- namespace detail
- {
- ///////////////////////////////////////////////////////////////////////
- // extract first and second element of a fusion sequence
- template <typename T>
- struct add_const_ref
- : add_reference<typename add_const<T>::type>
- {};
-
- template <typename T, int N>
- struct value_at_c
- : add_const_ref<typename fusion::result_of::value_at_c<T, N>::type>
- {};
- }
-
- template <typename T, typename Attribute, typename Enable = void>
+ template <typename Attribute, typename T, typename Enable = void>
     struct symbols_lookup
     {
         typedef
@@ -87,7 +72,18 @@
         }
     };
 
- template <typename T, typename Attribute, typename Enable = void>
+ template <typename Attribute>
+ struct symbols_lookup<Attribute, Attribute>
+ {
+ typedef Attribute const& type;
+
+ static type call(Attribute const& t)
+ {
+ return t;
+ }
+ };
+
+ template <typename Attribute, typename T, typename Enable = void>
     struct symbols_value
     {
         typedef
@@ -128,6 +124,17 @@
             return call(t, is_container(), is_sequence());
         }
     };
+
+ template <typename Attribute>
+ struct symbols_value<Attribute, Attribute>
+ {
+ typedef unused_type type;
+
+ static type call(Attribute const&)
+ {
+ return unused;
+ }
+ };
 }}}
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -322,13 +329,13 @@
           , Attr const& attr) const
         {
             typename Lookup::iterator it = lookup->find(
- traits::symbols_lookup<Attr, Attribute>::call(attr));
+ traits::symbols_lookup<Attribute, Attr>::call(attr));
             if (it == lookup->end())
                 return false;
 
             return karma::detail::generate_encoded<CharEncoding, Tag>::call(
                         sink, (*it).second
- , traits::symbols_value<Attr, Attribute>::call(attr)) &&
+ , traits::symbols_value<Attribute, Attr>::call(attr)) &&
                    karma::delimit_out(sink, d);
         }
 
@@ -563,13 +570,13 @@
           , Attr const& attr) const
         {
             typename Lookup::iterator it = lookup->find(
- traits::symbols_lookup<Attr, Attribute>::call(attr));
+ traits::symbols_lookup<Attribute, Attr>::call(attr));
             if (it == lookup->end())
                 return false;
 
             return karma::detail::generate_encoded<CharEncoding, Tag>::
                       call(sink
- , traits::symbols_lookup<Attr, Attribute>::call(attr)
+ , traits::symbols_lookup<Attribute, Attr>::call(attr)
                         , unused) &&
                    karma::delimit_out(sink, d);
         }

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-16 14:13:37 EDT (Fri, 16 Apr 2010)
@@ -40,6 +40,7 @@
 #include <boost/mpl/deref.hpp>
 #include <boost/mpl/distance.hpp>
 #include <boost/mpl/or.hpp>
+#include <boost/mpl/has_xxx.hpp>
 #include <boost/proto/proto_fwd.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <boost/variant.hpp>
@@ -120,7 +121,8 @@
         {};
     }
 
- template <typename Expected, typename Attribute, typename IsNotVariant = mpl::false_>
+ template <typename Expected, typename Attribute
+ , typename IsNotVariant = mpl::false_, typename Enable = void>
     struct compute_compatible_component_variant
       : mpl::or_<
             traits::detail::attribute_is_compatible<Expected, Attribute>
@@ -131,8 +133,14 @@
               , mpl::false_> >
     {};
 
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(types)
+ }
+
     template <typename Expected, typename Variant>
- struct compute_compatible_component_variant<Expected, Variant, mpl::false_>
+ struct compute_compatible_component_variant<Expected, Variant, mpl::false_
+ , typename enable_if<detail::has_types<Variant> >::type>
     {
         typedef typename traits::variant_type<Variant>::type variant_type;
         typedef typename variant_type::types types;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk