$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60191 - in trunk/boost/spirit/home: qi/nonterminal support support/nonterminal
From: joel_at_[hidden]
Date: 2010-03-05 10:40:27
Author: djowel
Date: 2010-03-05 10:40:27 EST (Fri, 05 Mar 2010)
New Revision: 60191
URL: http://svn.boost.org/trac/boost/changeset/60191
Log:
rules with parameters for char encoding
Text files modified: 
   trunk/boost/spirit/home/qi/nonterminal/grammar.hpp            |    29 ++++++++++++++++-------------           
   trunk/boost/spirit/home/qi/nonterminal/rule.hpp               |    32 ++++++++++++++++++++++++--------        
   trunk/boost/spirit/home/support/common_terminals.hpp          |    20 ++++++++++++++++++++                    
   trunk/boost/spirit/home/support/nonterminal/extract_param.hpp |    12 ++++++++++++                            
   4 files changed, 72 insertions(+), 21 deletions(-)
Modified: trunk/boost/spirit/home/qi/nonterminal/grammar.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/nonterminal/grammar.hpp	(original)
+++ trunk/boost/spirit/home/qi/nonterminal/grammar.hpp	2010-03-05 10:40:27 EST (Fri, 05 Mar 2010)
@@ -27,23 +27,25 @@
       , typename T1 = unused_type
       , typename T2 = unused_type
       , typename T3 = unused_type
+      , typename T4 = unused_type
     >
     struct grammar
       : proto::extends<
             typename proto::terminal<
-                reference<rule<Iterator, T1, T2, T3> const>
+                reference<rule<Iterator, T1, T2, T3, T4> const>
             >::type
-          , grammar<Iterator, T1, T2, T3>
+          , grammar<Iterator, T1, T2, T3, T4>
         >
-      , parser<grammar<Iterator, T1, T2, T3> >
+      , parser<grammar<Iterator, T1, T2, T3, T4> >
       , noncopyable
     {
         typedef Iterator iterator_type;
-        typedef rule<Iterator, T1, T2, T3> start_type;
+        typedef rule<Iterator, T1, T2, T3, T4> start_type;
         typedef typename start_type::sig_type sig_type;
         typedef typename start_type::locals_type locals_type;
         typedef typename start_type::skipper_type skipper_type;
-        typedef grammar<Iterator, T1, T2, T3> base_type;
+        typedef typename start_type::encoding_type encoding_type;
+        typedef grammar<Iterator, T1, T2, T3, T4> base_type;
         typedef reference<start_type const> reference_;
         typedef typename proto::terminal<reference_>::type terminal;
 
@@ -56,19 +58,20 @@
         , name_(name_)
         {}
 
-        // This constructor is used to catch if the start rule is not 
-        // compatible with the grammar. 
-        template <typename Iterator_, typename T1_, typename T2_, typename T3_>
+        // This constructor is used to catch if the start rule is not
+        // compatible with the grammar.
+        template <typename Iterator_,
+            typename T1_, typename T2_, typename T3_, typename T4_>
         grammar(
-            rule<Iterator_, T1_, T2_, T3_> const&
+            rule<Iterator_, T1_, T2_, T3_, T4_> const&
           , std::string const& = "unnamed-grammar")
         {
-            // If you see the assertion below failing then the start rule 
-            // passed to the constructor of the grammar is not compatible with 
+            // If you see the assertion below failing then the start rule
+            // passed to the constructor of the grammar is not compatible with
             // the grammar (i.e. it uses different template parameters).
             BOOST_SPIRIT_ASSERT_MSG(
-                (is_same<start_type, rule<Iterator_, T1_, T2_, T3_> >::value)
-              , incompatible_start_rule, (rule<Iterator_, T1_, T2_, T3_>));
+                (is_same<start_type, rule<Iterator_, T1_, T2_, T3_, T4_> >::value)
+              , incompatible_start_rule, (rule<Iterator_, T1_, T2_, T3_, T4_>));
         }
 
         std::string name() const
Modified: trunk/boost/spirit/home/qi/nonterminal/rule.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/nonterminal/rule.hpp	(original)
+++ trunk/boost/spirit/home/qi/nonterminal/rule.hpp	2010-03-05 10:40:27 EST (Fri, 05 Mar 2010)
@@ -67,22 +67,23 @@
       , typename T1 = unused_type
       , typename T2 = unused_type
       , typename T3 = unused_type
+      , typename T4 = unused_type
     >
     struct rule
       : proto::extends<
             typename proto::terminal<
-                reference<rule<Iterator, T1, T2, T3> const>
+                reference<rule<Iterator, T1, T2, T3, T4> const>
             >::type
-          , rule<Iterator, T1, T2, T3>
+          , rule<Iterator, T1, T2, T3, T4>
         >
