Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r60185 - in trunk/boost/spirit/home: karma/char karma/numeric karma/stream karma/string qi qi/auto qi/char qi/directive qi/string support support/char_encoding support/detail
From: joel_at_[hidden]
Date: 2010-03-05 08:31:17


Author: djowel
Date: 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
New Revision: 60185
URL: http://svn.boost.org/trac/boost/changeset/60185

Log:
encoding directive
Added:
   trunk/boost/spirit/home/qi/directive/encoding.hpp (contents, props changed)
   trunk/boost/spirit/home/support/char_encoding/default_encoding.hpp
      - copied, changed from r60164, /trunk/boost/spirit/home/support/char_encoding/default.hpp
   trunk/boost/spirit/home/support/char_encoding/default_wide_encoding.hpp
      - copied, changed from r60178, /trunk/boost/spirit/home/support/char_encoding/default_wide.hpp
Removed:
   trunk/boost/spirit/home/support/char_encoding/default.hpp
   trunk/boost/spirit/home/support/char_encoding/default_wide.hpp
Text files modified:
   trunk/boost/spirit/home/karma/char/char.hpp | 10 +++---
   trunk/boost/spirit/home/karma/char/char_class.hpp | 2
   trunk/boost/spirit/home/karma/numeric/bool.hpp | 8 ++--
   trunk/boost/spirit/home/karma/numeric/int.hpp | 6 ++--
   trunk/boost/spirit/home/karma/numeric/real.hpp | 6 ++--
   trunk/boost/spirit/home/karma/numeric/uint.hpp | 6 ++--
   trunk/boost/spirit/home/karma/stream/stream.hpp | 4 +-
   trunk/boost/spirit/home/karma/string/lit.hpp | 6 ++--
   trunk/boost/spirit/home/karma/string/symbols.hpp | 2
   trunk/boost/spirit/home/qi/auto/meta_create.hpp | 8 ++--
   trunk/boost/spirit/home/qi/char/char.hpp | 51 +++++++++++++++++++--------------
   trunk/boost/spirit/home/qi/char/char_class.hpp | 17 +++++++++--
   trunk/boost/spirit/home/qi/directive.hpp | 1
   trunk/boost/spirit/home/qi/string/lit.hpp | 4 ++
   trunk/boost/spirit/home/qi/string/symbols.hpp | 4 +-
   trunk/boost/spirit/home/support/char_class.hpp | 11 +++++--
   trunk/boost/spirit/home/support/char_encoding/default_encoding.hpp | 8 ++--
   trunk/boost/spirit/home/support/char_encoding/default_wide_encoding.hpp | 8 ++--
   trunk/boost/spirit/home/support/common_terminals.hpp | 21 +++++++++++--
   trunk/boost/spirit/home/support/detail/get_encoding.hpp | 60 ++++++++++++++++++++++++++++++++++++----
   20 files changed, 165 insertions(+), 78 deletions(-)

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-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -331,7 +331,7 @@
                 has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
 
             typedef literal_char<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                     Modifiers, Encoding, lower || upper>::type
               , typename get_casetag<Modifiers, lower || upper>::type
               , true>
@@ -379,7 +379,7 @@
             has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
 
         typedef any_char<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                 Modifiers, CharEncoding, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;
@@ -404,7 +404,7 @@
         static bool const upper =
             has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
 
- typedef typename spirit::detail::get_encoding<
+ typedef typename spirit::detail::get_encoding_with_case<
             Modifiers, CharEncoding, lower || upper>::type encoding;
         typedef typename detail::get_casetag<
             Modifiers, lower || upper>::type tag;
@@ -437,7 +437,7 @@
             has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
 
         typedef literal_char<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                 Modifiers, CharEncoding, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
           , false
@@ -465,7 +465,7 @@
             has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
 
         typedef char_range<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                 Modifiers, CharEncoding, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;

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-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -192,7 +192,7 @@
 
         typedef char_class<
             tag_type
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                 Modifiers, CharEncoding, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;

Modified: trunk/boost/spirit/home/karma/numeric/bool.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/numeric/bool.hpp (original)
+++ trunk/boost/spirit/home/karma/numeric/bool.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -246,7 +246,7 @@
 
             typedef any_bool_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , Policies
@@ -271,7 +271,7 @@
 
             typedef literal_bool_generator<
                 bool
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , bool_policies<>, false
@@ -316,7 +316,7 @@
 
             typedef literal_bool_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , Policies, false
