$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r72427 - in branches/release: boost/range boost/range/adaptor boost/range/algorithm boost/range/algorithm_ext boost/range/detail libs/range libs/range/doc/reference/adaptors/examples libs/range/test libs/range/test/adaptor_test libs/range/test/compile_fail libs/range/test/test_driver
From: neil_at_[hidden]
Date: 2011-06-05 17:48:00
Author: neilgroves
Date: 2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
New Revision: 72427
URL: http://svn.boost.org/trac/boost/changeset/72427
Log:
[boost][range] - merge from trunk of miscellaneous defect fixes
Added:
   branches/release/libs/range/test/compile_fail/
      - copied from r70855, /trunk/libs/range/test/compile_fail/
   branches/release/libs/range/test/compile_fail/iterator_range1.cpp
      - copied unchanged from r70855, /trunk/libs/range/test/compile_fail/iterator_range1.cpp
   branches/release/libs/range/test/ticket_5486.cpp
      - copied unchanged from r72177, /trunk/libs/range/test/ticket_5486.cpp
   branches/release/libs/range/test/ticket_5544_terminate_irange.cpp
      - copied unchanged from r72076, /trunk/libs/range/test/ticket_5544_terminate_irange.cpp
   branches/release/libs/range/test/ticket_5547.cpp
      - copied unchanged from r72177, /trunk/libs/range/test/ticket_5547.cpp
   branches/release/libs/range/test/ticket_5556_is_sorted_namespace.cpp
      - copied unchanged from r72177, /trunk/libs/range/test/ticket_5556_is_sorted_namespace.cpp
Properties modified: 
   branches/release/boost/range/   (props changed)
   branches/release/libs/range/   (props changed)
Text files modified: 
   branches/release/boost/range/adaptor/adjacent_filtered.hpp                        |     4 -                                       
   branches/release/boost/range/adaptor/define_adaptor.hpp                           |    18 -----                                   
   branches/release/boost/range/adaptor/strided.hpp                                  |    43 ++++++-------                           
   branches/release/boost/range/adaptor/transformed.hpp                              |     4                                         
   branches/release/boost/range/algorithm/for_each.hpp                               |    66 ++++++++++++++++++++                    
   branches/release/boost/range/algorithm_ext/is_sorted.hpp                          |    42 ++++---------                           
   branches/release/boost/range/any_range.hpp                                        |     1                                         
   branches/release/boost/range/detail/demote_iterator_traversal_tag.hpp             |    16 ++++                                    
   branches/release/boost/range/detail/detail_str.hpp                                |     4                                         
   branches/release/boost/range/detail/join_iterator.hpp                             |    30 +++++++++                               
   branches/release/boost/range/has_range_iterator.hpp                               |     2                                         
   branches/release/boost/range/irange.hpp                                           |    18 ++--                                    
   branches/release/boost/range/iterator_range_core.hpp                              |   100 +++++++++++++++++++++++++++++++         
   branches/release/boost/range/join.hpp                                             |     8 ++                                      
   branches/release/boost/range/sub_range.hpp                                        |    51 ++++++++--------                        
   branches/release/libs/range/doc/reference/adaptors/examples/adjacent_filtered.cpp |     2                                         
   branches/release/libs/range/doc/reference/adaptors/examples/indexed.cpp           |     2                                         
   branches/release/libs/range/doc/reference/adaptors/examples/transformed.cpp       |     2                                         
   branches/release/libs/range/test/Jamfile.v2                                       |    20 ++++++                                  
   branches/release/libs/range/test/adaptor_test/strided.cpp                         |    33 ++++++++++                              
   branches/release/libs/range/test/irange.cpp                                       |    58 +++++++++++++----                       
   branches/release/libs/range/test/iterator_range.cpp                               |   124 +++++++++++++++++++++++++++++++++++++++ 
   branches/release/libs/range/test/test_driver/range_return_test_driver.hpp         |     5                                         
   23 files changed, 512 insertions(+), 141 deletions(-)
Modified: branches/release/boost/range/adaptor/adjacent_filtered.hpp
==============================================================================
--- branches/release/boost/range/adaptor/adjacent_filtered.hpp	(original)
+++ branches/release/boost/range/adaptor/adjacent_filtered.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -143,10 +143,6 @@
                          skip_iter(boost::end(r), boost::end(r), p))
             {
             }
-
-        private:
-            P m_pred;
-            R* m_range;
         };
 
         template< class T >
Modified: branches/release/boost/range/adaptor/define_adaptor.hpp
==============================================================================
--- branches/release/boost/range/adaptor/define_adaptor.hpp	(original)
+++ branches/release/boost/range/adaptor/define_adaptor.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -44,24 +44,6 @@
         return range_adaptor <const Range>(rng); \
     }
 
-#define BOOST_DEFINE_RANGE_ADAPTOR_1( adaptor_name, range_adaptor, adaptor_class ) \
-    template<typename Range> range_adaptor <Range> \
-        operator|(Range& rng, const adaptor_name & args) \
-    { \
-        return range_adaptor <Range>(rng, args.arg1); \
-    } \
-    template<typename Range> range_adaptor <const Range> \
-        operator|(const Range& rng, const adaptor_name & args) \
-    { \
-        return range_adaptor <Range>(rng, args.arg1); \
-    } \
-    template<typename Range, typename Arg1> \
-    range_adaptor<Range> \
-    make_##adaptor_name(Range& rng, Arg1 arg1) \
-    { \
-        return range_adaptor<Range>(rng, arg1); \
-    }
-
 #define BOOST_DEFINE_RANGE_ADAPTOR_1( adaptor_name, range_adaptor, arg1_type ) \
     struct adaptor_name \
     { \
Modified: branches/release/boost/range/adaptor/strided.hpp
==============================================================================
--- branches/release/boost/range/adaptor/strided.hpp	(original)
+++ branches/release/boost/range/adaptor/strided.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -176,6 +176,7 @@
             strided_iterator()
                 : m_first()
                 , m_last()
+                , m_index(0)
                 , m_stride()
             {
             }
@@ -184,6 +185,7 @@
                 : super_t(it)
                 , m_first(first)
                 , m_last(last)
+                , m_index(stride ? (it - first) / stride : 0)
                 , m_stride(stride)
             {
             }
@@ -194,6 +196,7 @@
                 : super_t(other.base())
                 , m_first(other.base_begin())
                 , m_last(other.base_end())
+                , m_index(other.get_index())
                 , m_stride(other.get_stride())
             {
             }
@@ -201,44 +204,37 @@
             base_iterator base_begin() const { return m_first; }
             base_iterator base_end() const { return m_last; }
             difference_type get_stride() const { return m_stride; }
+            difference_type get_index() const { return m_index; }
 
         private:
             void increment()
             {
-                base_iterator& it = this->base_reference();
-                if ((m_last - it) > m_stride)
-                    it += m_stride;
+                m_index += m_stride;
+                if (m_index < (m_last - m_first))
+                    this->base_reference() = m_first + m_index;
                 else
-                    it = m_last;
+                    this->base_reference() = m_last;
             }
 
             void decrement()
             {
-                base_iterator& it = this->base_reference();
-                if ((it - m_first) > m_stride)
-                    it -= m_stride;
+                m_index -= m_stride;
+                if (m_index >= 0)
+                    this->base_reference() = m_first + m_index;
                 else
-                    it = m_first;
+                    this->base_reference() = m_first;
             }
 
             void advance(difference_type offset)
             {
-                base_iterator& it = this->base_reference();
                 offset *= m_stride;
-                if (offset >= 0)
-                {
-                    if ((m_last - it) > offset)
-                        it += offset;
-                    else
-                        it = m_last;
-                }
+                m_index += offset;
+                if (m_index < 0)
+                    this->base_reference() = m_first;
+                else if (m_index > (m_last - m_first))
+                    this->base_reference() = m_last;
                 else
-                {
-                    if ((m_first - it) > offset)
-                        it += offset;
-                    else
-                        it = m_first;
-                }
+                    this->base_reference() = m_first + m_index;
             }
 
             template<class OtherIterator>
@@ -252,12 +248,13 @@
 
             bool equal(const strided_iterator& other) const
             {
-                return other.base() == this->base();
+                return this->base() == other.base();
             }
 
         private:
             base_iterator m_first;
             base_iterator m_last;
+            difference_type m_index;
             difference_type m_stride;
         };
 
Modified: branches/release/boost/range/adaptor/transformed.hpp
==============================================================================
--- branches/release/boost/range/adaptor/transformed.hpp	(original)
+++ branches/release/boost/range/adaptor/transformed.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -42,8 +42,8 @@
             typedef R source_range_type;
 
             transformed_range( F f, R& r )
-                : base( make_transform_iterator( boost::begin(r), f ),
-                        make_transform_iterator( boost::end(r), f ) )
+                : base( boost::make_transform_iterator( boost::begin(r), f ),
+                        boost::make_transform_iterator( boost::end(r), f ) )
 
             { }
         };
Modified: branches/release/boost/range/algorithm/for_each.hpp
==============================================================================
--- branches/release/boost/range/algorithm/for_each.hpp	(original)
+++ branches/release/boost/range/algorithm/for_each.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -13,13 +13,53 @@
 #include <boost/range/begin.hpp>
 #include <boost/range/end.hpp>
 #include <boost/range/concepts.hpp>
+#include <boost/ref.hpp>
+#include <boost/utility.hpp>
 #include <algorithm>
 
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+#include <xutility>
+#endif
+
 namespace boost
 {
     namespace range
     {
 
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+        namespace for_each_detail
+        {
+            template<typename Iterator, typename UnaryFunction>
+            inline UnaryFunction
+            for_each_impl(Iterator first, Iterator last, UnaryFunction fun,
+                          typename enable_if<
+                            is_reference_wrapper<UnaryFunction>,
+                            void
+                          >::type* = 0)
+            {
+                    typedef typename std::_Get_unchecked_type<Iterator>::type
+                                unchecked_iterator;
+
+                    unchecked_iterator unchecked_last = std::_Unchecked(last);
+                    for (unchecked_iterator unchecked_first = std::_Unchecked(first); first != last; ++first)
+                            fun.get()(*unchecked_first);
+
+                    return fun;
+            }
+
+            template<typename Iterator, typename UnaryFunction>
+            inline UnaryFunction
+            for_each_impl(Iterator first, Iterator last, UnaryFunction fn,
+                          typename disable_if<
+                            is_reference_wrapper<UnaryFunction>,
+                            void
+                          >::type* = 0)
+            {
+                return std::for_each<Iterator, UnaryFunction>(first, last, fn);
+            }
+        }
+#endif
+
 /// \brief template function for_each
 ///
 /// range-based version of the for_each std algorithm
@@ -30,7 +70,18 @@
 inline UnaryFunction for_each(SinglePassRange & rng, UnaryFunction fun)
 {
     BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<SinglePassRange> ));
-    return std::for_each(boost::begin(rng),boost::end(rng),fun);
+    
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+        return for_each_detail::for_each_impl<
+                typename range_iterator<SinglePassRange>::type,
+                UnaryFunction
+        >(boost::begin(rng), boost::end(rng), fun);
+#else
+    return std::for_each<
+        BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type,
+        UnaryFunction
+    >(boost::begin(rng),boost::end(rng),fun);
+#endif    
 }
 
 /// \overload
@@ -38,7 +89,18 @@
 inline UnaryFunction for_each(const SinglePassRange& rng, UnaryFunction fun)
 {
     BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange> ));
-    return std::for_each(boost::begin(rng), boost::end(rng), fun);
+    
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1600)
+        return for_each_detail::for_each_impl<
+                typename range_iterator<const SinglePassRange>::type,
+                UnaryFunction
+        >(boost::begin(rng), boost::end(rng), fun);
+#else    
+    return std::for_each<
+        BOOST_DEDUCED_TYPENAME range_iterator<const SinglePassRange>::type,
+        UnaryFunction
+    >(boost::begin(rng), boost::end(rng), fun);
+#endif    
 }
 
     } // namespace range
Modified: branches/release/boost/range/algorithm_ext/is_sorted.hpp
==============================================================================
--- branches/release/boost/range/algorithm_ext/is_sorted.hpp	(original)
+++ branches/release/boost/range/algorithm_ext/is_sorted.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -1,3 +1,4 @@
+//  Copyright Bryce Lelbach 2010
 //  Copyright Neil Groves 2009. Use, modification and
 //  distribution is subject to the Boost Software License, Version
 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -14,45 +15,26 @@
 #include <boost/range/end.hpp>
 #include <boost/range/concepts.hpp>
 #include <boost/range/value_type.hpp>
+#include <boost/detail/is_sorted.hpp>
 #include <algorithm>
 
 namespace boost
 {
-    namespace range_detail
-    {
-        template<class ForwardIterator>
-        inline bool is_sorted(ForwardIterator first, ForwardIterator last)
-        {
-            for (ForwardIterator next = first; first != last && ++next != last; ++first)
-                if (*next < *first)
-                    return false;
-            return true;
-        }
-
-        template<class ForwardIterator, class BinaryPredicate>
-        inline bool is_sorted(ForwardIterator first, ForwardIterator last, BinaryPredicate pred)
-        {
-            for (ForwardIterator next = first; first != last && ++next != last; ++first)
-                if (pred(*next, *first))
-                    return false;
-            return true;
-        }
-    }
-
     namespace range
     {
 
-/// \brief template function count
+/// \brief template function is_sorted
 ///
-/// range-based version of the count std algorithm
+/// range-based version of the is_sorted std algorithm
 ///
 /// \pre SinglePassRange is a model of the SinglePassRangeConcept
 template<class SinglePassRange>
 inline bool is_sorted(const SinglePassRange& rng)
 {
     BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<const SinglePassRange>));
-    BOOST_RANGE_CONCEPT_ASSERT((LessThanComparableConcept<BOOST_DEDUCED_TYPENAME range_value<const SinglePassRange>::type>));
-    return range_detail::is_sorted(boost::begin(rng), boost::end(rng));
+    BOOST_RANGE_CONCEPT_ASSERT((LessThanComparableConcept<BOOST_DEDUCED_TYPENAME
+      range_value<const SinglePassRange>::type>));
+    return ::boost::detail::is_sorted(boost::begin(rng), boost::end(rng));
 }
 
 /// \overload
@@ -60,12 +42,16 @@
 inline bool is_sorted(const SinglePassRange& rng, BinaryPredicate pred)
 {
     BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<const SinglePassRange>));
-    BOOST_RANGE_CONCEPT_ASSERT((BinaryPredicateConcept<BinaryPredicate, BOOST_DEDUCED_TYPENAME range_value<const SinglePassRange>::type, BOOST_DEDUCED_TYPENAME range_value<const SinglePassRange>::type>));
-    return range_detail::is_sorted(boost::begin(rng), boost::end(rng), pred);
+    BOOST_RANGE_CONCEPT_ASSERT((BinaryPredicateConcept<BinaryPredicate,
+      BOOST_DEDUCED_TYPENAME range_value<const SinglePassRange>::type,
+      BOOST_DEDUCED_TYPENAME range_value<const SinglePassRange>::type>));
+    return ::boost::detail::is_sorted(boost::begin(rng), boost::end(rng), pred);
 }
 
     } // namespace range
-    using range::is_sorted;
+
+using range::is_sorted;
+
 } // namespace boost
 
 #endif // include guard
Modified: branches/release/boost/range/any_range.hpp
==============================================================================
--- branches/release/boost/range/any_range.hpp	(original)
+++ branches/release/boost/range/any_range.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -15,6 +15,7 @@
 #include <boost/iterator/iterator_facade.hpp>
 #include <boost/iterator/iterator_adaptor.hpp>
 #include <boost/range/detail/any_iterator.hpp>
+#include <boost/range/concepts.hpp>
 #include <boost/range/reference.hpp>
 #include <boost/range/value_type.hpp>
 #include <boost/range/iterator_range_core.hpp>
Modified: branches/release/boost/range/detail/demote_iterator_traversal_tag.hpp
==============================================================================
--- branches/release/boost/range/detail/demote_iterator_traversal_tag.hpp	(original)
+++ branches/release/boost/range/detail/demote_iterator_traversal_tag.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -5,6 +5,9 @@
 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
 //  http://www.boost.org/LICENSE_1_0.txt)
 //
+// Acknowledgements:
+// aschoedl supplied a fix to supply the level of interoperability I had
+// originally intended, but failed to implement.
 //
 // For more information, see http://www.boost.org/libs/range/
 //
@@ -19,12 +22,12 @@
     {
 
 template<class IteratorTraversalTag1, class IteratorTraversalTag2>
-struct demote_iterator_traversal_tag
+struct inner_demote_iterator_traversal_tag
 {
 };
 
 #define BOOST_DEMOTE_TRAVERSAL_TAG( Tag1, Tag2, ResultTag ) \
-template<> struct demote_iterator_traversal_tag< Tag1 , Tag2 > \
+template<> struct inner_demote_iterator_traversal_tag< Tag1 , Tag2 > \
 { \
     typedef ResultTag type; \
 };
@@ -73,6 +76,15 @@
 
 #undef BOOST_DEMOTE_TRAVERSAL_TAG
 
+template<class IteratorTraversalTag1, class IteratorTraversalTag2>
+struct demote_iterator_traversal_tag
+    : inner_demote_iterator_traversal_tag<
+        typename boost::detail::pure_traversal_tag< IteratorTraversalTag1 >::type,
+        typename boost::detail::pure_traversal_tag< IteratorTraversalTag2 >::type
+      >
+{
+};
+
     } // namespace range_detail
 } // namespace boost
 
Modified: branches/release/boost/range/detail/detail_str.hpp
==============================================================================
--- branches/release/boost/range/detail/detail_str.hpp	(original)
+++ branches/release/boost/range/detail/detail_str.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -134,8 +134,8 @@
 
 #include <boost/range/detail/begin.hpp>
 #include <boost/range/detail/end.hpp>
-#include <boost/range/detail/size_type>
-#include <boost/range/detail/value_type>
+#include <boost/range/detail/size_type.hpp>
+#include <boost/range/detail/value_type.hpp>
 #include <boost/range/detail/common.hpp>
 
 namespace boost 
Modified: branches/release/boost/range/detail/join_iterator.hpp
==============================================================================
--- branches/release/boost/range/detail/join_iterator.hpp	(original)
+++ branches/release/boost/range/detail/join_iterator.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -5,6 +5,9 @@
 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
 //  http://www.boost.org/LICENSE_1_0.txt)
 //
+// Acknowledgements:
+// aschoedl contributed an improvement to the determination
+// of the Reference type parameter.
 //
 // For more information, see http://www.boost.org/libs/range/
 //
@@ -120,7 +123,32 @@
 template<typename Iterator1
        , typename Iterator2
        , typename ValueType = typename iterator_value<Iterator1>::type
-       , typename Reference = typename iterator_reference<Iterator1>::type
+       // find least demanding, commonly supported reference type, in the order &, const&, and by-value:
+       , typename Reference = typename mpl::if_c<
+                !is_reference<typename iterator_reference<Iterator1>::type>::value
+             || !is_reference<typename iterator_reference<Iterator2>::type>::value,
+                        typename remove_const<
+                            typename remove_reference<
+                                typename iterator_reference<Iterator1>::type
+                            >::type
+                        >::type,
+                        typename mpl::if_c<
+                            is_const<
+                                typename remove_reference<
+                                    typename iterator_reference<Iterator1>::type
+                                >::type
+                            >::value
+                            || is_const<
+                                typename remove_reference<
+                                    typename iterator_reference<Iterator2>::type
+                                >::type
+                            >::value,
+                            typename add_const<
+                                typename iterator_reference<Iterator2>::type
+                            >::type,
+                            typename iterator_reference<Iterator1>::type
+                        >::type
+                    >::type
        , typename Traversal = typename demote_iterator_traversal_tag<
                                   typename iterator_traversal<Iterator1>::type
                                 , typename iterator_traversal<Iterator2>::type>::type
Modified: branches/release/boost/range/has_range_iterator.hpp
==============================================================================
--- branches/release/boost/range/has_range_iterator.hpp	(original)
+++ branches/release/boost/range/has_range_iterator.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -19,7 +19,7 @@
 {
     namespace range_detail
     {
-        BOOST_MPL_HAS_XXX_TRAIT_DEF(type);
+        BOOST_MPL_HAS_XXX_TRAIT_DEF(type)
 
         template<class T, class Enabler = void>
         struct has_range_iterator_impl
Modified: branches/release/boost/range/irange.hpp
==============================================================================
--- branches/release/boost/range/irange.hpp	(original)
+++ branches/release/boost/range/irange.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -124,13 +124,11 @@
             typedef typename base_t::difference_type difference_type;
             typedef typename base_t::reference reference;
 
-            integer_iterator_with_step(value_type first, value_type step, difference_type step_size)
+            integer_iterator_with_step(value_type first, difference_type step, value_type step_size)
                 : m_first(first)
                 , m_step(step)
                 , m_step_size(step_size)
             {
-                BOOST_ASSERT( step >= 0 );
-                BOOST_ASSERT( step_size != 0 );
             }
 
         private:
@@ -213,16 +211,18 @@
     {
         BOOST_ASSERT( step_size != 0 );
         BOOST_ASSERT( (step_size > 0) ? (last >= first) : (last <= first) );
-
+        
         typedef typename range_detail::integer_iterator_with_step<Integer> iterator_t;
 
-        const std::ptrdiff_t last_step
-            = (static_cast<std::ptrdiff_t>(last) - static_cast<std::ptrdiff_t>(first))
-            / (static_cast<std::ptrdiff_t>(step_size));
-
+        const std::ptrdiff_t sz = static_cast<std::ptrdiff_t>(step_size >= 0 ? step_size : -step_size);
+        const Integer l = step_size >= 0 ? last : first;
+        const Integer f = step_size >= 0 ? first : last;
+        const std::ptrdiff_t num_steps = (l + ((l-f) % sz) - f) / sz;
+        BOOST_ASSERT(num_steps >= 0);
+       
         return strided_integer_range<Integer>(
             iterator_t(first, 0, step_size),
-            iterator_t(first, last_step, step_size));
+            iterator_t(first, num_steps, step_size));
     }
 
 } // namespace boost
Modified: branches/release/boost/range/iterator_range_core.hpp
==============================================================================
--- branches/release/boost/range/iterator_range_core.hpp	(original)
+++ branches/release/boost/range/iterator_range_core.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -53,13 +53,13 @@
             template< class ForwardRange >
             static IteratorT adl_begin( ForwardRange& r )
             {
-                return IteratorT( boost::begin( r ) );
+                return static_cast<IteratorT>( boost::begin( r ) );
             }
 
             template< class ForwardRange >
             static IteratorT adl_end( ForwardRange& r )
             {
-                return IteratorT( boost::end( r ) );
+                return static_cast<IteratorT>( boost::end( r ) );
             }
         };
 