-      , parser<rule<Iterator, T1, T2, T3> >
+      , parser<rule<Iterator, T1, T2, T3, T4> >
     {
         typedef Iterator iterator_type;
-        typedef rule<Iterator, T1, T2, T3> this_type;
+        typedef rule<Iterator, T1, T2, T3, T4> this_type;
         typedef reference<this_type const> reference_;
         typedef typename proto::terminal<reference_>::type terminal;
         typedef proto::extends<terminal, this_type> base_type;
-        typedef mpl::vector<T1, T2, T3> template_params;
+        typedef mpl::vector<T1, T2, T3, T4> template_params;
 
         // locals_type is a sequence of types to be used as local variables
         typedef typename
@@ -99,6 +100,10 @@
             spirit::detail::extract_sig<template_params>::type
         sig_type;
 
+        typedef typename
+            spirit::detail::extract_encoding<template_params>::type
+        encoding_type;
+
         // This is the rule's attribute type
         typedef typename
             spirit::detail::attr_from_sig<sig_type>::type
@@ -125,6 +130,14 @@
             )>
         function_type;
 
+        typedef typename
+            mpl::if_<
+                is_same<encoding_type, unused_type>
+              , unused_type
+              , tag::char_code<tag::encoding, encoding_type>
+            >::type
+        encoding_modifier_type;
+
         explicit rule(std::string const& name_ = "unnamed-rule")
           : base_type(terminal::make(reference_(*this)))
           , name_(name_)
@@ -148,7 +161,8 @@
             // then the expression (expr) is not a valid spirit qi expression.
             BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
 
-            f = detail::bind_parser<mpl::false_>(compile<qi::domain>(expr));
+            f = detail::bind_parser<mpl::false_>(
+                compile<qi::domain>(expr, encoding_modifier_type()));
         }
 
         rule& operator=(rule const& rhs)
@@ -182,7 +196,8 @@
             // then the expression (expr) is not a valid spirit qi expression.
             BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
 
-            f = detail::bind_parser<mpl::false_>(compile<qi::domain>(expr));
+            f = detail::bind_parser<mpl::false_>(
+                compile<qi::domain>(expr, encoding_modifier_type()));
             return *this;
         }
 
@@ -195,7 +210,8 @@
             // then the expression (expr) is not a valid spirit qi expression.
             BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
 
-            r.f = detail::bind_parser<mpl::true_>(compile<qi::domain>(expr));
+            r.f = detail::bind_parser<mpl::true_>(
+                compile<qi::domain>(expr, encoding_modifier_type()));
             return r;
         }
 
Modified: trunk/boost/spirit/home/support/common_terminals.hpp
==============================================================================
--- trunk/boost/spirit/home/support/common_terminals.hpp	(original)
+++ trunk/boost/spirit/home/support/common_terminals.hpp	2010-03-05 10:40:27 EST (Fri, 05 Mar 2010)
@@ -39,6 +39,26 @@
         >
     char_encodings;
 
+    template <typename T>
+    struct is_char_encoding : mpl::false_ {};
+
+    template <>
+    struct is_char_encoding<spirit::char_encoding::ascii> : mpl::true_ {};
+
+    template <>
+    struct is_char_encoding<spirit::char_encoding::iso8859_1> : mpl::true_ {};
+
+    template <>
+    struct is_char_encoding<spirit::char_encoding::standard> : mpl::true_ {};
+
+    template <>
+    struct is_char_encoding<spirit::char_encoding::standard_wide> : mpl::true_ {};
+
+#if defined(BOOST_SPIRIT_UNICODE)
+    template <>
+    struct is_char_encoding<spirit::char_encoding::unicode> : mpl::true_ {};
+#endif
+
     // Our basic terminals
     BOOST_SPIRIT_DEFINE_TERMINALS(
         ( verbatim )
Modified: trunk/boost/spirit/home/support/nonterminal/extract_param.hpp
==============================================================================
--- trunk/boost/spirit/home/support/nonterminal/extract_param.hpp	(original)
+++ trunk/boost/spirit/home/support/nonterminal/extract_param.hpp	2010-03-05 10:40:27 EST (Fri, 05 Mar 2010)
@@ -16,6 +16,7 @@
 #include <boost/spirit/home/support/meta_compiler.hpp>
 #include <boost/spirit/home/support/nonterminal/locals.hpp>
 #include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
 
 #include <boost/function_types/is_function.hpp>
 #include <boost/function_types/parameter_types.hpp>
@@ -107,6 +108,17 @@
 
         typedef typename fusion::result_of::as_list<params>::type type;
     };
+
+
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Types>
+    struct extract_encoding
+      : extract_param<
+            Types
+          , is_char_encoding<mpl::_>
+          , unused_type
+        >
+    {};
 }}}
 
 #endif