$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: hartmut.kaiser_at_[hidden]
Date: 2008-04-26 16:12:14
Author: hkaiser
Date: 2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
New Revision: 44786
URL: http://svn.boost.org/trac/boost/changeset/44786
Log:
Spirit: applied patch from #1886, closed now.
Text files modified: 
   trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp                   |     5 ++-                                     
   trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp            |     2                                         
   trunk/boost/spirit/home/qi/auxiliary/primitives.hpp                             |    12 +++++-----                              
   trunk/boost/spirit/home/qi/skip.hpp                                             |     2                                         
   trunk/boost/spirit/home/support/argument.hpp                                    |    38 ++++++++++++++++++++++++++++++++-       
   trunk/boost/spirit/home/support/as_variant.hpp                                  |    45 +++++++++++++++++++++++++++++++++++---- 
   trunk/boost/spirit/home/support/detail/action_dispatch.hpp                      |     4 +-                                      
   trunk/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp        |     2                                         
   trunk/boost/spirit/home/support/iterators/detail/combine_policies.hpp           |     2                                         
   trunk/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp         |     2                                         
   trunk/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp      |     4 +-                                      
   trunk/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp           |     8 +++---                                  
   trunk/boost/spirit/home/support/iterators/detail/multi_pass.hpp                 |    18 ++++++++--------                        
   trunk/boost/spirit/home/support/iterators/detail/no_check_policy.hpp            |     2                                         
   trunk/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp         |     4 +-                                      
   trunk/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp |     4 +-                                      
   trunk/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp     |     2                                         
   17 files changed, 113 insertions(+), 43 deletions(-)
Modified: trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp
==============================================================================
--- trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp	(original)
+++ trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_functor.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -89,7 +89,8 @@
           : Data<Iterator, mpl::false_, mpl::false_>
         {
             typedef Data<Iterator, mpl::false_, mpl::false_> base_type;
-
+            typedef std::size_t state_type;
+            
             // initialize the shared data 
             template <typename IterData>
             Data (IterData const& data_, Iterator& first_, Iterator const& last_)
@@ -354,7 +355,7 @@
         
         // we don't need this, but it must be there
         template <typename MultiPass>
-        static void destroy(MultiPass const& mp)
+        static void destroy(MultiPass const&)
         {}  
     };
 
Modified: trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp
==============================================================================
--- trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp	(original)
+++ trunk/boost/spirit/home/lex/lexer/lexertl/lexertl_static_functor.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -345,7 +345,7 @@
         
         // we don't need this, but it must be there
         template <typename MultiPass>
-        static void destroy(MultiPass const& mp)
+        static void destroy(MultiPass const&)
         {}  
     };
 
Modified: trunk/boost/spirit/home/qi/auxiliary/primitives.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/auxiliary/primitives.hpp	(original)
+++ trunk/boost/spirit/home/qi/auxiliary/primitives.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -32,10 +32,10 @@
           , typename Iterator, typename Context
           , typename Skipper, typename Attribute>
         static bool parse(
-            Component const& component
+            Component const& /*component*/
           , Iterator& first, Iterator const& last
-          , Context& context, Skipper const& skipper
-          , Attribute& attr)
+          , Context& /*context*/, Skipper const& skipper
+          , Attribute& /*attr*/)
         {
             qi::skip(first, last, skipper);
             return Parser::test(first, last);
@@ -66,10 +66,10 @@
           , typename Iterator, typename Context
           , typename Skipper, typename Attribute>
         static bool parse(
-            Component const& component
+            Component const& /*component*/
           , Iterator& first, Iterator const& last
-          , Context& context, Skipper const& skipper
-          , Attribute& attr)
+          , Context& /*context*/, Skipper const& skipper
+          , Attribute& /*attr*/)
         {
             qi::skip(first, last, skipper);
 
Modified: trunk/boost/spirit/home/qi/skip.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/skip.hpp	(original)
+++ trunk/boost/spirit/home/qi/skip.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -26,7 +26,7 @@
     }
 
     template <typename Iterator>