@@ -71,6 +71,24 @@
                                                  boost::begin(r),
                                                  boost::end(r) );
         }
+        
+        template< class Left, class Right >
+        inline bool greater_than( const Left& l, const Right& r )
+        {
+            return less_than(r,l);
+        }
+        
+        template< class Left, class Right >
+        inline bool less_or_equal_than( const Left& l, const Right& r )
+        {
+            return !iterator_range_detail::less_than(r,l);
+        }
+        
+        template< class Left, class Right >
+        inline bool greater_or_equal_than( const Left& l, const Right& r )
+        {
+            return !iterator_range_detail::less_than(l,r);
+        }
 
         // This version is maintained since it is used in other boost libraries
         // such as Boost.Assign
@@ -271,6 +289,21 @@
            {
                return iterator_range_detail::less_than( *this, r );
            }
+           
+           bool operator>( const iterator_range& r ) const
+           {
+               return iterator_range_detail::greater_than( *this, r );
+           }
+           
+           bool operator<=( const iterator_range& r ) const
+           {
+               return iterator_range_detail::less_or_equal_than( *this, r );
+           }
+           
+           bool operator>=( const iterator_range& r ) const
+           {
+               return iterator_range_detail::greater_or_equal_than( *this, r );
+           }
 
 #endif
 
@@ -370,6 +403,27 @@
         {
             return iterator_range_detail::less_than( l, r );
         }
+        
+        template< class IteratorT, class ForwardRange >
+        inline bool operator<=( const ForwardRange& l,
+                                const iterator_range<IteratorT>& r )
+        {
+            return iterator_range_detail::less_or_equal_than( l, r );
+        }
+        
+        template< class IteratorT, class ForwardRange >
+        inline bool operator>( const ForwardRange& l,
+                               const iterator_range<IteratorT>& r )
+        {
+            return iterator_range_detail::greater_than( l, r );
+        }
+        
+        template< class IteratorT, class ForwardRange >
+        inline bool operator>=( const ForwardRange& l,
+                                const iterator_range<IteratorT>& r )
+        {
+            return iterator_range_detail::greater_or_equal_than( l, r );
+        }
 
 #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 #else
@@ -416,6 +470,48 @@
         {
             return iterator_range_detail::less_than( l, r );
         }
+        
+        template< class Iterator1T, class Iterator2T >
+        inline bool operator<=( const iterator_range<Iterator1T>& l,
+                                const iterator_range<Iterator2T>& r )
+        {
+            return iterator_range_detail::less_or_equal_than( l, r );
+        }
+        
+        template< class IteratorT, class ForwardRange >
+        inline bool operator<=( const iterator_range<IteratorT>& l,
+                                const ForwardRange& r )
+        {
+            return iterator_range_detail::less_or_equal_than( l, r );
+        }
+        
+        template< class Iterator1T, class Iterator2T >
+        inline bool operator>( const iterator_range<Iterator1T>& l,
+                               const iterator_range<Iterator2T>& r )
+        {
+            return iterator_range_detail::greater_than( l, r );
+        }
+        
+        template< class IteratorT, class ForwardRange >
+        inline bool operator>( const iterator_range<IteratorT>& l,
+                               const ForwardRange& r )
+        {
+            return iterator_range_detail::greater_than( l, r );
+        }
+        
+        template< class Iterator1T, class Iterator2T >
+        inline bool operator>=( const iterator_range<Iterator1T>& l,
+                                const iterator_range<Iterator2T>& r )
+        {
+            return iterator_range_detail::greater_or_equal_than( l, r );
+        }
+        
+        template< class IteratorT, class ForwardRange >
+        inline bool operator>=( const iterator_range<IteratorT>& l,
+                                const ForwardRange& r )
+        {
+            return iterator_range_detail::greater_or_equal_than( l, r );
+        }
 
 #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 
Modified: branches/release/boost/range/join.hpp
==============================================================================
--- branches/release/boost/range/join.hpp	(original)
+++ branches/release/boost/range/join.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -36,6 +36,9 @@
 
     } // namespace range_detail
 
+namespace range
+{
+
 template<class SinglePassRange1, class SinglePassRange2>
 class joined_range
     : public range_detail::joined_type<SinglePassRange1, SinglePassRange2>::type
@@ -78,6 +81,11 @@
     return joined_range<SinglePassRange1, SinglePassRange2>(r1, r2);
 }
 
+} // namespace range
+
+using ::boost::range::joined_range;
+using ::boost::range::join;
+
 } // namespace boost
 
 #endif // include guard
Modified: branches/release/boost/range/sub_range.hpp
==============================================================================
--- branches/release/boost/range/sub_range.hpp	(original)
+++ branches/release/boost/range/sub_range.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -12,12 +12,13 @@
 #ifndef BOOST_RANGE_SUB_RANGE_HPP
 #define BOOST_RANGE_SUB_RANGE_HPP
 
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))
+#include <boost/detail/workaround.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500)) 
     #pragma warning( push )
     #pragma warning( disable : 4996 )
 #endif
 
-#include <boost/detail/workaround.hpp>
 #include <boost/range/config.hpp>
 #include <boost/range/iterator_range.hpp>
 #include <boost/range/value_type.hpp>
@@ -30,9 +31,9 @@
 
 namespace boost
 {
-
-    template< class ForwardRange >
-    class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type >
+    
+    template< class ForwardRange > 
+    class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type > 
     {
         typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator_t;
         typedef iterator_range< iterator_t  > base;
@@ -53,40 +54,40 @@
                                  reference >::type const_reference;
 
     public:
-        sub_range() : base()
-        { }
-
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) )
-        sub_range( const sub_range& r )
-            : base( static_cast<const base&>( r ) )
+        sub_range() : base() 
         { }
+        
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) ) 
+        sub_range( const sub_range& r ) 
+            : base( static_cast<const base&>( r ) )  
+        { }  
 #endif
 
         template< class ForwardRange2 >
-        sub_range( ForwardRange2& r ) :
-
+        sub_range( ForwardRange2& r ) : 
+            
 #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
             base( impl::adl_begin( r ), impl::adl_end( r ) )
 #else
             base( r )
-#endif
+#endif        
         { }
-
+        
         template< class ForwardRange2 >
-        sub_range( const ForwardRange2& r ) :
+        sub_range( const ForwardRange2& r ) : 
 
 #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
             base( impl::adl_begin( r ), impl::adl_end( r ) )
 #else
             base( r )
-#endif
+#endif                
         { }
 
         template< class Iter >
         sub_range( Iter first, Iter last ) :
             base( first, last )
         { }
-
+        
         template< class ForwardRange2 >
         sub_range& operator=( ForwardRange2& r )
         {
@@ -99,23 +100,23 @@
         {
             base::operator=( r );
             return *this;
-        }
+        }   
 
         sub_range& operator=( const sub_range& r )
         {
             base::operator=( static_cast<const base&>(r) );
-            return *this;
+            return *this;            
         }
-
+        
     public:
-
+        
         iterator        begin()          { return base::begin(); }
         const_iterator  begin() const    { return base::begin(); }
         iterator        end()            { return base::end();   }
         const_iterator  end() const      { return base::end();   }
-        difference_type size() const     { return base::size();  }
-
+        difference_type size() const     { return base::size();  }   
 
+        
     public: // convenience
         reference front()
         {
@@ -173,7 +174,7 @@
 
 } // namespace 'boost'
 
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500)) 
     #pragma warning( pop )
 #endif
 
Modified: branches/release/libs/range/doc/reference/adaptors/examples/adjacent_filtered.cpp
==============================================================================
--- branches/release/libs/range/doc/reference/adaptors/examples/adjacent_filtered.cpp	(original)
+++ branches/release/libs/range/doc/reference/adaptors/examples/adjacent_filtered.cpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -11,7 +11,7 @@
 #include <boost/range/algorithm/copy.hpp>
 #include <boost/assign.hpp>
 #include <algorithm>
-#include <functinoal>
+#include <functional>
 #include <iostream>
 #include <vector>
 
Modified: branches/release/libs/range/doc/reference/adaptors/examples/indexed.cpp
==============================================================================
--- branches/release/libs/range/doc/reference/adaptors/examples/indexed.cpp	(original)
+++ branches/release/libs/range/doc/reference/adaptors/examples/indexed.cpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -41,5 +41,5 @@
     display_element_and_index( input | indexed(0) );
     
     return 0;
-]
+}
 
Modified: branches/release/libs/range/doc/reference/adaptors/examples/transformed.cpp
==============================================================================
--- branches/release/libs/range/doc/reference/adaptors/examples/transformed.cpp	(original)
+++ branches/release/libs/range/doc/reference/adaptors/examples/transformed.cpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -9,7 +9,7 @@
 //
 #include <boost/range/adaptor/transformed.hpp>
 #include <boost/range/algorithm/copy.hpp>
-#include <boost/range/assign.hpp>
+#include <boost/assign.hpp>
 #include <algorithm>
 #include <iostream>
 #include <vector>
Modified: branches/release/libs/range/test/Jamfile.v2
==============================================================================
--- branches/release/libs/range/test/Jamfile.v2	(original)
+++ branches/release/libs/range/test/Jamfile.v2	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -31,6 +31,22 @@
 }
 
 test-suite range :
+    [ compile ../doc/reference/adaptors/examples/adjacent_filtered.cpp : : example_adjacent_filtered ]
+    [ compile ../doc/reference/adaptors/examples/copied.cpp : : example_copied ]
+    [ compile ../doc/reference/adaptors/examples/filtered.cpp : : example_filtered ]
+    [ compile ../doc/reference/adaptors/examples/indexed.cpp : : example_indexed ]
+    [ compile ../doc/reference/adaptors/examples/indirected.cpp : : example_indirected ]
+    [ compile ../doc/reference/adaptors/examples/map_keys.cpp : : example_map_keys ]
+    [ compile ../doc/reference/adaptors/examples/map_values.cpp : : example_map_values ]
+    [ compile ../doc/reference/adaptors/examples/replaced.cpp : : example_replaced ]
+    [ compile ../doc/reference/adaptors/examples/replaced_if.cpp : : example_replaced_if ]
+    [ compile ../doc/reference/adaptors/examples/reversed.cpp : : example_reversed ]
+    [ compile ../doc/reference/adaptors/examples/sliced.cpp : : example_sliced ]
+    [ compile ../doc/reference/adaptors/examples/strided.cpp : : example_strided ]
+    [ compile ../doc/reference/adaptors/examples/tokenized.cpp : : example_tokenized ]
+    [ compile ../doc/reference/adaptors/examples/transformed.cpp : : example_transformed ]
+    [ compile ../doc/reference/adaptors/examples/uniqued.cpp : : example_uniqued ]
+	[ compile-fail compile_fail/iterator_range1.cpp ]
         [ range-test adaptor_test/adjacent_filtered ]
         [ range-test adaptor_test/copied ]
         [ range-test adaptor_test/filtered ]
@@ -155,5 +171,9 @@
         [ range-test std_container ]
         [ range-test string ]
         [ range-test sub_range ]
