$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56471 - in trunk/boost/spirit/home: karma/numeric qi qi/numeric
From: hartmut.kaiser_at_[hidden]
Date: 2009-09-29 10:30:55
Author: hkaiser
Date: 2009-09-29 10:30:54 EDT (Tue, 29 Sep 2009)
New Revision: 56471
URL: http://svn.boost.org/trac/boost/changeset/56471
Log:
Spirit: added qi::bool_
Added:
   trunk/boost/spirit/home/qi/numeric/bool.hpp   (contents, props changed)
   trunk/boost/spirit/home/qi/numeric/bool_policies.hpp   (contents, props changed)
Text files modified: 
   trunk/boost/spirit/home/karma/numeric/bool.hpp |     2 +-                                      
   trunk/boost/spirit/home/qi/numeric.hpp         |     1 +                                       
   2 files changed, 2 insertions(+), 1 deletions(-)
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	2009-09-29 10:30:54 EDT (Tue, 29 Sep 2009)
@@ -185,7 +185,7 @@
           , Attribute const& attr) const
         {
             if (!traits::has_optional_value(attr) || 
-                n_ != traits::optional_value(attr))
+                bool(n_) != bool(traits::optional_value(attr)))
             {
                 return false;
             }
Modified: trunk/boost/spirit/home/qi/numeric.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/numeric.hpp	(original)
+++ trunk/boost/spirit/home/qi/numeric.hpp	2009-09-29 10:30:54 EDT (Tue, 29 Sep 2009)
@@ -11,6 +11,7 @@
 #pragma once
 #endif
 
+#include <boost/spirit/home/qi/numeric/bool.hpp>
 #include <boost/spirit/home/qi/numeric/int.hpp>
 #include <boost/spirit/home/qi/numeric/uint.hpp>
 #include <boost/spirit/home/qi/numeric/real.hpp>
Added: trunk/boost/spirit/home/qi/numeric/bool.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/qi/numeric/bool.hpp	2009-09-29 10:30:54 EDT (Tue, 29 Sep 2009)
@@ -0,0 +1,114 @@
+/*=============================================================================
+    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(SPIRIT_QI_BOOL_SEP_29_2009_0709AM)
+#define SPIRIT_QI_BOOL_SEP_29_2009_0709AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/numeric/bool_policies.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/mpl/assert.hpp>
+
+namespace boost { namespace spirit
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Enablers
+    ///////////////////////////////////////////////////////////////////////////
+    template <>
+    struct use_terminal<qi::domain, tag::bool_> // enables bool_
+      : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+    using spirit::bool_;
+    using spirit::bool__type;
+
+    namespace detail
+    {
+        template <typename T, typename Policies>
+        struct bool_impl
+        {
+            template <typename Iterator, typename Attribute>
+            static bool parse(Iterator& first, Iterator const& last
+              , Attribute& attr, Policies const& p) 
+            {
+                if (first == last)
+                    return false;
+
+                return p.parse_true(first, last, attr) ||
+                       p.parse_false(first, last, attr);
+            }
+        };
+    }
+
+    ///////////////////////////////////////////////////////////////////////////
+    // This actual boolean parser
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        typename T = bool
+      , typename Policies = bool_policies<T> >
+    struct bool_parser_impl
+      : primitive_parser<bool_parser_impl<T, Policies> >
+    {
+        template <typename Context, typename Iterator>
+        struct attribute
+        {
+            typedef T type;
+        };
+
+        template <typename Iterator, typename Context
+          , typename Skipper, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& /*context*/, Skipper const& skipper
+          , Attribute& attr) const
+        {
+            qi::skip_over(first, last, skipper);
+            return detail::bool_impl<T, Policies>::
+                parse(first, last, attr, Policies());
+        }
+
+        template <typename Context>
+        info what(Context& /*context*/) const
+        {
+            return info("boolean");
+        }
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // uint_parser is the class that the user can instantiate directly
+    ///////////////////////////////////////////////////////////////////////////
+    template <
+        typename T
+      , typename Policies = bool_policies<T> >
+    struct bool_parser
+      : proto::terminal<bool_parser_impl<T, Policies> >::type
+    {
+    };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // Parser generators: make_xxx function (objects)
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Modifiers>
+    struct make_primitive<tag::bool_, Modifiers>
+    {
+        typedef bool_parser_impl<bool> result_type;
+        result_type operator()(unused_type, unused_type) const
+        {
+            return result_type();
+        }
+    };
+
+}}}
+
+#endif
Added: trunk/boost/spirit/home/qi/numeric/bool_policies.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/qi/numeric/bool_policies.hpp	2009-09-29 10:30:54 EDT (Tue, 29 Sep 2009)
@@ -0,0 +1,52 @@
+/*=============================================================================
+    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(SPIRIT_QI_BOOL_POLICIES_SEP_29_2009_0710AM)
+#define SPIRIT_QI_BOOL_POLICIES_SEP_29_2009_0710AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/detail/string_parse.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+
+namespace boost { namespace spirit { namespace qi
+{
+    ///////////////////////////////////////////////////////////////////////////
+    //  Default boolean policies
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename T = bool>
+    struct bool_policies
+    {
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_true(Iterator& first, Iterator const& last, Attribute& attr)
+        {
+            if (detail::string_parse("true", first, last, unused))
+            {
+                detail::assign_to(T(true), attr);    // result is true
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Iterator, typename Attribute>
+        static bool
+        parse_false(Iterator& first, Iterator const& last, Attribute& attr)
+        {
+            if (detail::string_parse("false", first, last, unused))
+            {
+                detail::assign_to(T(false), attr);   // result is false
+                return true;
+            }
+            return false;
+        }
+    };
+
+}}}
+
+#endif