$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: joel_at_[hidden]
Date: 2008-04-18 22:13:58
Author: djowel
Date: 2008-04-18 22:13:57 EDT (Fri, 18 Apr 2008)
New Revision: 44569
URL: http://svn.boost.org/trac/boost/changeset/44569
Log:
no-case for chsets
Text files modified: 
   trunk/boost/spirit/home/qi/char/char.hpp         |    46 +++++++++++++++++++++++++++++++         
   trunk/boost/spirit/home/qi/char/meta_grammar.hpp |    59 +++++++++++++++++++++++---------------- 
   trunk/boost/spirit/home/support/component.hpp    |    10 +++---                                  
   3 files changed, 85 insertions(+), 30 deletions(-)
Modified: trunk/boost/spirit/home/qi/char/char.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/char/char.hpp	(original)
+++ trunk/boost/spirit/home/qi/char/char.hpp	2008-04-18 22:13:57 EDT (Fri, 18 Apr 2008)
@@ -17,6 +17,7 @@
 #include <boost/spirit/home/support/detail/to_narrow.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <boost/type_traits/remove_reference.hpp>
+#include <boost/foreach.hpp>
 
 namespace boost { namespace spirit { namespace qi
 {
@@ -253,11 +254,56 @@
             return result;
         }
     };
+
+    template <typename Char, typename Elements>
+    struct char_set_component;
 }}}
 
 namespace boost { namespace spirit { namespace traits
 {
     ///////////////////////////////////////////////////////////////////////////
+    // char_set_component generator
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Char, typename Elements, typename Modifier>
+    struct make_component<qi::domain, qi::char_set<Char>, Elements, Modifier
+      , typename disable_if<
+            is_member_of_modifier<Modifier, spirit::char_class::no_case_base_tag>
+        >::type
+    > : mpl::identity<qi::char_set_component<Char, Elements> >
+    {
+        static qi::char_set_component<Char, Elements>
+        call(Elements const& elements)
+        {
+            return qi::char_set_component<Char, Elements>(
+                fusion::at_c<0>(elements));
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // no_case char_set_component generator
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        typename Domain, typename Elements, typename Modifier, typename Char
+    >
+    struct make_modified_component<
+        Domain, qi::char_set<Char>, Elements, Modifier
+      , typename enable_if<
+            is_member_of_modifier<Modifier, spirit::char_class::no_case_base_tag>
+        >::type
+    >
+    {
+        typedef qi::char_set_component<Char, Elements> type;
+        typedef typename Modifier::char_set char_set;
+
+        static type
+        call(Elements const& elements)
+        {
+            return qi::char_set_component<Char, Elements>(
+                fusion::at_c<0>(elements), char_set());
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
     // no_case_literal_char generator
     ///////////////////////////////////////////////////////////////////////////
     template <
Modified: trunk/boost/spirit/home/qi/char/meta_grammar.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/char/meta_grammar.hpp	(original)
+++ trunk/boost/spirit/home/qi/char/meta_grammar.hpp	2008-04-18 22:13:57 EDT (Fri, 18 Apr 2008)
@@ -18,30 +18,6 @@
 
 namespace boost { namespace spirit { namespace qi
 {
-    template <typename Char>
-    struct char_set;
-
-    template <typename Char, typename Elements>
-    struct char_set_component;
-}}}
-
-namespace boost { namespace spirit { namespace traits
-{
-    template <typename Char, typename Elements, typename Modifier>
-    struct make_component<qi::domain, qi::char_set<Char>, Elements, Modifier>
-      : mpl::identity<qi::char_set_component<Char, Elements> >
-    {
-        static qi::char_set_component<Char, Elements>
-        call(Elements const& elements)
-        {
-            return qi::char_set_component<Char, Elements>(
-                fusion::at_c<0>(elements));
-        }
-    };
-}}}
-
-namespace boost { namespace spirit { namespace qi
-{
     ///////////////////////////////////////////////////////////////////////////
     // forwards
     ///////////////////////////////////////////////////////////////////////////
@@ -66,7 +42,7 @@
 
     struct eol_director;
     struct eoi_director;
-    
+
     ///////////////////////////////////////////////////////////////////////////
     struct char_meta_grammar;
 
@@ -243,6 +219,39 @@
             }
         }
 
+        template <typename CharSetClass> // no-case version
+        char_set_component(Char const* definition, CharSetClass)
+          : ptr(new detail::basic_chset<Char>())
+        {
+            Char ch = *definition++;
+            while (ch)
+            {
+                Char next = *definition++;
+                if (next == '-')
+                {
+                    next = *definition++;
+                    if (next == 0)
+                    {
+                        ptr->set(CharSetClass::tolower(ch));
+                        ptr->set(CharSetClass::tolower('-'));
+                        ptr->set(CharSetClass::toupper(ch));
+                        ptr->set(CharSetClass::toupper('-'));
+                        break;
+                    }
+                    ptr->set(CharSetClass::tolower(ch)
+                      , CharSetClass::tolower(next));
+                    ptr->set(CharSetClass::toupper(ch)
+                      , CharSetClass::toupper(next));
+                }
+                else
+                {
+                    ptr->set(CharSetClass::tolower(ch));
+                    ptr->set(CharSetClass::toupper(ch));
+                }
+                ch = next;
+            }
+        }
+
         boost::shared_ptr<detail::basic_chset<Char> > ptr;
     };
 
Modified: trunk/boost/spirit/home/support/component.hpp
==============================================================================
--- trunk/boost/spirit/home/support/component.hpp	(original)
+++ trunk/boost/spirit/home/support/component.hpp	2008-04-18 22:13:57 EDT (Fri, 18 Apr 2008)
@@ -191,7 +191,7 @@
     namespace result_of
     {
         template <
-            typename Domain, typename Expr, typename State = unused_type, 
+            typename Domain, typename Expr, typename State = unused_type,
             typename Visitor = unused_type
         >
         struct as_component
@@ -208,7 +208,7 @@
 
         // special case for arrays
         template <
-            typename Domain, typename T, int N, 
+            typename Domain, typename T, int N,
             typename State, typename Visitor>
         struct as_component<Domain, T[N], State, Visitor>
         {
@@ -243,8 +243,8 @@
     inline typename result_of::as_component<Domain, Expr>::type
     as_component(Domain, Expr const& xpr, State const& state, Visitor& visitor)
     {
-        typedef typename 
-            result_of::as_component<Domain, Expr, State, Visitor>::grammar 
+        typedef typename
+            result_of::as_component<Domain, Expr, State, Visitor>::grammar
         grammar;
         return grammar()(proto::as_expr(xpr), state, visitor);
     };
@@ -271,7 +271,7 @@
     {
         template <
             typename Domain, typename Director
-          , typename Elements, typename Modifier>
+          , typename Elements, typename Modifier, typename Enable = void>
         struct make_component
           : mpl::identity<component<Domain, Director, Elements> >
         {