$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60256 - in trunk/boost/spirit/home: karma karma/auto karma/char karma/directive karma/nonterminal karma/string support/nonterminal
From: hartmut.kaiser_at_[hidden]
Date: 2010-03-06 16:58:10
Author: hkaiser
Date: 2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
New Revision: 60256
URL: http://svn.boost.org/trac/boost/changeset/60256
Log:
Spirit: implemented new encoding features for Karma
Added:
   trunk/boost/spirit/home/karma/directive/encoding.hpp   (contents, props changed)
Text files modified: 
   trunk/boost/spirit/home/karma/auto/meta_create.hpp            |    40 ++++++++++++++++++++--------------------
   trunk/boost/spirit/home/karma/char/char.hpp                   |    24 ++++++++++++------------                
   trunk/boost/spirit/home/karma/char/char_class.hpp             |     8 ++++++++                                
   trunk/boost/spirit/home/karma/directive.hpp                   |     2 ++                                      
   trunk/boost/spirit/home/karma/nonterminal/grammar.hpp         |    21 ++++++++++++---------                   
   trunk/boost/spirit/home/karma/nonterminal/rule.hpp            |    34 ++++++++++++++++++++++++++--------      
   trunk/boost/spirit/home/karma/string/lit.hpp                  |     8 ++++----                                
   trunk/boost/spirit/home/support/nonterminal/extract_param.hpp |     1 -                                       
   8 files changed, 84 insertions(+), 54 deletions(-)
Modified: trunk/boost/spirit/home/karma/auto/meta_create.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/auto/meta_create.hpp	(original)
+++ trunk/boost/spirit/home/karma/auto/meta_create.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -51,57 +51,57 @@
     template <typename String> 
     struct meta_create_string 
     {
-        typedef spirit::standard::string_type type; 
-        static type const& call() { return spirit::standard::string; }
+        typedef spirit::default_encoding::string_type type; 
+        static type const& call() { return spirit::default_encoding::string; }
     };
 
     template <> 
     struct meta_create_string<wchar_t*>
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     template <> 
     struct meta_create_string<wchar_t const*>
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     template <int N> 
     struct meta_create_string<wchar_t[N]>
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     template <int N> 
     struct meta_create_string<wchar_t const[N]>
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     template <int N> 
     struct meta_create_string<wchar_t(&)[N]>
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     template <int N> 
     struct meta_create_string<wchar_t const(&)[N]>
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     template <typename Traits, typename Allocator> 
     struct meta_create_string<std::basic_string<wchar_t, Traits, Allocator> >
     {
-        typedef spirit::standard_wide::string_type type; 
-        static type const& call() { return spirit::standard_wide::string; }
+        typedef spirit::default_wide_encoding::string_type type; 
+        static type const& call() { return spirit::default_wide_encoding::string; }
     };
 
     ///////////////////////////////////////////////////////////////////////////
@@ -203,14 +203,14 @@
     template <> 
     struct meta_create<char> 
     { 
-        typedef spirit::standard::char_type type; 
-        static type const& call() { return spirit::standard::char_; }
+        typedef spirit::default_encoding::char_type type;
+        static type const& call() { return spirit::default_encoding::char_; }
     };
     template <> 
     struct meta_create<wchar_t> 
     { 
-        typedef spirit::standard_wide::char_type type; 
-        static type const& call() { return spirit::standard_wide::char_; }
+        typedef spirit::default_wide_encoding::char_type type;
+        static type const& call() { return spirit::default_wide_encoding::char_; }
     };
 
     // boolean generator
Modified: trunk/boost/spirit/home/karma/char/char.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/char/char.hpp	(original)
+++ trunk/boost/spirit/home/karma/char/char.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -354,29 +354,29 @@
     // literals: 'x', "x"
     template <typename Modifiers>
     struct make_primitive<char, Modifiers>
-      : detail::basic_literal<Modifiers, char_encoding::standard> {};
+      : detail::basic_literal<Modifiers, char_encoding::default_encoding> {};
 
     template <typename Modifiers>
     struct make_primitive<char const(&)[2], Modifiers>
-      : detail::basic_literal<Modifiers, char_encoding::standard> {};
+      : detail::basic_literal<Modifiers, char_encoding::default_encoding> {};
 
     // literals: L'x', L"x"
     template <typename Modifiers>
     struct make_primitive<wchar_t, Modifiers>
-      : detail::basic_literal<Modifiers, char_encoding::standard_wide> {};
+      : detail::basic_literal<Modifiers, char_encoding::default_wide_encoding> {};
 
     template <typename Modifiers>
     struct make_primitive<wchar_t const(&)[2], Modifiers>