@@ -359,7 +359,7 @@
 
             typedef literal_bool_generator<
                 bool
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , bool_policies<>, true

Modified: trunk/boost/spirit/home/karma/numeric/int.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/numeric/int.hpp (original)
+++ trunk/boost/spirit/home/karma/numeric/int.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -329,7 +329,7 @@
 
             typedef any_int_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , Radix
@@ -380,7 +380,7 @@
 
             typedef literal_int_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , Radix, force_sign, false
@@ -437,7 +437,7 @@
 
             typedef literal_int_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , 10, false, true

Modified: trunk/boost/spirit/home/karma/numeric/real.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/numeric/real.hpp (original)
+++ trunk/boost/spirit/home/karma/numeric/real.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -279,7 +279,7 @@
 
             typedef any_real_generator<
                 T, Policies
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;
@@ -326,7 +326,7 @@
 
             typedef literal_real_generator<
                 T, Policies
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , false
@@ -379,7 +379,7 @@
 
             typedef literal_real_generator<
                 T, real_policies<T>
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , true

Modified: trunk/boost/spirit/home/karma/numeric/uint.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/numeric/uint.hpp (original)
+++ trunk/boost/spirit/home/karma/numeric/uint.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -353,7 +353,7 @@
 
             typedef any_uint_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , Radix
@@ -414,7 +414,7 @@
 
             typedef literal_uint_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , Radix, false
@@ -483,7 +483,7 @@
 
             typedef literal_uint_generator<
                 T
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type
               , 10, true

Modified: trunk/boost/spirit/home/karma/stream/stream.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/stream/stream.hpp (original)
+++ trunk/boost/spirit/home/karma/stream/stream.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -283,7 +283,7 @@
 
         typedef any_stream_generator<
             Char
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                 Modifiers, unused_type, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;
@@ -322,7 +322,7 @@
         typedef typename add_const<A0>::type const_attribute;
         typedef lit_stream_generator<
             const_attribute, Char
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                 Modifiers, unused_type, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;

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-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -202,7 +202,7 @@
             has_modifier<Modifiers, tag::char_code<tag::upper, CharEncoding> >::value;
 
         typedef any_string<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                 Modifiers, CharEncoding, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
> result_type;
@@ -227,7 +227,7 @@
         typedef typename add_const<T>::type const_string;
         typedef literal_string<
             const_string
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                 Modifiers, unused_type, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
           , true
@@ -255,7 +255,7 @@
         typedef typename add_const<A0>::type const_string;
         typedef literal_string<
             const_string
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                 Modifiers, unused_type, lower || upper>::type
           , typename detail::get_casetag<Modifiers, lower || upper>::type
           , false

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-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -534,7 +534,7 @@
             lower || upper
           , symbols<
                 Attribute, T, Lookup
- , typename spirit::detail::get_encoding<
+ , typename spirit::detail::get_encoding_with_case<
                     Modifiers, unused_type, lower || upper>::type
               , typename detail::get_casetag<Modifiers, lower || upper>::type>
           , reference_>::type

