|
Boost-Commit : |
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,
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk