$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: eric_at_[hidden]
Date: 2007-11-30 01:39:51
Author: eric_niebler
Date: 2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
New Revision: 41486
URL: http://svn.boost.org/trac/boost/changeset/41486
Log:
handle compound sets like set['a' | alpha]
Text files modified: 
   branches/proto/v3/boost/xpressive/detail/core/matcher/charset_matcher.hpp |     4                                         
   branches/proto/v3/boost/xpressive/detail/core/peeker.hpp                  |     4                                         
   branches/proto/v3/boost/xpressive/detail/detail_fwd.hpp                   |     2                                         
   branches/proto/v3/boost/xpressive/detail/dynamic/parser.hpp               |     8 +-                                      
   branches/proto/v3/boost/xpressive/detail/static/grammar2.hpp              |    88 +++++++++++++++++++++++++++++++++++++++ 
   branches/proto/v3/boost/xpressive/proto3/transform/fold_tree.hpp          |    12 +++++                                   
   branches/proto/v3/boost/xpressive/xpressive_typeof.hpp                    |     2                                         
   7 files changed, 109 insertions(+), 11 deletions(-)
Modified: branches/proto/v3/boost/xpressive/detail/core/matcher/charset_matcher.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/detail/core/matcher/charset_matcher.hpp	(original)
+++ branches/proto/v3/boost/xpressive/detail/core/matcher/charset_matcher.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -23,13 +23,13 @@
     ///////////////////////////////////////////////////////////////////////////////
     // charset_matcher
     //
-    template<typename Traits, bool ICase, typename CharSet>
+    template<typename Traits, typename ICase, typename CharSet>
     struct charset_matcher
       : quant_style_fixed_width<1>
     {
         typedef typename Traits::char_type char_type;
         typedef Traits traits_type;
-        typedef mpl::bool_<ICase> icase_type;
+        typedef ICase icase_type;
 
         charset_matcher(CharSet const &charset = CharSet())
           : charset_(charset)
Modified: branches/proto/v3/boost/xpressive/detail/core/peeker.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/detail/core/peeker.hpp	(original)
+++ branches/proto/v3/boost/xpressive/detail/core/peeker.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -209,12 +209,12 @@
         return mpl::false_();
     }
 
-    template<bool ICase, typename Traits>
+    template<typename ICase, typename Traits>
     typename enable_if<is_narrow_char<typename Traits::char_type>, mpl::false_>::type
     accept(charset_matcher<Traits, ICase, basic_chset<Char> > const &xpr)
     {
         BOOST_ASSERT(0 != xpr.charset_.base().count());
-        this->bset_.set_charset(xpr.charset_, ICase);
+        this->bset_.set_charset(xpr.charset_, ICase::value);
         return mpl::false_();
     }
 
Modified: branches/proto/v3/boost/xpressive/detail/detail_fwd.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/detail/detail_fwd.hpp	(original)
+++ branches/proto/v3/boost/xpressive/detail/detail_fwd.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -111,7 +111,7 @@
     template<typename Traits>
     struct compound_charset;
 
-    template<typename Traits, bool ICase, typename CharSet = compound_charset<Traits> >
+    template<typename Traits, typename ICase, typename CharSet = compound_charset<Traits> >
     struct charset_matcher;
 
     template<typename Traits, typename ICase>
Modified: branches/proto/v3/boost/xpressive/detail/dynamic/parser.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/detail/dynamic/parser.hpp	(original)
+++ branches/proto/v3/boost/xpressive/detail/dynamic/parser.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -227,13 +227,13 @@
         charset_type charset(chset.base());
         if(icase)
         {
-            charset_matcher<Traits, true, charset_type> matcher(charset);
+            charset_matcher<Traits, true_, charset_type> matcher(charset);
             merge_charset(matcher.charset_, chset, traits);
             return make_dynamic<BidiIter>(matcher);
         }
         else
         {
-            charset_matcher<Traits, false, charset_type> matcher(charset);
+            charset_matcher<Traits, false_, charset_type> matcher(charset);
             merge_charset(matcher.charset_, chset, traits);
             return make_dynamic<BidiIter>(matcher);
         }
@@ -252,12 +252,12 @@
     {
         if(icase)
         {
-            charset_matcher<Traits, true> matcher(chset);
+            charset_matcher<Traits, true_> matcher(chset);
             return make_dynamic<BidiIter>(matcher);
         }
         else
         {
-            charset_matcher<Traits, false> matcher(chset);
+            charset_matcher<Traits, false_> matcher(chset);
             return make_dynamic<BidiIter>(matcher);
         }
     }
Modified: branches/proto/v3/boost/xpressive/detail/static/grammar2.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/detail/static/grammar2.hpp	(original)
+++ branches/proto/v3/boost/xpressive/detail/static/grammar2.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -371,7 +371,63 @@
             void fill(Char *&, set_initializer_type, Traits const &) const
             {}
         };