-      : detail::basic_literal<Modifiers, char_encoding::standard_wide> {};
+      : detail::basic_literal<Modifiers, char_encoding::default_wide_encoding> {};
 
     // char_
     template <typename CharEncoding, typename Modifiers>
     struct make_primitive<tag::char_code<tag::char_, CharEncoding>, Modifiers>
     {
         static bool const lower =
-            has_modifier<Modifiers, tag::char_code<tag::lower, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
         static bool const upper =
-            has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
         typedef any_char<
             typename spirit::detail::get_encoding_with_case<
@@ -400,9 +400,9 @@
       , Modifiers>
     {
         static bool const lower =
-            has_modifier<Modifiers, tag::char_code<tag::lower, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
         static bool const upper =
-            has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
         typedef typename spirit::detail::get_encoding_with_case<
             Modifiers, CharEncoding, lower || upper>::type encoding;
@@ -432,9 +432,9 @@
       , Modifiers>
     {
         static bool const lower =
-            has_modifier<Modifiers, tag::char_code<tag::lower, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
         static bool const upper =
-            has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
         typedef literal_char<
             typename spirit::detail::get_encoding_with_case<
@@ -460,9 +460,9 @@
       , Modifiers>
     {
         static bool const lower =
-            has_modifier<Modifiers, tag::char_code<tag::lower, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
         static bool const upper =
-            has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
         typedef char_range<
             typename spirit::detail::get_encoding_with_case<
Modified: trunk/boost/spirit/home/karma/char/char_class.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/char/char_class.hpp	(original)
+++ trunk/boost/spirit/home/karma/char/char_class.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -42,16 +42,24 @@
 {
     // hoist the char classification namespaces into karma sub-namespaces of 
     // the same name
+    namespace default_encoding { using namespace boost::spirit::default_encoding; }
+    namespace default_wide_encoding { using namespace boost::spirit::default_wide_encoding; }
     namespace ascii { using namespace boost::spirit::ascii; }
     namespace iso8859_1 { using namespace boost::spirit::iso8859_1; }
     namespace standard { using namespace boost::spirit::standard; }
     namespace standard_wide { using namespace boost::spirit::standard_wide; }
+#if defined(BOOST_SPIRIT_UNICODE)
+    namespace unicode { using namespace boost::spirit::unicode; }
+#endif
 
     // Import the standard namespace into the karma namespace. This allows 
     // for default handling of all character/string related operations if not 
     // prefixed with a character set namespace.
     using namespace boost::spirit::standard;
 
+    // Import encoding
+    using spirit::encoding;
+
     ///////////////////////////////////////////////////////////////////////////
     //
     //  char_class
Modified: trunk/boost/spirit/home/karma/directive.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/directive.hpp	(original)
+++ trunk/boost/spirit/home/karma/directive.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -10,6 +10,8 @@
 #pragma once
 #endif
 
+#include <boost/spirit/home/karma/directive/encoding.hpp>
+
 ///////////////////////////////////////////////////////////////////////////////
 //  directives related to alignment 
 //  left_align[...], right_align[...], center[...]
Added: trunk/boost/spirit/home/karma/directive/encoding.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/karma/directive/encoding.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -0,0 +1,35 @@
+//  Copyright (c) 2001-2010 Joel de Guzman
+//  Copyright (c) 2001-2010 Hartmut Kaiser
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(SPIRIT_KARMA_ENCODING_MARCH_05_2010_0550PM)
+#define SPIRIT_KARMA_ENCODING_MARCH_05_2010_0550PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Enablers
+    ///////////////////////////////////////////////////////////////////////////
+
+    // enables encoding
+    template <typename CharEncoding>
+    struct use_directive<
+            karma::domain, tag::char_code<tag::encoding, CharEncoding> > 
+      : mpl::true_ {};
+
+    template <typename CharEncoding>
+    struct is_modifier_directive<
+            karma::domain, tag::char_code<tag::encoding, CharEncoding> >
+      : mpl::true_ {};
+}}
+
+#endif
Modified: trunk/boost/spirit/home/karma/nonterminal/grammar.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/nonterminal/grammar.hpp	(original)
+++ trunk/boost/spirit/home/karma/nonterminal/grammar.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -27,24 +27,26 @@
       , 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<OutputIterator, T1, T2, T3> const>
+                reference<rule<OutputIterator, T1, T2, T3, T4> const>
             >::type
-          , grammar<OutputIterator, T1, T2, T3>
+          , grammar<OutputIterator, T1, T2, T3, T4>
         >
-      , generator<grammar<OutputIterator, T1, T2, T3> >
+      , generator<grammar<OutputIterator, T1, T2, T3, T4> >
       , noncopyable
     {
         typedef OutputIterator iterator_type;
-        typedef rule<OutputIterator, T1, T2, T3> start_type;
+        typedef rule<OutputIterator, T1, T2, T3, T4> start_type;
         typedef typename start_type::properties properties;
         typedef typename start_type::sig_type sig_type;
         typedef typename start_type::locals_type locals_type;
         typedef typename start_type::delimiter_type delimiter_type;
-        typedef grammar<OutputIterator, T1, T2, T3> base_type;
+        typedef typename start_type::encoding_type encoding_type;
+        typedef grammar<OutputIterator, T1, T2, T3, T4> base_type;
         typedef reference<start_type const> reference_;
         typedef typename proto::terminal<reference_>::type terminal;
 
@@ -62,16 +64,17 @@
 
         // 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_>
-        grammar(rule<Iterator_, T1_, T2_, T3_> const&
+        template <typename Iterator_, typename T1_, typename T2_, typename T3_,
+            typename T4_>
+        grammar(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 
             // 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/karma/nonterminal/rule.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/nonterminal/rule.hpp	(original)
+++ trunk/boost/spirit/home/karma/nonterminal/rule.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -68,24 +68,25 @@
       , 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<OutputIterator, T1, T2, T3> const>
+                reference<rule<OutputIterator, T1, T2, T3, T4> const>
             >::type
-          , rule<OutputIterator, T1, T2, T3>
+          , rule<OutputIterator, T1, T2, T3, T4>
         >
-      , generator<rule<OutputIterator, T1, T2, T3> >
+      , generator<rule<OutputIterator, T1, T2, T3, T4> >
     {
         typedef mpl::int_<generator_properties::all_properties> properties;
 
         typedef OutputIterator iterator_type;
-        typedef rule<OutputIterator, T1, T2, T3> this_type;
+        typedef rule<OutputIterator, 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;
 
         // the output iterator is always wrapped by karma
         typedef detail::output_iterator<OutputIterator, properties> 
@@ -102,10 +103,16 @@
                 karma::domain, template_params>::type
         delimiter_type;
 
+        // The rule's signature
         typedef typename
             spirit::detail::extract_sig<template_params>::type
         sig_type;
 
+        // The rule's encoding 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
@@ -133,6 +140,14 @@
             bool(output_iterator&, context_type&, delimiter_type const&)>
         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_)
@@ -156,7 +171,8 @@
             // the expression (expr) is not a valid spirit karma expression.
             BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
 
-            f = detail::bind_generator<mpl::false_>(compile<karma::domain>(expr));
+            f = detail::bind_generator<mpl::false_>(
+                compile<karma::domain>(expr, encoding_modifier_type()));
         }
 
         rule& operator=(rule const& rhs)
@@ -190,7 +206,8 @@
             // the expression (expr) is not a valid spirit karma expression.
             BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
 
-            f = detail::bind_generator<mpl::false_>(compile<karma::domain>(expr));
+            f = detail::bind_generator<mpl::false_>(
+                compile<karma::domain>(expr, encoding_modifier_type()));
             return *this;
         }
 
@@ -203,7 +220,8 @@
             // the expression (expr) is not a valid spirit karma expression.
             BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
 
-            r.f = detail::bind_generator<mpl::true_>(compile<karma::domain>(expr));
+            r.f = detail::bind_generator<mpl::true_>(
+                compile<karma::domain>(expr, encoding_modifier_type()));
             return r;
         }
 
Modified: trunk/boost/spirit/home/karma/string/lit.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/string/lit.hpp	(original)
+++ trunk/boost/spirit/home/karma/string/lit.hpp	2010-03-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -197,9 +197,9 @@
       , Modifiers>
     {
         static bool const lower = 
-            has_modifier<Modifiers, tag::char_code<tag::lower, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
         static bool const upper = 
-            has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
         typedef any_string<
             typename spirit::detail::get_encoding_with_case<
@@ -248,9 +248,9 @@
       , Modifiers>
     {
         static bool const lower = 
-            has_modifier<Modifiers, tag::char_code<tag::lower, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
         static bool const upper = 
-            has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
         typedef typename add_const<A0>::type const_string;
         typedef literal_string<
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-06 16:58:09 EST (Sat, 06 Mar 2010)
@@ -109,7 +109,6 @@
         typedef typename fusion::result_of::as_list<params>::type type;
     };
 
-
     ///////////////////////////////////////////////////////////////////////////
     template <typename Types>
     struct extract_encoding