Commit [654ae838ee5228eec9006146cd1562c46d90f9d2] broke several Boost.Accumulators tests, and regressed functionality of boost::iterator_range for several kinds of iterators. The change assumes that boost::iterator_traversal returns one of a known set of traversal types. That's not true. It is merely required to return a type convertible to one of the known traversal types. Many iterators have such a traversal category. In particular, many of the iterators produced by Boost.Iterators have a composite iterator category/traversal (see boost::detail::iterator_category_with_traversal in boost/iterator/detail/facade_iterator_category.hpp).
This change makes accommodations for composite iterator categories. Tested with gcc-4.8 and msvc-12.0.
The following is a program that fails without this change:
#include <functional>
#include <boost/range/iterator_range.hpp>
#include <boost/iterator/counting_iterator.hpp>
#include <boost/iterator/transform_iterator.hpp>
typedef
boost::transform_iterator<
std::binder1st<std::multiplies<std::size_t> >
, boost::counting_iterator<std::size_t>
>
times2_iterator;
int main()
{
times2_iterator i =
boost::make_transform_iterator(
boost::make_counting_iterator(0u),
std::bind1st(std::multiplies<std::size_t>(), 2));
boost::iterator_range<times2_iterator> u(i,i);
auto x = u[4];
}
Commit [654ae838ee5228eec9006146cd1562c46d90f9d2] broke several Boost.Accumulators tests, and regressed functionality of
boost::iterator_range
for several kinds of iterators. The change assumes thatboost::iterator_traversal
returns one of a known set of traversal types. That's not true. It is merely required to return a type convertible to one of the known traversal types. Many iterators have such a traversal category. In particular, many of the iterators produced by Boost.Iterators have a composite iterator category/traversal (seeboost::detail::iterator_category_with_traversal
in boost/iterator/detail/facade_iterator_category.hpp).This change makes accommodations for composite iterator categories. Tested with gcc-4.8 and msvc-12.0.
The following is a program that fails without this change: