$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r55516 - in trunk/boost/spirit: home/karma home/karma/char home/karma/detail home/support include
From: hartmut.kaiser_at_[hidden]
Date: 2009-08-10 20:55:22
Author: hkaiser
Date: 2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
New Revision: 55516
URL: http://svn.boost.org/trac/boost/changeset/55516
Log:
Spirit: added Karma character class generators
Added:
   trunk/boost/spirit/home/karma/char/char_class.hpp   (contents, props changed)
   trunk/boost/spirit/include/karma_char_class.hpp   (contents, props changed)
Removed:
   trunk/boost/spirit/home/karma/char/space.hpp
Text files modified: 
   trunk/boost/spirit/home/karma/char.hpp                  |     2 +-                                      
   trunk/boost/spirit/home/karma/char/char.hpp             |     3 +--                                     
   trunk/boost/spirit/home/karma/detail/string_compare.hpp |     4 ++--                                    
   trunk/boost/spirit/home/support/char_class.hpp          |    28 ++++++++++++++++++++++++++++            
   trunk/boost/spirit/home/support/common_terminals.hpp    |     8 +++++---                                
   5 files changed, 37 insertions(+), 8 deletions(-)
Modified: trunk/boost/spirit/home/karma/char.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/char.hpp	(original)
+++ trunk/boost/spirit/home/karma/char.hpp	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -11,6 +11,6 @@
 #endif
 
 #include <boost/spirit/home/karma/char/char.hpp>
-#include <boost/spirit/home/karma/char/space.hpp>
+#include <boost/spirit/home/karma/char/char_class.hpp>
 
 #endif
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	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -165,8 +165,7 @@
           , Attribute const& attr) const
         {
             // fail if attribute isn't matched my immediate literal
-            typedef spirit::char_class::convert<char_encoding> convert_type;
-            if (convert_type::to(Tag(), attr) != ch)
+            if (attr != ch)
                 return false;
 
             return karma::detail::generate_to(sink, ch) &&
Added: trunk/boost/spirit/home/karma/char/char_class.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/karma/char/char_class.hpp	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -0,0 +1,207 @@
+//  Copyright (c) 2001-2009 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(BOOST_SPIRIT_KARMA_CHAR_CLASS_AUG_10_2009_0720AM)
+#define BOOST_SPIRIT_KARMA_CHAR_CLASS_AUG_10_2009_0720AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/char_class.hpp>
+#include <boost/spirit/home/support/detail/get_encoding.hpp>
+#include <boost/spirit/home/karma/domain.hpp>
+#include <boost/spirit/home/karma/meta_compiler.hpp>
+#include <boost/spirit/home/karma/delimit_out.hpp>
+#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
+#include <boost/spirit/home/karma/detail/get_casetag.hpp>
+#include <boost/spirit/home/karma/detail/generate_to.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit 
+{ 
+    ///////////////////////////////////////////////////////////////////////////
+    // Enablers
+    ///////////////////////////////////////////////////////////////////////////
+    // enables alnum, alpha, graph, etc.
+    template <typename CharClass, typename CharEncoding>
+    struct use_terminal<karma::domain
+        , tag::char_code<CharClass, CharEncoding> >
+      : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace karma
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  char_class
+    //      generates a single character if it matches the given character 
+    //      class
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Tag>
+    struct char_class
+      : primitive_generator<char_class<Tag> >
+    {
+        typedef typename Tag::char_encoding char_encoding;
+        typedef typename char_encoding::char_type char_type;
+        typedef typename Tag::char_class classification;
+
+        template <typename Context, typename Unused>
+        struct attribute
+        {
+            typedef char_type type;
+        };
+
+        // char_class needs an attached attribute
+        template <
+            typename OutputIterator, typename Context, typename Delimiter
+          , typename Attribute>
+        static bool generate(OutputIterator& sink, Context&, Delimiter const& d
+          , Attribute const& attr)
+        {
+            using spirit::char_class::classify;
+            if (!classify<char_encoding>::is(classification(), attr))
+                return false;     // allow proper character class only
+
+            return karma::detail::generate_to(sink, attr) &&
+                   karma::delimit_out(sink, d);      // always do post-delimiting
+        }
+
+        // char_class shouldn't be used without any associated attribute
+        template <typename OutputIterator, typename Context, typename Delimiter>
+        static bool generate(OutputIterator& sink, Context&, Delimiter const& d, 
+            unused_type const&)
+        {
+            BOOST_SPIRIT_ASSERT_MSG(false
+              , char_class_not_usable_without_attribute, ());
+            return false;
+        }
+
+        template <typename Context>
+        static info what(Context const& ctx)
+        {
+            typedef spirit::char_class::what<char_encoding> what_;
+            return info(what_::is(classification()));
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    //
+    //  space
+    //      generates a single character from the associated parameter
+    //
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename CharEncoding>
+    struct any_space
+      : primitive_generator<any_space<CharEncoding> >
+    {
+        typedef typename CharEncoding::char_type char_type;
+        typedef CharEncoding char_encoding;
+
+        template <typename Context, typename Unused>
+        struct attribute
+        {
+            typedef char_type type;
+        };
+
+        // any_space has an attached parameter
+        template <
+            typename OutputIterator, typename Context, typename Delimiter
+          , typename Attribute>
+        static bool generate(OutputIterator& sink, Context&, Delimiter const& d
+          , Attribute const& attr)
+        {
+            using spirit::char_class::classify;
+            if (!classify<char_encoding>::is(tag::space(), attr))
+                return false;     // allow whitespace only
+
+            return karma::detail::generate_to(sink, attr) &&
+                   karma::delimit_out(sink, d);      // always do post-delimiting
+        }
+
+        // any_space has no attribute attached, use single space character
+        template <typename OutputIterator, typename Context, typename Delimiter>
+        static bool generate(OutputIterator& sink, Context&, Delimiter const& d, 
+            unused_type const&)
+        {
+            return karma::detail::generate_to(sink, ' ') &&
+                   karma::delimit_out(sink, d);      // always do post-delimiting
+        }
+
+        template <typename Context>
+        static info what(Context const& ctx)
+        {
+            return info("space");
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Generator generators: make_xxx function (objects)
+    ///////////////////////////////////////////////////////////////////////////
+
+    namespace detail
+    {
+        template <typename Tag, bool lower = false, bool upper = false>
+        struct make_char_class : mpl::identity<Tag> {};
+
+        template <>
+        struct make_char_class<tag::alpha, true, false> 
+          : mpl::identity<tag::lower> {};
+
+        template <>
+        struct make_char_class<tag::alpha, false, true> 
+          : mpl::identity<tag::upper> {};
+
+        template <>
+        struct make_char_class<tag::alnum, true, false> 
+          : mpl::identity<tag::lowernum> {};
+
+        template <>
+        struct make_char_class<tag::alnum, false, true> 
+          : mpl::identity<tag::uppernum> {};
+    }
+
+    // enables alnum, alpha, graph, etc.
+    template <typename CharClass, typename CharEncoding, typename Modifiers>
+    struct make_primitive<tag::char_code<CharClass, CharEncoding>, Modifiers>
+    {
+        static bool const lower = 
+            has_modifier<Modifiers, tag::char_code_base<tag::lower> >::value;
+        static bool const upper = 
+            has_modifier<Modifiers, tag::char_code_base<tag::upper> >::value;
+
+        typedef tag::char_code<
+            typename detail::make_char_class<CharClass, lower, upper>::type
+          , CharEncoding>
+        tag_type;
+
+        typedef char_class<tag_type> result_type;
+        result_type operator()(unused_type, unused_type) const
+        {
+            return result_type();
+        }
+    };
+
+    // space is special
+    template <typename CharEncoding, typename Modifiers>
+    struct make_primitive<tag::char_code<tag::space, CharEncoding>, Modifiers>
+    {
+        typedef any_space<CharEncoding> result_type;
+
+        result_type operator()(unused_type, unused_type) const
+        {
+            return result_type();
+        }
+    };
+
+}}}  // namespace boost::spirit::karma
+
+#endif // !defined(BOOST_SPIRIT_KARMA_CHAR_FEB_21_2007_0543PM)
Deleted: trunk/boost/spirit/home/karma/char/space.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/char/space.hpp	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
+++ (empty file)
@@ -1,109 +0,0 @@
-//  Copyright (c) 2001-2009 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(BOOST_SPIRIT_KARMA_SPACE_MAR_06_2007_0934PM)
-#define BOOST_SPIRIT_KARMA_SPACE_MAR_06_2007_0934PM
-
-#if defined(_MSC_VER)
-#pragma once
-#endif
-
-#include <boost/spirit/home/support/common_terminals.hpp>
-#include <boost/spirit/home/support/string_traits.hpp>
-#include <boost/spirit/home/support/info.hpp>
-#include <boost/spirit/home/support/char_class.hpp>
-#include <boost/spirit/home/support/detail/get_encoding.hpp>
-#include <boost/spirit/home/karma/domain.hpp>
-#include <boost/spirit/home/karma/meta_compiler.hpp>
-#include <boost/spirit/home/karma/delimit_out.hpp>
-#include <boost/spirit/home/karma/auxiliary/lazy.hpp>
-#include <boost/spirit/home/karma/detail/get_casetag.hpp>
-#include <boost/spirit/home/karma/detail/generate_to.hpp>
-
-///////////////////////////////////////////////////////////////////////////////
-namespace boost { namespace spirit 
-{ 
-    ///////////////////////////////////////////////////////////////////////////
-    // Enablers
-    ///////////////////////////////////////////////////////////////////////////
-    template <typename CharEncoding>
-    struct use_terminal<karma::domain
-      , tag::char_code<tag::space, CharEncoding>        // enables space
-    > : mpl::true_ {};
-
-}}
-
-///////////////////////////////////////////////////////////////////////////////
-namespace boost { namespace spirit { namespace karma
-{
-    ///////////////////////////////////////////////////////////////////////////
-    //
-    //  space
-    //      generates a single character from the associated parameter
-    //
-    ///////////////////////////////////////////////////////////////////////////
-    template <typename CharEncoding>
-    struct any_space
-      : primitive_generator<any_space<CharEncoding> >
-    {
-        typedef typename CharEncoding::char_type char_type;
-        typedef CharEncoding char_encoding;
-
-        template <typename Context, typename Unused>
-        struct attribute
-        {
-            typedef char_type type;
-        };
-
-        // any_space has an attached parameter
-        template <
-            typename OutputIterator, typename Context, typename Delimiter
-          , typename Attribute>
-        static bool generate(OutputIterator& sink, Context&, Delimiter const& d
-          , Attribute const& attr)
-        {
-            if (!spirit::char_class::classify<char_encoding>::is(tag::space(), attr))
-                return false;     // allow whitespace only
-
-            return 
-                karma::detail::generate_to(sink, attr) &&
-                karma::delimit_out(sink, d);      // always do post-delimiting
-        }
-
-        // any_space has no attribute attached, use single space character
-        template <typename OutputIterator, typename Context, typename Delimiter>
-        static bool generate(OutputIterator& sink, Context&, Delimiter const& d, 
-            unused_type const&)
-        {
-            return 
-                karma::detail::generate_to(sink, ' ') &&
-                karma::delimit_out(sink, d);      // always do post-delimiting
-        }
-
-        template <typename Context>
-        static info what(Context const& ctx)
-        {
-            return info("space");
-        }
-    };
-
-    ///////////////////////////////////////////////////////////////////////////
-    // Generator generators: make_xxx function (objects)
-    ///////////////////////////////////////////////////////////////////////////
-    // space
-    template <typename CharEncoding, typename Modifiers>
-    struct make_primitive<tag::char_code<tag::space, CharEncoding>, Modifiers>
-    {
-        typedef any_space<CharEncoding> result_type;
-
-        result_type operator()(unused_type, unused_type) const
-        {
-            return result_type();
-        }
-    };
-
-}}}  // namespace boost::spirit::karma
-
-#endif // !defined(BOOST_SPIRIT_KARMA_CHAR_FEB_21_2007_0543PM)
Modified: trunk/boost/spirit/home/karma/detail/string_compare.hpp
==============================================================================
--- trunk/boost/spirit/home/karma/detail/string_compare.hpp	(original)
+++ trunk/boost/spirit/home/karma/detail/string_compare.hpp	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -50,7 +50,7 @@
     template <typename Char, typename CharEncoding, typename Tag>
     bool string_compare(Char const* attr, Char const* lit, CharEncoding ce, Tag tag)
     {
-        Char ch_attr = spirit::char_class::convert<CharEncoding>::to(Tag(), *attr);
+        Char ch_attr = *attr;
         Char ch_lit = spirit::char_class::convert<CharEncoding>::to(Tag(), *lit);
 
         while (!!ch_lit && !!ch_attr)
@@ -58,7 +58,7 @@
             if (ch_attr != ch_lit)
                 return false;
 
-            ch_attr = spirit::char_class::convert<CharEncoding>::to(Tag(), *++attr);
+            ch_attr = *++attr;
             ch_lit = spirit::char_class::convert<CharEncoding>::to(Tag(), *++lit);
         }
 
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	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -46,6 +46,8 @@
     struct no_case {};
     struct lower {};
     struct upper {};
+    struct lowernum {};
+    struct uppernum {};
     struct ucs4 {};
 
     ///////////////////////////////////////////////////////////////////////////
@@ -132,6 +134,14 @@
 
         template <typename Char>
         static bool
+        is(tag::lowernum, Char ch)
+        {
+            return CharEncoding::islower(char_type(ch)) || 
+                   CharEncoding::isdigit(char_type(ch));
+        }
+
+        template <typename Char>
+        static bool
         is(tag::print, Char ch)
         {
             return CharEncoding::isprint(char_type(ch));
@@ -165,6 +175,14 @@
         {
             return CharEncoding::isupper(char_type(ch));
         }
+
+        template <typename Char>
+        static bool
+        is(tag::uppernum, Char ch)
+        {
+            return CharEncoding::isupper(char_type(ch)) || 
+                   CharEncoding::isdigit(char_type(ch));
+        }
     };
 
     ///////////////////////////////////////////////////////////////////////////
@@ -248,6 +266,11 @@
             return "lower";
         }
 
+        static char const* is(tag::lowernum)
+        {
+            return "lowernum";
+        }
+
         static char const* is(tag::print)
         {
             return "print";
@@ -273,6 +296,11 @@
             return "upper";
         }
 
+        static char const* is(tag::uppernum)
+        {
+            return "uppernum";
+        }
+
         static char const* is(tag::ucs4)
         {
             return "ucs4";
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	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -95,12 +95,12 @@
     typedef spirit::terminal<tag::charset::char_> char_type;                    \
     char_type const char_ = char_type();                                        \
                                                                                 \
-    inline void silence_unused_warnings__##char_() { (void) char_; }            \
+    inline void silence_unused_warnings_##char_() { (void) char_; }             \
                                                                                 \
     typedef spirit::terminal<tag::charset::string> string_type;                 \
     string_type const string = string_type();                                   \
                                                                                 \
-    inline void silence_unused_warnings__##string() { (void) string; }          \
+    inline void silence_unused_warnings_##string() { (void) string; }           \
     /***/
 
 #define BOOST_SPIRIT_CHAR_CODE(name, charset)                                   \
@@ -108,7 +108,7 @@
         name##_type;                                                            \
     name##_type const name = name##_type();                                     \
                                                                                 \
-    inline void silence_unused_warnings__##name() { (void) name; }              \
+    inline void silence_unused_warnings_##name() { (void) name; }               \
     /***/
 
 #define BOOST_SPIRIT_DEFINE_CHAR_CODES(charset)                                 \
@@ -134,6 +134,8 @@
         BOOST_SPIRIT_CHAR_CODE(no_case, spirit::char_encoding::charset)         \
         BOOST_SPIRIT_CHAR_CODE(lower, spirit::char_encoding::charset)           \
         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)        \
     }}}                                                                         \
     /***/
 
Added: trunk/boost/spirit/include/karma_char_class.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/include/karma_char_class.hpp	2009-08-10 20:55:21 EDT (Mon, 10 Aug 2009)
@@ -0,0 +1,18 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2001-2009 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    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)
+=============================================================================*/
+#ifndef BOOST_SPIRIT_INCLUDE_KARMA_CHAR_CLASS
+#define BOOST_SPIRIT_INCLUDE_KARMA_CHAR_CLASS
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/karma/char/char_class.hpp>
+
+#endif