-    inline void skip(Iterator& first, Iterator const& last, unused_type)
+    inline void skip(Iterator&, Iterator const&, unused_type)
     {
     }
 }}}
Modified: trunk/boost/spirit/home/support/argument.hpp
==============================================================================
--- trunk/boost/spirit/home/support/argument.hpp	(original)
+++ trunk/boost/spirit/home/support/argument.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -167,17 +167,50 @@
         }
     };
 
-    namespace arg_names
+    struct lexer_state
     {
+        typedef mpl::true_ no_nullary;
 
+        template <typename Env>
+        struct result
+        {
+            typedef typename 
+                mpl::at_c<typename Env::args_type, 3>::type::state_type 
+            type;
+        };
+
+        template <typename Env>
+        typename result<Env>::type
+        eval(Env const& env) const
+        {
+            return fusion::at_c<3>(env.args()).state;
+        }
+    };
+    
+    namespace arg_names
+    {
+    // _0 refers to the whole attribute as generated by the lhs parser
         phoenix::actor<attribute_context> const _0 = attribute_context();
-        
+
+    // _1, _2, ... refer to the attributes of the single components the lhs 
+    // parser is composed of
         phoenix::actor<argument<0> > const _1 = argument<0>();
         phoenix::actor<argument<1> > const _2 = argument<1>();
         phoenix::actor<argument<2> > const _3 = argument<2>();
 
+    // 'pass' may be used to make a match fail in retrospective
         phoenix::actor<phoenix::argument<2> > const pass = phoenix::argument<2>();
 
+    // 'id' may be used in a lexer semantic action to refer to the token id 
+    // of a matched token 
+        phoenix::actor<phoenix::argument<1> > const id = phoenix::argument<1>();
+        
+    // 'state' may be used in a lexer semantic action to refer to the 
+    // current lexer state 
+        phoenix::actor<lexer_state> const state = lexer_state();
+    
+    // _val refers to the |return| value of a rule
+    // _r0, _r1, ... refer to the rule arguments
         phoenix::actor<attribute<0> > const _val = attribute<0>();
         phoenix::actor<attribute<0> > const _r0 = attribute<0>();
         phoenix::actor<attribute<1> > const _r1 = attribute<1>();
@@ -187,6 +220,7 @@
         BOOST_PP_REPEAT_FROM_TO(
             3, SPIRIT_ARG_LIMIT, SPIRIT_DECLARE_ARG, _)
 
+    // _a, _b, ... refer to the local variables of a rule
         phoenix::actor<local_var<0> > const _a = local_var<0>();
         phoenix::actor<local_var<1> > const _b = local_var<1>();
         phoenix::actor<local_var<2> > const _c = local_var<2>();
Modified: trunk/boost/spirit/home/support/as_variant.hpp
==============================================================================
--- trunk/boost/spirit/home/support/as_variant.hpp	(original)
+++ trunk/boost/spirit/home/support/as_variant.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -14,6 +14,11 @@
 #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
 #include <boost/variant/variant_fwd.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/contains.hpp>
+#include <boost/type_traits/is_same.hpp>
 
 namespace boost { namespace spirit { namespace detail
 {
@@ -50,6 +55,22 @@
 #undef BOOST_FUSION_NEXT_CALL_ITERATOR
 #undef BOOST_FUSION_VALUE_OF_ITERATOR
 
+    template <typename Sequence>
+    struct generate_variant
+    {
+        // build a variant generator being able to generate a variant holding 
+        // all of the types as given in the typelist 
+        typedef typename
+            detail::as_variant<fusion::result_of::size<Sequence>::value>
+        gen;
+        
+        // use this generator to create the actual variant
+        typedef typename gen::template apply<
+                typename fusion::result_of::begin<Sequence>::type
+            >::type 
+        type;
+    };
+    
 }}}
 
 namespace boost { namespace spirit
@@ -57,11 +78,25 @@
     template <typename Sequence>
     struct as_variant
     {
-        typedef typename
-            detail::as_variant<fusion::result_of::size<Sequence>::value>
-        gen;
-        typedef typename gen::
-            template apply<typename fusion::result_of::begin<Sequence>::type>::type
+        // make sure each of the types occurs only once in the type list
+        typedef typename 
+            mpl::fold<
+                Sequence, mpl::vector<>,
+                mpl::if_<
+                    mpl::contains<mpl::_1, mpl::_2>, 
+                    mpl::_1, mpl::push_back<mpl::_1, mpl::_2> 
+                > 
+            >::type 
+        new_sequence;
+
+        // if there is only one type in the list of types we strip off the 
+        // variant all together
+        typedef typename 
+            mpl::eval_if<
+                mpl::equal_to<mpl::size<new_sequence>, mpl::int_<1> >,
+                mpl::deref<mpl::front<Sequence> >,
+                detail::generate_variant<new_sequence>
+            >::type 
         type;
     };
 }}