+	[ range-test ticket_5486 ]
+	[ range-test ticket_5544_terminate_irange ]
+	[ range-test ticket_5547 ]
+	[ range-test ticket_5556_is_sorted_namespace ]
     ;
 
Modified: branches/release/libs/range/test/adaptor_test/strided.cpp
==============================================================================
--- branches/release/libs/range/test/adaptor_test/strided.cpp	(original)
+++ branches/release/libs/range/test/adaptor_test/strided.cpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -250,6 +250,38 @@
             BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(),
                                            output.begin(), output.end() );
         }
+
+        template<typename Range>
+        void strided_test_ticket_5236_check_bidirectional(const Range& rng)
+        {
+            BOOST_CHECK_EQUAL( boost::distance(rng), 1 );
+            BOOST_CHECK_EQUAL( std::distance(boost::begin(rng), boost::prior(boost::end(rng))), 0 );
+        }
+        
+        template<typename Range>
+        void strided_test_ticket_5236_check(const Range& rng)
+        {
+            strided_test_ticket_5236_check_bidirectional(rng);
+                        
+            typename boost::range_iterator<const Range>::type it = boost::end(rng);
+            it = it - 1;
+            BOOST_CHECK_EQUAL( std::distance(boost::begin(rng), it), 0 );
+        }
+        
+        void strided_test_ticket_5236()
+        {
+            std::vector<int> v;
+            v.push_back(1);
+            strided_test_ticket_5236_check( v | boost::adaptors::strided(2) );                
+            
+            // Ensure that there is consistency between the random-access implementation
+            // and the bidirectional.
+            
+            std::list<int> l;
+            l.push_back(1);
+            strided_test_ticket_5236_check_bidirectional( l | boost::adaptors::strided(2) );
+        }
+        
     }
 }
 
@@ -262,6 +294,7 @@
     test->add( BOOST_TEST_CASE( &boost::strided_test ) );
     test->add( BOOST_TEST_CASE( &boost::strided_defect_Trac5014 ) );
     test->add( BOOST_TEST_CASE( &boost::strided_test_traversal ) );
+    test->add( BOOST_TEST_CASE( &boost::strided_test_ticket_5236 ) );
 
     return test;
 }
Modified: branches/release/libs/range/test/irange.cpp
==============================================================================
--- branches/release/libs/range/test/irange.cpp	(original)
+++ branches/release/libs/range/test/irange.cpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -14,7 +14,6 @@
 #include <boost/range/end.hpp>
 #include <boost/test/test_tools.hpp>
 #include <boost/test/unit_test.hpp>
-#include <iostream>
 #include <vector>
 
 namespace boost
@@ -35,27 +34,38 @@
         BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(),
                                        reference.begin(), reference.end() );
     }
+    
+    template<typename Integer>
+    std::ptrdiff_t test_irange_calculate_num_steps(Integer first, Integer last, int step)
+    {
+        const std::ptrdiff_t sz = static_cast<std::ptrdiff_t>(step >= 0 ? step : -step);
+        const std::ptrdiff_t l = static_cast<std::ptrdiff_t>(step >= 0 ? last : first);
+        const std::ptrdiff_t f = static_cast<std::ptrdiff_t>(step >= 0 ? first : last);
+        return (l + ((l-f) % sz) - f) / sz;
+    }
 
     // Test an integer range with a runtime specified step size.
-    template<typename Integer>
-    void test_irange_impl(Integer first, Integer last, int step)
+    template<typename Integer, typename IntegerInput>
+    void test_irange_impl(IntegerInput first, IntegerInput last, int step)
     {
         BOOST_ASSERT( step != 0 );
+        
+        // Skip tests that have negative values if the type is
+        // unsigned
+        if ((static_cast<IntegerInput>(static_cast<Integer>(first)) != first)
+        ||  (static_cast<IntegerInput>(static_cast<Integer>(last)) != last))
+            return;
+        
         std::vector<Integer> reference;
-        if (step > 0)
-        {
-            for (Integer i = first; i < last; i += step)
-                reference.push_back(i);
-        }
-        else
-        {
-            for (Integer i = first; i > last; i += step)
-                reference.push_back(i);
-        }
+
+        const std::ptrdiff_t num_steps = test_irange_calculate_num_steps(first, last, step);        
+        Integer current_value = first;
+        for (std::ptrdiff_t i = 0; i < num_steps; ++i, current_value += step)
+            reference.push_back(current_value);
 
         std::vector<Integer> test;
         boost::push_back(test, boost::irange(first, last, step));
-
+        
         BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(),
                                        reference.begin(), reference.end() );
     }
@@ -81,7 +91,6 @@
     void test_irange(int first, int last, int step_size)
     {
         BOOST_ASSERT( step_size != 0 );
-        BOOST_ASSERT( (last - first) % step_size == 0 );
         test_irange_impl<signed char>(first, last, step_size);
         test_irange_impl<unsigned char>(first, last, step_size);
         test_irange_impl<signed short>(first, last, step_size);
@@ -114,8 +123,27 @@
         test_irange(10, 0, -1);
         test_irange(0, 2, 2);
         test_irange(2, 0, -2);
+        test_irange(0, 9, 2);
+        test_irange(9, 0, -2);
+        test_irange(-9, 0, 2);
+        test_irange(-9, 9, 2);
+        test_irange(9, -9, -2);
         test_irange(10, 20, 5);
         test_irange(20, 10, -5);
+        
+        test_irange(0, 0, 3);
+        test_irange(0, 1, 3);
+        test_irange(0, 2, 3);
+        test_irange(0, 3, 3);
+        test_irange(0, 4, 3);
+        test_irange(0, 10, 3);
+        
+        test_irange(0, 0, -3);
+        test_irange(0, -1, -3);
+        test_irange(0, -2, -3);
+        test_irange(0, -3, -3);
+        test_irange(0, -4, -3);
+        test_irange(0, -10, -3);
     }
 } // namespace boost
 
