$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r55165 - in trunk/boost/spirit: home/support repository/home repository/home/qi repository/home/support repository/include
From: hartmut.kaiser_at_[hidden]
Date: 2009-07-30 14:42:10
Author: hkaiser
Date: 2009-07-25 21:10:49 EDT (Sat, 25 Jul 2009)
New Revision: 55165
URL: http://svn.boost.org/trac/boost/changeset/55165
Log:
Spirit: added qi::distinct to repository
Added:
   trunk/boost/spirit/repository/home/qi/distinct.hpp   (contents, props changed)
   trunk/boost/spirit/repository/home/support/distinct.hpp   (contents, props changed)
   trunk/boost/spirit/repository/include/qi_distinct.hpp   (contents, props changed)
Text files modified: 
   trunk/boost/spirit/home/support/common_terminals.hpp |    17 ++++++++++++-----                       
   trunk/boost/spirit/repository/home/qi.hpp            |     2 +-                                      
   2 files changed, 13 insertions(+), 6 deletions(-)
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-07-25 21:10:49 EDT (Sat, 25 Jul 2009)
@@ -85,15 +85,18 @@
 // are placed in its char-set namespace. For example, there exist a placeholder
 // spirit::ascii::alnum for ascii versions of alnum.
 
+#define BOOST_SPIRIT_TAG_CHAR_SPEC(charset)                                     \
+    typedef tag::char_code<tag::char_, charset> char_;                          \
+    typedef tag::char_code<tag::string, charset> string;                        \
+    /***/
+
 #define BOOST_SPIRIT_CHAR_SPEC(charset)                                         \
-    typedef spirit::terminal<                                                   \
-        tag::char_code<tag::char_, charset> > char__type;                       \
+    typedef spirit::terminal<tag::charset::char_> char__type;                   \
     char__type const char_ = char__type();                                      \
                                                                                 \
     inline void silence_unused_warnings__##char_() { (void) char_; }            \
                                                                                 \
-    typedef spirit::terminal<                                                   \
-        tag::char_code<tag::string, charset> > string_type;                     \
+    typedef spirit::terminal<tag::charset::string> string_type;                 \
     string_type const string = string_type();                                   \
                                                                                 \
     inline void silence_unused_warnings__##string() { (void) string; }          \
@@ -108,9 +111,13 @@
     /***/
 
 #define BOOST_SPIRIT_DEFINE_CHAR_CODES(charset)                                 \
+    namespace boost { namespace spirit { namespace tag { namespace charset      \
+    {                                                                           \
+        BOOST_SPIRIT_TAG_CHAR_SPEC(spirit::char_encoding::charset)              \
+    }}}}                                                                        \
     namespace boost { namespace spirit { namespace charset                      \
     {                                                                           \
-        BOOST_SPIRIT_CHAR_SPEC(spirit::char_encoding::charset)                  \
+        BOOST_SPIRIT_CHAR_SPEC(charset)                                         \
                                                                                 \
         BOOST_SPIRIT_CHAR_CODE(alnum, spirit::char_encoding::charset)           \
         BOOST_SPIRIT_CHAR_CODE(alpha, spirit::char_encoding::charset)           \
Modified: trunk/boost/spirit/repository/home/qi.hpp
==============================================================================
--- trunk/boost/spirit/repository/home/qi.hpp	(original)
+++ trunk/boost/spirit/repository/home/qi.hpp	2009-07-25 21:10:49 EDT (Sat, 25 Jul 2009)
@@ -12,8 +12,8 @@
 #endif
 
 #include <boost/spirit/repository/home/qi/flush_multi_pass.hpp>
+#include <boost/spirit/repository/home/qi/distinct.hpp>
 //#include <boost/spirit/repository/qi/confix.hpp>
-//#include <boost/spirit/repository/qi/distinct.hpp>
 
 #endif
 
Added: trunk/boost/spirit/repository/home/qi/distinct.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/repository/home/qi/distinct.hpp	2009-07-25 21:10:49 EDT (Sat, 25 Jul 2009)
@@ -0,0 +1,136 @@
+//  Copyright (c) 2001-2009 Hartmut Kaiser
+//  Copyright (c) 2001-2009 Joel de Guzman
+//  Copyright (c) 2003 Vaclav Vesely
+//
+//  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_REPOSITORY_QI_DISTINCT_MAY_20_2009_0825M)
+#define SPIRIT_REPOSITORY_QI_DISTINCT_MAY_20_2009_0825M
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/unused_skipper.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/support/make_component.hpp>
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/support/unused.hpp>
+#include <boost/spirit/home/support/attributes.hpp>
+#include <boost/spirit/home/support/string_traits.hpp>
+#include <boost/spirit/home/qi/auxiliary/eps.hpp>
+#include <boost/spirit/home/qi/auxiliary/lazy.hpp>
+#include <boost/spirit/home/qi/directive/lexeme.hpp>
+#include <boost/spirit/home/qi/operator/not_predicate.hpp>
+
+#include <boost/spirit/repository/home/support/distinct.hpp>
+
+#include <boost/fusion/include/at.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit 
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Enablers
+    ///////////////////////////////////////////////////////////////////////////
+
+    // enables distinct(...)[...]
+    template <typename Tail>
+    struct use_directive<qi::domain
+          , terminal_ex<repository::tag::distinct, fusion::vector1<Tail> > >
+      : mpl::true_ {};
+
+    // enables *lazy* distinct(...)[...]
+    template <>
+    struct use_lazy_directive<qi::domain, repository::tag::distinct, 1> 
+      : mpl::true_ {};
+
+}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace repository {namespace qi
+{
+    using repository::distinct_type;
+    using repository::distinct;
+
+    template <typename Subject, typename Tail, typename Modifier>
+    struct distinct_parser
+      : spirit::qi::unary_parser<distinct_parser<Subject, Tail, Modifier> >
+    {
+        template <typename Context, typename Iterator>
+        struct attribute
+        {
+            typedef typename traits::attribute_of<Subject>::type type;
+        };
+
+        distinct_parser(Subject const& subject, Tail const& tail)
+          : subject(subject), tail(tail) {}
+
+        template <typename Iterator, typename Context
+          , typename Skipper, typename Attribute>
+        bool parse(Iterator& first, Iterator const& last
+          , Context& context, Skipper const& skipper, Attribute& attr) const
+        {
+            Iterator iter = first;
+
+            spirit::qi::skip_over(iter, last, skipper);
+            if (!subject.parse(iter, last, context
+              , spirit::qi::detail::unused_skipper<Skipper>(skipper), attr))
+                return false;
+
+            Iterator i = iter;
+            if (tail.parse(i, last, context, unused, unused))
+                return false;
+
+            first = iter;
+            return true;
+        }
+
+        template <typename Context>
+        info what(Context& /*ctx*/) const
+        {
+            return info("distinct");
+        }
+
+        Subject subject;
+        Tail tail;
+    };
+
+}}}}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace spirit { namespace qi
+{
+    ///////////////////////////////////////////////////////////////////////////
+    // Parser generators: make_xxx function (objects)
+    ///////////////////////////////////////////////////////////////////////////
+    template <typename Tail, typename Subject, typename Modifiers>
+    struct make_directive<
+        terminal_ex<repository::tag::distinct, fusion::vector1<Tail> >
+      , Subject, Modifiers>
+    {
+        typedef typename result_of::compile<qi::domain, Tail, Modifiers>::type
+            tail_type;
+
+        typedef repository::qi::distinct_parser<
+            Subject, tail_type, Modifiers> result_type;
+
+        template <typename Terminal>
+        result_type operator()(Terminal const& term, Subject const& subject
+          , Modifiers const& modifiers) const
+        {
+            return result_type(subject
+              , compile<qi::domain>(fusion::at_c<0>(term.args), modifiers));
+        }
+    };
+
+}}}
+
+#endif
+
Added: trunk/boost/spirit/repository/home/support/distinct.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/repository/home/support/distinct.hpp	2009-07-25 21:10:49 EDT (Sat, 25 Jul 2009)
@@ -0,0 +1,22 @@
+//  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_REPOSITORY_SUPPORT_DISTINCT_APR_28_2009_0110PM)
+#define BOOST_SPIRIT_REPOSITORY_SUPPORT_DISTINCT_APR_28_2009_0110PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/terminal.hpp>
+
+namespace boost { namespace spirit { namespace repository
+{
+    // The distinct extended terminal
+    BOOST_SPIRIT_DEFINE_TERMINALS_EX(( distinct ))
+
+}}}
+
+#endif
Added: trunk/boost/spirit/repository/include/qi_distinct.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/repository/include/qi_distinct.hpp	2009-07-25 21:10:49 EDT (Sat, 25 Jul 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_QI_REPOSITORY_DISTINCT
+#define BOOST_SPIRIT_INCLUDE_QI_REPOSITORY_DISTINCT
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/repository/home/qi/distinct.hpp>
+
+#endif