Modified: trunk/boost/spirit/home/support/detail/action_dispatch.hpp
==============================================================================
--- trunk/boost/spirit/home/support/detail/action_dispatch.hpp	(original)
+++ trunk/boost/spirit/home/support/detail/action_dispatch.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -53,7 +53,7 @@
     template <typename RT, typename A0
       , typename Attribute, typename Context>
     bool action_dispatch(RT(*f)(A0)
-      , Attribute& attr, Context& context)
+      , Attribute& attr, Context&)
     {
         f(attr);
         return true;
@@ -61,7 +61,7 @@
 
     template <typename RT, typename Attribute, typename Context>
     bool action_dispatch(RT(*f)()
-      , Attribute& attr, Context& context)
+      , Attribute&, Context&)
     {
         f();
         return true;
Modified: trunk/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -76,7 +76,7 @@
             }
 
             template <typename MultiPass>
-            static void destroy(MultiPass& mp) 
+            static void destroy(MultiPass&) 
             {}
 
         protected:
Modified: trunk/boost/spirit/home/support/iterators/detail/combine_policies.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/combine_policies.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/combine_policies.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -344,7 +344,7 @@
       : Storage
     {
         multi_pass_unique() {}
-        multi_pass_unique(T const& /*x*/) {}
+        multi_pass_unique(T const&) {}
 
         template <typename MultiPass>
         static void destroy(MultiPass& mp)
Modified: trunk/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/first_owner_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -49,7 +49,7 @@
             // to, so don't swap first_.  swap is only called from operator=
 
             template <typename MultiPass>
-            static bool is_unique(MultiPass const& mp) 
+            static bool is_unique(MultiPass const&) 
             {
                 return false; // no way to know, so always return false
             }
Modified: trunk/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -77,7 +77,7 @@
 
             // test, whether we reached the end of the underlying stream
             template <typename MultiPass>
-            static bool input_at_eof(MultiPass const& mp, value_type const& t) 
+            static bool input_at_eof(MultiPass const& mp, value_type const&) 
             {
                 return mp.input == T();
             }
@@ -97,7 +97,7 @@
         template <typename T>
         struct shared
         {
-            explicit shared(T x) {}
+            explicit shared(T) {}
 
             // no shared data elements
         };
Modified: trunk/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -33,7 +33,7 @@
 
         protected:
             unique() {}
-            explicit unique(T x) {}
+            explicit unique(T) {}
 
         public:
             template <typename MultiPass>
@@ -51,13 +51,13 @@
 
             // test, whether we reached the end of the underlying stream
             template <typename MultiPass>
-            static bool input_at_eof(MultiPass const& mp, value_type const& t) 
+            static bool input_at_eof(MultiPass const&, value_type const& t) 
             {
                 return 0 == t;
             }
 
             template <typename MultiPass>
-            static bool input_is_valid(MultiPass const& mp, value_type const& t) 
+            static bool input_is_valid(MultiPass const&, value_type const& t) 
             {
                 return -1 != t;
             }
@@ -67,7 +67,7 @@
         template <typename T>
         struct shared
         {
-            explicit shared(T x) {}
+            explicit shared(T) {}
 
             // no shared data elements
         };
Modified: trunk/boost/spirit/home/support/iterators/detail/multi_pass.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/multi_pass.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/multi_pass.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -58,12 +58,12 @@
         default_input_policy() {}
         
         template <typename Functor>
-        default_input_policy(Functor const& x) {}
+        default_input_policy(Functor const&) {}
         
         template <typename MultiPass>
-        static void destroy(MultiPass& mp) {}
+        static void destroy(MultiPass&) {}
         
-        void swap(default_input_policy& /*x*/) {}
+        void swap(default_input_policy&) {}
         
         template <typename MultiPass, typename TokenType>
         static TokenType& advance_input(MultiPass& mp, TokenType& curtok);
@@ -78,12 +78,12 @@
     struct default_ownership_policy
     {
         template <typename MultiPass>
-        static void destroy(MultiPass& mp) {}
+        static void destroy(MultiPass&) {}
 
         void swap(default_ownership_policy&) {}
 
         template <typename MultiPass>
-        static void clone(MultiPass& mp) {}
+        static void clone(MultiPass&) {}
 
         template <typename MultiPass>
         static bool release(MultiPass& mp);
@@ -95,7 +95,7 @@
     struct default_storage_policy
     {
         template <typename MultiPass>
-        static void destroy(MultiPass& mp) {}
+        static void destroy(MultiPass&) {}
 
         void swap(default_storage_policy&) {}
 
@@ -103,10 +103,10 @@
         static typename MultiPass::reference dereference(MultiPass const& mp);
         
         template <typename MultiPass>
-        static void increment(MultiPass& mp) {}
+        static void increment(MultiPass&) {}
         
         template <typename MultiPass>
-        static void clear_queue(MultiPass& mp) {}
+        static void clear_queue(MultiPass&) {}
 
         template <typename MultiPass>
         static bool is_eof(MultiPass const& mp);
@@ -121,7 +121,7 @@
     struct default_checking_policy
     {
         template <typename MultiPass>
-        static void destroy(MultiPass& mp) {}
+        static void destroy(MultiPass&) {}
 
         void swap(default_checking_policy&) {}
 
Modified: trunk/boost/spirit/home/support/iterators/detail/no_check_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/no_check_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/no_check_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -31,7 +31,7 @@
             static void clear_queue(MultiPass&) {}
 
             template <typename MultiPass>
-            static void destroy(MultiPass& mp) {}
+            static void destroy(MultiPass&) {}
         };
 
         ///////////////////////////////////////////////////////////////////////
Modified: trunk/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -25,7 +25,7 @@
         ///////////////////////////////////////////////////////////////////////
         struct unique // : detail::default_ownership_policy
         {
-            void swap(unique& x) {}
+            void swap(unique&) {}
 
             // clone is called when a copy of the iterator is made, so 
             // increment the ref-count.
@@ -54,7 +54,7 @@
             }
 
             template <typename MultiPass>
-            static void destroy(MultiPass& mp) 
+            static void destroy(MultiPass&) 
             {}
         };
 
Modified: trunk/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -71,10 +71,10 @@
 
         protected:
             unique() {}
-            explicit unique(Functor const& x) {}
+            explicit unique(Functor const&) {}
 
         public:
-            void swap(unique& x) {}
+            void swap(unique&) {}
 
             // get the next token
             template <typename MultiPass>
Modified: trunk/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp
==============================================================================
--- trunk/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp	(original)
+++ trunk/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp	2008-04-26 16:12:12 EDT (Sat, 26 Apr 2008)
@@ -145,7 +145,7 @@
             }
             
             template <typename MultiPass>
-            static void destroy(MultiPass& mp) 
+            static void destroy(MultiPass&) 
             {}
 
         protected: