$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r59353 - trunk/boost/spirit/home/support/algorithm
From: hartmut.kaiser_at_[hidden]
Date: 2010-01-29 21:12:39
Author: hkaiser
Date: 2010-01-29 21:12:38 EST (Fri, 29 Jan 2010)
New Revision: 59353
URL: http://svn.boost.org/trac/boost/changeset/59353
Log:
Spirit: fixing sequences with unused attribute at the end
Text files modified: 
   trunk/boost/spirit/home/support/algorithm/any_if.hpp    |    82 ++++++++++++++++++++++++--------------- 
   trunk/boost/spirit/home/support/algorithm/any_if_ns.hpp |    28 ++++++------                            
   2 files changed, 64 insertions(+), 46 deletions(-)
Modified: trunk/boost/spirit/home/support/algorithm/any_if.hpp
==============================================================================
--- trunk/boost/spirit/home/support/algorithm/any_if.hpp	(original)
+++ trunk/boost/spirit/home/support/algorithm/any_if.hpp	2010-01-29 21:12:38 EST (Fri, 29 Jan 2010)
@@ -26,6 +26,8 @@
 #include <boost/mpl/apply.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/identity.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
 
 namespace boost { namespace spirit
 {
@@ -49,15 +51,21 @@
         //  otherwise Iterator2
         namespace result_of
         {
-            template <typename Iterator1, typename Iterator2, typename Pred>
+            template <
+                typename Iterator1, typename Iterator2, typename Last2
+              , typename Pred>
             struct attribute_next
             {
-                typedef typename apply_predicate<Iterator1, Pred>::type pred;
+                typedef mpl::and_<
+                    apply_predicate<Iterator1, Pred>
+                  , mpl::not_<fusion::result_of::equal_to<Iterator2, Last2> >
+                > pred;
+
                 typedef typename
                     mpl::eval_if<
-                        pred,
-                        fusion::result_of::next<Iterator2>,
-                        mpl::identity<Iterator2>
+                        pred
+                      , fusion::result_of::next<Iterator2>
+                      , mpl::identity<Iterator2>
                     >::type
                 type;
 
@@ -84,13 +92,16 @@
             };
         }
 
-        template <typename Pred, typename Iterator1, typename Iterator2>
+        template <
+            typename Pred, typename Iterator1, typename Last2
+          , typename Iterator2>
         inline typename
-            result_of::attribute_next<Iterator1, Iterator2, Pred
+            result_of::attribute_next<Iterator1, Iterator2, Last2, Pred
         >::type const
         attribute_next(Iterator2 const& i)
         {
-            return result_of::attribute_next<Iterator1, Iterator2, Pred>::call(i);
+            return result_of::attribute_next<
+                Iterator1, Iterator2, Last2, Pred>::call(i);
         }
 
         ///////////////////////////////////////////////////////////////////////
@@ -98,15 +109,21 @@
         //  otherwise unused
         namespace result_of
         {
-            template <typename Iterator1, typename Iterator2, typename Pred>
+            template <
+                typename Iterator1, typename Iterator2, typename Last2
+              , typename Pred>
             struct attribute_value
             {
-                typedef typename apply_predicate<Iterator1, Pred>::type pred;
+                typedef mpl::and_<
+                    apply_predicate<Iterator1, Pred>
+                  , mpl::not_<fusion::result_of::equal_to<Iterator2, Last2> >
+                > pred;
+
                 typedef typename
                     mpl::eval_if<
-                        pred,
-                        fusion::result_of::deref<Iterator2>,
-                        mpl::identity<unused_type const>
+                        pred
+                      , fusion::result_of::deref<Iterator2>
+                      , mpl::identity<unused_type const>
                     >::type
                 type;
 
@@ -133,42 +150,44 @@
             };
         }
 
-        template <typename Pred, typename Iterator1, typename Iterator2>
+        template <
+            typename Pred, typename Iterator1, typename Last2
+          , typename Iterator2>
         inline typename
-            result_of::attribute_value<Iterator1, Iterator2, Pred
+            result_of::attribute_value<Iterator1, Iterator2, Last2, Pred
         >::type
         attribute_value(Iterator2 const& i)
         {
-            return result_of::attribute_value<Iterator1, Iterator2, Pred>::call(i);
+            return result_of::attribute_value<
+                Iterator1, Iterator2, Last2, Pred>::call(i);
         }
 
         ///////////////////////////////////////////////////////////////////////
         template <
-            typename Pred, typename First1, typename Last, typename First2,
-            typename F
-        >
+            typename Pred, typename First1, typename Last1, typename First2
+          , typename Last2, typename F>
         inline bool
-        any_if (First1 const&, First2 const&, Last const&, F const&, mpl::true_)
+        any_if (First1 const&, First2 const&, Last1 const&, Last2 const&
+          , F const&, mpl::true_)
         {
             return false;
         }
 
         template <
-            typename Pred, typename First1, typename Last, typename First2,
-            typename F
-        >
+            typename Pred, typename First1, typename Last1, typename First2
+          , typename Last2, typename F>
         inline bool
-        any_if (First1 const& first1, First2 const& first2, Last const& last,
-            F& f, mpl::false_)
+        any_if (First1 const& first1, First2 const& first2, Last1 const& last1
+          , Last2 const& last2, F& f, mpl::false_)
         {
-            return f(*first1, attribute_value<Pred, First1>(first2)) ||
+            return f(*first1, attribute_value<Pred, First1, Last2>(first2)) ||
                 detail::any_if<Pred>(
                     fusion::next(first1)
-                  , attribute_next<Pred, First1>(first2)
-                  , last
+                  , attribute_next<Pred, First1, Last2>(first2)
+                  , last1, last2
                   , f
                   , fusion::result_of::equal_to<
-                        typename fusion::result_of::next<First1>::type, Last>());
+                        typename fusion::result_of::next<First1>::type, Last1>());
         }
     }
 
@@ -177,9 +196,8 @@
     any_if(Sequence1 const& seq1, Sequence2& seq2, F f, Pred)
     {
         return detail::any_if<Pred>(
-                fusion::begin(seq1)
-              , fusion::begin(seq2)
-              , fusion::end(seq1)
+                fusion::begin(seq1), fusion::begin(seq2)
+              , fusion::end(seq1), fusion::end(seq2)
               , f
               , fusion::result_of::equal_to<
                     typename fusion::result_of::begin<Sequence1>::type
Modified: trunk/boost/spirit/home/support/algorithm/any_if_ns.hpp
==============================================================================
--- trunk/boost/spirit/home/support/algorithm/any_if_ns.hpp	(original)
+++ trunk/boost/spirit/home/support/algorithm/any_if_ns.hpp	2010-01-29 21:12:38 EST (Fri, 29 Jan 2010)
@@ -30,31 +30,32 @@
     namespace detail
     {
         template <
-            typename Pred, typename First1, typename Last, typename First2,
-            typename F
+            typename Pred, typename First1, typename Last1, typename First2
+          , typename Last2, typename F
         >
         inline bool
-        any_if_ns(First1 const&, First2 const&, Last const&, F const&, mpl::true_)
+        any_if_ns(First1 const&, First2 const&, Last1 const&, Last2 const&
+          , F const&, mpl::true_)
         {
             return false;
         }
 
         template <
-            typename Pred, typename First1, typename Last, typename First2,
-            typename F
+            typename Pred, typename First1, typename Last1, typename First2
+          , typename Last2, typename F
         >
         inline bool
-        any_if_ns(First1 const& first1, First2 const& first2, Last const& last,
-            F& f, mpl::false_)
+        any_if_ns(First1 const& first1, First2 const& first2
+          , Last1 const& last1, Last2 const& last2, F& f, mpl::false_)
         {
-            return (0 != (f(*first1, attribute_value<Pred, First1>(first2)) |
+            return (0 != (f(*first1, attribute_value<Pred, First1, Last2>(first2)) |
                 detail::any_if_ns<Pred>(
                     fusion::next(first1)
-                  , attribute_next<Pred, First1>(first2)
-                  , last
+                  , attribute_next<Pred, First1, Last2>(first2)
+                  , last1, last2
                   , f
                   , fusion::result_of::equal_to<
-                        typename fusion::result_of::next<First1>::type, Last>())));
+                        typename fusion::result_of::next<First1>::type, Last1>())));
         }
     }
 
@@ -63,9 +64,8 @@
     any_if_ns(Sequence1 const& seq1, Sequence2& seq2, F f, Pred)
     {
         return detail::any_if_ns<Pred>(
-                fusion::begin(seq1)
-              , fusion::begin(seq2)
-              , fusion::end(seq1)
+                fusion::begin(seq1), fusion::begin(seq2)
+              , fusion::end(seq1), fusion::end(seq2)
               , f
               , fusion::result_of::equal_to<
                     typename fusion::result_of::begin<Sequence1>::type