Modified: branches/release/libs/range/test/iterator_range.cpp
==============================================================================
--- branches/release/libs/range/test/iterator_range.cpp	(original)
+++ branches/release/libs/range/test/iterator_range.cpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -24,6 +24,7 @@
 #include <boost/test/unit_test.hpp>
 #include <iostream>
 #include <string>
+#include <vector>
 
 void check_reference_type();
 
@@ -102,17 +103,136 @@
     check_reference_type();
 }
 
+namespace iterator_range_test_detail
+{
+    struct less
+    {
+        template< class Left, class Right >
+        bool operator()(const Left& l, const Right& r) const
+        {
+            return l < r;
+        }
+    };
+    
+    struct greater
+    {
+        template< class Left, class Right >
+        bool operator()(const Left& l, const Right& r) const
+        {
+            return l > r;
+        }
+    };
+    
+    struct less_or_equal
+    {
+        template< class Left, class Right >
+        bool operator()(const Left& l, const Right& r) const
+        {
+            return l <= r;
+        }
+    };
+    
+    struct greater_or_equal
+    {
+        template< class Left, class Right >
+        bool operator()(const Left& l, const Right& r) const
+        {
+            return l >= r;
+        }
+    };
+    
+    struct equal_to
+    {
+        template< class Left, class Right >
+        bool operator()(const Left& l, const Right& r) const
+        {
+            return l == r;
+        }
+    };
+    
+    struct not_equal_to
+    {
+        template< class Left, class Right >
+        bool operator()(const Left& l, const Right& r) const
+        {
+            return l != r;
+        }
+    };
+    
+    template< class Pred >
+    void check_iterator_range_operators_impl(Pred pred)
+    {
+        std::vector<std::string> vals;
+        vals.push_back(std::string());
+        vals.push_back("a");
+        vals.push_back("b");
+        vals.push_back("z");
+        vals.push_back("ab");
+        vals.push_back("ba");
+        vals.push_back("abc");
+        vals.push_back("cba");
+        vals.push_back("aa");
+        vals.push_back("aaa");
+        vals.push_back("aab");
+        vals.push_back("bba");
+
+        typedef std::string::const_iterator citer;
+        typedef boost::iterator_range<citer> iter_range;
+
+        typedef std::vector<std::string>::const_iterator value_const_iterator;
+        value_const_iterator first_val = vals.begin();
+        value_const_iterator last_val = vals.end();
+        
+        for (value_const_iterator left_it = first_val; left_it != last_val; ++left_it)
+        {
+            const std::string& leftValue = *left_it;
+            for (value_const_iterator right_it = first_val; right_it != last_val; ++right_it)
+            {
+                const std::string& rightValue = *right_it;
+                iter_range left = boost::make_iterator_range(leftValue);
+                iter_range right = boost::make_iterator_range(rightValue);
+                
+                const bool reference = pred(leftValue, rightValue);
+                
+                BOOST_CHECK_EQUAL( pred(left, right), reference );
+                BOOST_CHECK_EQUAL( pred(left, rightValue), reference );
+                BOOST_CHECK_EQUAL( pred(leftValue, right), reference );
+            }
+        }
+    }
+    
+    void check_iterator_range_from_array()
+    {
+        double source[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
+        boost::iterator_range<double*> rng = boost::make_iterator_range(source);
+        BOOST_CHECK_EQUAL_COLLECTIONS( rng.begin(), rng.end(),
+                                       source, source + 6 );
+    }
+    
+} // namespace iterator_range_test_detail
+
+template<typename Pred>
+inline void check_iterator_range_operator()
+{
+    iterator_range_test_detail::check_iterator_range_operators_impl(
+        Pred());
+}
 
 boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] )
 {
     boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );
 
-    test->add( BOOST_TEST_CASE( &check_iterator_range ) );
+    test->add(BOOST_TEST_CASE(&check_iterator_range));
+    test->add(BOOST_TEST_CASE(&check_iterator_range_operator<iterator_range_test_detail::less>));
+    test->add(BOOST_TEST_CASE(&check_iterator_range_operator<iterator_range_test_detail::less_or_equal>));
+    test->add(BOOST_TEST_CASE(&check_iterator_range_operator<iterator_range_test_detail::greater>));
+    test->add(BOOST_TEST_CASE(&check_iterator_range_operator<iterator_range_test_detail::greater_or_equal>));
+    test->add(BOOST_TEST_CASE(&check_iterator_range_operator<iterator_range_test_detail::equal_to>));
+    test->add(BOOST_TEST_CASE(&check_iterator_range_operator<iterator_range_test_detail::not_equal_to>));
 
     return test;
 }
 
-
 //
 //
 // Check that constness is propgated correct from
Modified: branches/release/libs/range/test/test_driver/range_return_test_driver.hpp
==============================================================================
--- branches/release/libs/range/test/test_driver/range_return_test_driver.hpp	(original)
+++ branches/release/libs/range/test/test_driver/range_return_test_driver.hpp	2011-06-05 17:47:57 EDT (Sun, 05 Jun 2011)
@@ -371,7 +371,7 @@
 
                 Container reference(cont);
                 Container test(cont);
-                
+
                 iterator_t range_result = policy.test_iter(test);
                 iterator_t reference_it = policy.reference(reference);
 
@@ -391,7 +391,8 @@
                     Container reference(cont);
                     Container test_cont(cont);
 
-                    range_return_t range_result = test_range_t()(policy, test_cont);
+                    test_range_t test_range_fn;
+                    range_return_t range_result = test_range_fn(policy, test_cont);
                     iterator_t reference_it = policy.reference(reference);
 
                     check_results<result_type>::test(test_cont, reference,