Modified: trunk/boost/spirit/home/qi/auto/meta_create.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/auto/meta_create.hpp (original)
+++ trunk/boost/spirit/home/qi/auto/meta_create.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -135,14 +135,14 @@
     template <>
     struct meta_create<char>
     {
- typedef spirit::default_::char_type type;
- static type const& call() { return spirit::default_::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::default_wide::char_type type;
- static type const& call() { return spirit::default_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/qi/char/char.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/char/char.hpp (original)
+++ trunk/boost/spirit/home/qi/char/char.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -392,7 +392,7 @@
>::value;
 
             typedef literal_char<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                     Modifiers, Encoding, no_case>::type
               , no_attr
               , no_case>
@@ -414,25 +414,29 @@
 
     template <typename Modifiers>
     struct make_primitive<char, Modifiers>
- : detail::basic_literal<Modifiers, char_encoding::default_> {};
+ : detail::basic_literal<Modifiers, char_encoding::default_encoding> {};
 
     template <typename Modifiers>
     struct make_primitive<char const(&)[2], Modifiers>
- : detail::basic_literal<Modifiers, char_encoding::default_> {};
+ : detail::basic_literal<Modifiers, char_encoding::default_encoding> {};
 
     template <typename Modifiers>
     struct make_primitive<wchar_t, Modifiers>
- : detail::basic_literal<Modifiers, char_encoding::default_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::default_wide> {};
+ : detail::basic_literal<Modifiers, char_encoding::default_wide_encoding> {};
 
     template <typename CharEncoding, typename Modifiers>
     struct make_primitive<
         terminal<tag::char_code<tag::char_, CharEncoding> >, Modifiers>
     {
- typedef tag::char_code<tag::char_, CharEncoding> tag;
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef tag::char_code<tag::char_, char_encoding> tag;
         typedef char_class<tag> result_type;
         result_type operator()(unused_type, unused_type) const
         {
@@ -449,16 +453,17 @@
       , Modifiers>
     {
         static bool const no_case =
- has_modifier<
- Modifiers
- , tag::char_code<tag::no_case, CharEncoding>
- >::value;
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
 
         typedef typename
             mpl::if_<
                 traits::is_string<A0>
- , char_set<CharEncoding, no_case>
- , literal_char<CharEncoding, false, no_case>
+ , char_set<char_encoding, no_case>
+ , literal_char<char_encoding, false, no_case>
>::type
         result_type;
 
@@ -478,12 +483,13 @@
       , Modifiers>
     {
         static bool const no_case =
- has_modifier<
- Modifiers
- , tag::char_code<tag::no_case, CharEncoding>
- >::value;
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
 
- typedef literal_char<CharEncoding, false, no_case> result_type;
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
+ typedef literal_char<char_encoding, false, no_case> result_type;
 
         template <typename Terminal>
         result_type operator()(Terminal const& term, unused_type) const
@@ -501,12 +507,13 @@
       , Modifiers>
     {
         static bool const no_case =
- has_modifier<
- Modifiers
- , tag::char_code<tag::no_case, CharEncoding>
- >::value;
+ has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
+
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
 
- typedef char_range<CharEncoding, no_case> result_type;
+ typedef char_range<char_encoding, no_case> result_type;
 
         template <typename Terminal>
         result_type operator()(Terminal const& term, unused_type) const

Modified: trunk/boost/spirit/home/qi/char/char_class.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/char/char_class.hpp (original)
+++ trunk/boost/spirit/home/qi/char/char_class.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -17,6 +17,8 @@
 #include <boost/spirit/home/support/common_terminals.hpp>
 #include <boost/spirit/home/support/info.hpp>
 #include <boost/spirit/home/support/modify.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/mpl/eval_if.hpp>
 
 namespace boost { namespace spirit
 {
@@ -33,15 +35,20 @@
 {
     // hoist the char classification namespaces into qi 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 default_ namespace into the qi namespace. This allows
+ // Import the default_encoding namespace into the qi namespace. This allows
     // for default handling of all character/string related operations if not
     // prefixed with a character set namespace.
- using namespace boost::spirit::default_;
+ using namespace boost::spirit::default_encoding;
 
     ///////////////////////////////////////////////////////////////////////////
     // Generic char classification parser (for alnum, alpha, graph, etc.)
@@ -90,9 +97,13 @@
         static bool const no_case =
             has_modifier<Modifiers, tag::char_code_base<tag::no_case> >::value;
 
+ typedef typename
+ spirit::detail::get_encoding<Modifiers, CharEncoding>::type
+ char_encoding;
+
         typedef tag::char_code<
             typename detail::make_char_class<CharClass, no_case>::type
- , CharEncoding>
+ , char_encoding>
         tag;
 
         typedef char_class<tag> result_type;

Modified: trunk/boost/spirit/home/qi/directive.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/directive.hpp (original)
+++ trunk/boost/spirit/home/qi/directive.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -11,6 +11,7 @@
 #pragma once
 #endif
 
+#include <boost/spirit/home/qi/directive/encoding.hpp>
 #include <boost/spirit/home/qi/directive/hold.hpp>
 #include <boost/spirit/home/qi/directive/lexeme.hpp>
 #include <boost/spirit/home/qi/directive/no_skip.hpp>

Added: trunk/boost/spirit/home/qi/directive/encoding.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/qi/directive/encoding.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ 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_ENCODING_MARCH_05_2010_0528PM)
+#define SPIRIT_ENCODING_MARCH_05_2010_0528PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename CharEncoding>
+ struct use_directive<
+ qi::domain, tag::char_code<tag::encoding, CharEncoding> > // enables encoding
+ : mpl::true_ {};
+
+ template <typename CharEncoding>
+ struct is_modifier_directive<qi::domain, tag::char_code<tag::encoding, CharEncoding> >
+ : mpl::true_ {};
+}}
+
+#endif

Modified: trunk/boost/spirit/home/qi/string/lit.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/string/lit.hpp (original)
+++ trunk/boost/spirit/home/qi/string/lit.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -23,6 +23,7 @@
 #include <boost/spirit/home/support/unused.hpp>
 #include <boost/spirit/home/support/common_terminals.hpp>
 #include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
 #include <boost/fusion/include/at.hpp>
 #include <boost/fusion/include/value_at.hpp>
 #include <boost/type_traits/add_reference.hpp>
@@ -194,7 +195,8 @@
         template <typename String>
         result_type op(String const& str, mpl::true_) const
         {
- typename Modifiers::char_encoding encoding;
+ typename spirit::detail::get_encoding<Modifiers,
+ spirit::char_encoding::default_encoding>::type encoding;
             return result_type(traits::get_c_string(str), encoding);
         }
     };

Modified: trunk/boost/spirit/home/qi/string/symbols.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/string/symbols.hpp (original)
+++ trunk/boost/spirit/home/qi/string/symbols.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -361,9 +361,9 @@
         typedef has_modifier<Modifiers, tag::char_code_base<tag::no_case> > no_case;
         typedef reference<symbols<Char, T, Lookup, Filter> > reference_;
         typedef no_case_filter<
- typename spirit::detail::get_encoding<
+ typename spirit::detail::get_encoding_with_case<
                 Modifiers
- , char_encoding::default_
+ , char_encoding::default_encoding
               , no_case::value>::type>
         nc_filter;
 

Modified: trunk/boost/spirit/home/support/char_class.hpp
==============================================================================
--- trunk/boost/spirit/home/support/char_class.hpp (original)
+++ trunk/boost/spirit/home/support/char_class.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -50,6 +50,7 @@
     struct lowernum {};
     struct uppernum {};
     struct ucs4 {};
+ struct encoding {};
 
 #if defined(BOOST_SPIRIT_UNICODE)
 ///////////////////////////////////////////////////////////////////////////
@@ -216,13 +217,17 @@
     ///////////////////////////////////////////////////////////////////////////
     // This composite tag type encodes both the character
     // set and the specific char tag (used for classification
- // or conversion). char_code_base can be used to test for
- // modifier membership (see modifier.hpp)
+ // or conversion). char_code_base and char_encoding_base
+ // can be used to test for modifier membership (see modifier.hpp)
     template <typename CharClass>
     struct char_code_base {};
 
+ template <typename CharEncoding>
+ struct char_encoding_base {};
+
     template <typename CharClass, typename CharEncoding>
- struct char_code : char_code_base<CharClass>
+ struct char_code
+ : char_code_base<CharClass>, char_encoding_base<CharEncoding>
     {
         typedef CharEncoding char_encoding; // e.g. ascii
         typedef CharClass char_class; // e.g. tag::alnum

Deleted: trunk/boost/spirit/home/support/char_encoding/default.hpp
==============================================================================
--- trunk/boost/spirit/home/support/char_encoding/default.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
+++ (empty file)
@@ -1,28 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Hartmut Kaiser
- Copyright (c) 2001-2010 Joel de Guzman
-
- 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(BOOST_SPIRIT_DEFAULT_MARCH_05_2010_1041AM)
-#define BOOST_SPIRIT_DEFAULT_MARCH_05_2010_1041AM
-
-#if defined(_MSC_VER)
-#pragma once
-#endif
-
-#include <boost/spirit/home/support/char_encoding/standard.hpp>
-
-namespace boost { namespace spirit { namespace char_encoding
-{
- ///////////////////////////////////////////////////////////////////////////
- // default_ uses char_encoding::standard
- ///////////////////////////////////////////////////////////////////////////
- struct default_ : char_encoding::standard
- {
- };
-}}}
-
-#endif
-

Copied: trunk/boost/spirit/home/support/char_encoding/default_encoding.hpp (from r60164, /trunk/boost/spirit/home/support/char_encoding/default.hpp)
==============================================================================
--- /trunk/boost/spirit/home/support/char_encoding/default.hpp (original)
+++ trunk/boost/spirit/home/support/char_encoding/default_encoding.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -5,8 +5,8 @@
     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(BOOST_SPIRIT_DEFAULT_MARCH_05_2010_1041AM)
-#define BOOST_SPIRIT_DEFAULT_MARCH_05_2010_1041AM
+#if !defined(BOOST_SPIRIT_DEFAULT_ENCODING_MARCH_05_2010_1041AM)
+#define BOOST_SPIRIT_DEFAULT_ENCODING_MARCH_05_2010_1041AM
 
 #if defined(_MSC_VER)
 #pragma once
@@ -17,9 +17,9 @@
 namespace boost { namespace spirit { namespace char_encoding
 {
     ///////////////////////////////////////////////////////////////////////////
- // default_ uses char_encoding::standard
+ // default_encoding uses char_encoding::standard
     ///////////////////////////////////////////////////////////////////////////
- struct default_ : char_encoding::standard
+ struct default_encoding : char_encoding::standard
     {
     };
 }}}

Deleted: trunk/boost/spirit/home/support/char_encoding/default_wide.hpp
==============================================================================
--- trunk/boost/spirit/home/support/char_encoding/default_wide.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
+++ (empty file)
@@ -1,28 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Hartmut Kaiser
- Copyright (c) 2001-2010 Joel de Guzman
-
- 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(BOOST_SPIRIT_DEFAULT_WIDE_MARCH_05_2010_1041AM)
-#define BOOST_SPIRIT_DEFAULT_WIDE_MARCH_05_2010_1041AM
-
-#if defined(_MSC_VER)
-#pragma once
-#endif
-
-#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
-
-namespace boost { namespace spirit { namespace char_encoding
-{
- ///////////////////////////////////////////////////////////////////////////
- // default_ uses char_encoding::standard
- ///////////////////////////////////////////////////////////////////////////
- struct default_wide : char_encoding::standard_wide
- {
- };
-}}}
-
-#endif
-

Copied: trunk/boost/spirit/home/support/char_encoding/default_wide_encoding.hpp (from r60178, /trunk/boost/spirit/home/support/char_encoding/default_wide.hpp)
==============================================================================
--- /trunk/boost/spirit/home/support/char_encoding/default_wide.hpp (original)
+++ trunk/boost/spirit/home/support/char_encoding/default_wide_encoding.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -5,8 +5,8 @@
     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(BOOST_SPIRIT_DEFAULT_WIDE_MARCH_05_2010_1041AM)
-#define BOOST_SPIRIT_DEFAULT_WIDE_MARCH_05_2010_1041AM
+#if !defined(BOOST_SPIRIT_DEFAULT_WIDE_ENCODING_MARCH_05_2010_1041AM)
+#define BOOST_SPIRIT_DEFAULT_WIDE_ENCODING_MARCH_05_2010_1041AM
 
 #if defined(_MSC_VER)
 #pragma once
@@ -17,9 +17,9 @@
 namespace boost { namespace spirit { namespace char_encoding
 {
     ///////////////////////////////////////////////////////////////////////////
- // default_ uses char_encoding::standard
+ // default_wide_encoding uses char_encoding::standard
     ///////////////////////////////////////////////////////////////////////////
- struct default_wide : char_encoding::standard_wide
+ struct default_wide_encoding : char_encoding::standard_wide
     {
     };
 }}}

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 08:31:13 EST (Fri, 05 Mar 2010)
@@ -13,13 +13,14 @@
 #endif
 
 #include <boost/spirit/home/support/terminal.hpp>
-#include <boost/spirit/home/support/char_encoding/default.hpp>
-#include <boost/spirit/home/support/char_encoding/default_wide.hpp>
+#include <boost/spirit/home/support/char_encoding/default_encoding.hpp>
+#include <boost/spirit/home/support/char_encoding/default_wide_encoding.hpp>
 #include <boost/spirit/home/support/char_encoding/standard.hpp>
 #include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
 #include <boost/spirit/home/support/char_encoding/ascii.hpp>
 #include <boost/spirit/home/support/char_encoding/iso8859_1.hpp>
 #include <boost/spirit/home/support/char_class.hpp>
+#include <boost/mpl/vector.hpp>
 
 #if defined(BOOST_SPIRIT_UNICODE)
 # include <boost/spirit/home/support/char_encoding/unicode.hpp>
@@ -27,6 +28,17 @@
 
 namespace boost { namespace spirit
 {
+ typedef mpl::vector<
+ spirit::char_encoding::ascii
+ , spirit::char_encoding::iso8859_1
+ , spirit::char_encoding::standard
+ , spirit::char_encoding::standard_wide
+#if defined(BOOST_SPIRIT_UNICODE)
+ , spirit::char_encoding::unicode
+#endif
+ >
+ char_encodings;
+
     // Our basic terminals
     BOOST_SPIRIT_DEFINE_TERMINALS(
         ( verbatim )
@@ -158,11 +170,12 @@
         BOOST_SPIRIT_CHAR_CODE(upper, spirit::char_encoding::charset) \
         BOOST_SPIRIT_CHAR_CODE(lowernum, spirit::char_encoding::charset) \
         BOOST_SPIRIT_CHAR_CODE(uppernum, spirit::char_encoding::charset) \
+ BOOST_SPIRIT_CHAR_CODE(encoding, spirit::char_encoding::charset) \
     }}} \
     /***/
 
-BOOST_SPIRIT_DEFINE_CHAR_CODES(default_)
-BOOST_SPIRIT_DEFINE_CHAR_CODES(default_wide)
+BOOST_SPIRIT_DEFINE_CHAR_CODES(default_encoding)
+BOOST_SPIRIT_DEFINE_CHAR_CODES(default_wide_encoding)
 BOOST_SPIRIT_DEFINE_CHAR_CODES(ascii)
 BOOST_SPIRIT_DEFINE_CHAR_CODES(iso8859_1)
 BOOST_SPIRIT_DEFINE_CHAR_CODES(standard)

Modified: trunk/boost/spirit/home/support/detail/get_encoding.hpp
==============================================================================
--- trunk/boost/spirit/home/support/detail/get_encoding.hpp (original)
+++ trunk/boost/spirit/home/support/detail/get_encoding.hpp 2010-03-05 08:31:13 EST (Fri, 05 Mar 2010)
@@ -1,7 +1,7 @@
 // Copyright (c) 2001-2010 Hartmut Kaiser
 // Copyright (c) 2001-2010 Joel de Guzman
-//
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
+//
+// 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(BOOST_SPIRIT_GET_ENCODING_JANUARY_13_2009_1255PM)
@@ -12,16 +12,64 @@
 #endif
 
 #include <boost/mpl/identity.hpp>
+#include <boost/type_traits/is_same.hpp>
 
 namespace boost { namespace spirit { namespace detail
 {
- template <typename Modifiers, typename Encoding, bool case_modifier = false>
- struct get_encoding : mpl::identity<Encoding> {};
+ template <typename Modifiers, typename Encoding>
+ struct get_implicit_encoding
+ {
+ // Extract the implicit encoding from the Modifiers
+ // If one is not found, Encoding is used. The explicit
+ // encoding is the fifst viable encoding that can be
+ // extracted from the Modifiers (there can be more than one).
+
+ typedef typename
+ mpl::find_if<
+ char_encodings,
+ has_modifier<Modifiers, tag::char_encoding_base<mpl::_1> >
+ >::type
+ iter;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<iter, typename mpl::end<char_encodings>::type>,
+ mpl::identity<Encoding>,
+ mpl::deref<iter>
+ >::type
+ type;
+ };
 
     template <typename Modifiers, typename Encoding>
- struct get_encoding<Modifiers, Encoding, true>
- : mpl::identity<typename Modifiers::char_encoding> {};
+ struct get_encoding
+ {
+ // Extract the explicit encoding from the Modifiers
+ // If one is not found, get implicit encoding (see above).
+ // Explicit encoding is the encoding explicitly declared
+ // using the encoding[c] directive.
+
+ typedef typename
+ mpl::find_if<
+ char_encodings,
+ has_modifier<Modifiers, tag::char_code<tag::encoding, mpl::_1> >
+ >::type
+ iter;
+
+ typedef typename
+ mpl::eval_if<
+ is_same<iter, typename mpl::end<char_encodings>::type>,
+ get_implicit_encoding<Modifiers, Encoding>,
+ mpl::deref<iter>
+ >::type
+ type;
+ };
 
+ template <typename Modifiers, typename Encoding, bool case_modifier = false>
+ struct get_encoding_with_case : mpl::identity<Encoding> {};
+
+ template <typename Modifiers, typename Encoding>
+ struct get_encoding_with_case<Modifiers, Encoding, true>
+ : get_encoding<Modifiers, Encoding> {};
 }}}
 
 #endif


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