-        
+
+        template<typename T>
+        T &uncv(T const volatile &t)
+        {
+            return const_cast<T &>(t);
+        }
+
+        struct merge_charset : function_transform
+        {
+            template<typename Sig>
+            struct result;
+
+            template<typename This, typename CharSet, typename Xpr, typename Visitor>
+            struct result<This(CharSet, Xpr, Visitor)>
+            {
+                typedef CharSet type;
+            };
+
+            template<typename CharSet, typename Traits, typename ICase, typename Not, typename Visitor>
+            CharSet const &
+            operator()(CharSet const &charset, literal_matcher<Traits, ICase, Not> const &ch, Visitor &visitor) const
+            {
+                BOOST_MPL_ASSERT_NOT((Not)); // TODO fixme!
+                set_char(uncv(charset.charset_), ch.ch_, visitor.traits(), ICase());
+                return charset;
+            }
+
+            template<typename CharSet, typename Traits, typename ICase, typename Visitor>
+            CharSet const &
+            operator()(CharSet const &charset, range_matcher<Traits, ICase> const &rg, Visitor &visitor) const
+            {
+                BOOST_ASSERT(!rg.not_); // TODO fixme!
+                set_range(uncv(charset.charset_), rg.ch_min_, rg.ch_max_, visitor.traits(), ICase());
+                return charset;
+            }
+
+            template<typename CharSet, typename Traits, typename Size, typename Visitor>
+            CharSet const &
+            operator()(CharSet const &charset, set_matcher<Traits, Size> const &set_, Visitor &visitor) const
+            {
+                BOOST_ASSERT(!set_.not_); // TODO fixme!
+                for(int i=0; i < Size::value; ++i)
+                {
+                    set_char(uncv(charset.charset_), set_.set_[i], visitor.traits(), Visitor::icase_type::value);
+                }
+                return charset;
+            }
+
+            template<typename CharSet, typename Traits, typename Visitor>
+            CharSet const &
+            operator()(CharSet const &charset, posix_charset_matcher<Traits> const &posix, Visitor &visitor) const
+            {
+                set_class(uncv(charset.charset_), posix.mask_, posix.not_, visitor.traits());
+                return charset;
+            }
+        };
+
         ///////////////////////////////////////////////////////////////////////////
         // Cases
         template<typename Char, typename Gram>
@@ -516,6 +572,22 @@
                 >
             {};
 
+            struct as_set
+              : fold_tree<
+                    _
+                  , charset_matcher<
+                        traits(_visitor)
+                      , icase<_visitor>
+                      , if_<
+                            is_narrow_char<Char>()
+                          , basic_chset<Char>()
+                          , compound_charset<traits(_visitor)>()
+                        >
+                    >()
+                  , merge_charset(_state, Gram(_make_shift_right(_, end_matcher()), no_next()), _visitor)
+                >
+            {};
+
             // Here are the cases, which use the transforms defined above.
             template<typename Tag, typename Dummy = void>
             struct case_
@@ -661,6 +733,20 @@
                     >
                 >
             {};
+
+            template<typename Dummy>
+            struct case_<tag::subscript, Dummy>
+              : or_<
+                    when<
+                        subscript<terminal<set_initializer>, bitwise_or<Gram, Gram> >
+                      , as_set(_right)
+                    >
+                  , when<
+                        subscript<terminal<set_initializer>, terminal<_> >
+                      , as_matcher(_arg(_right), _visitor)
+                    >
+                >
+            {};
         };
 
     } // namespace detail
Modified: branches/proto/v3/boost/xpressive/proto3/transform/fold_tree.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto3/transform/fold_tree.hpp	(original)
+++ branches/proto/v3/boost/xpressive/proto3/transform/fold_tree.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -103,12 +103,24 @@
         typedef raw_transform type;
     };
 
+    template<typename Grammar, typename Fun>
+    struct transform_category<transform::detail::fold_tree_<Grammar, Fun> >
+    {
+        typedef raw_transform type;
+    };
+
     template<typename Sequence, typename State0, typename Fun>
     struct transform_category<transform::reverse_fold_tree<Sequence, State0, Fun> >
     {
         typedef raw_transform type;
     };
 
+    template<typename Grammar, typename Fun>
+    struct transform_category<transform::detail::reverse_fold_tree_<Grammar, Fun> >
+    {
+        typedef raw_transform type;
+    };
+
 }}
 
 #endif
Modified: branches/proto/v3/boost/xpressive/xpressive_typeof.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/xpressive_typeof.hpp	(original)
+++ branches/proto/v3/boost/xpressive/xpressive_typeof.hpp	2007-11-30 01:39:49 EST (Fri, 30 Nov 2007)
@@ -82,7 +82,7 @@
 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::assert_eol_matcher, (typename))
 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::literal_matcher, (typename)(typename)(typename))
 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::string_matcher, (typename)(bool))
-BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::charset_matcher, (typename)(bool)(typename))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::charset_matcher, (typename)(typename)(typename))
 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::logical_newline_matcher, (typename))
 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::mark_matcher, (typename)(bool))
 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::xpressive::detail::repeat_end_matcher, (typename))