diff --git a/include/boost/range/iterator_range_core.hpp b/include/boost/range/iterator_range_core.hpp index 3464a78..afbf3ff 100644 --- a/include/boost/range/iterator_range_core.hpp +++ b/include/boost/range/iterator_range_core.hpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,47 @@ struct iterator_range_tag { }; +typedef char (&incrementable_t)[1]; +typedef char (&bidirectional_t)[2]; +typedef char (&random_access_t)[3]; + +incrementable_t test_traversal_tag(boost::incrementable_traversal_tag); +bidirectional_t test_traversal_tag(boost::bidirectional_traversal_tag); +random_access_t test_traversal_tag(boost::random_access_traversal_tag); + +template +struct pure_iterator_traversal_impl +{ + typedef boost::incrementable_traversal_tag type; +}; + +template<> +struct pure_iterator_traversal_impl +{ + typedef boost::bidirectional_traversal_tag type; +}; + +template<> +struct pure_iterator_traversal_impl +{ + typedef boost::random_access_traversal_tag type; +}; + +template +struct pure_iterator_traversal +{ + typedef + BOOST_DEDUCED_TYPENAME iterator_traversal::type + traversal_t; + BOOST_STATIC_CONSTANT( + std::size_t, + traversal_i = sizeof(iterator_range_detail::test_traversal_tag((traversal_t()))) + ); + typedef + BOOST_DEDUCED_TYPENAME pure_iterator_traversal_impl::type + type; +}; + template class iterator_range_base : public iterator_range_tag @@ -251,9 +293,9 @@ protected: template class iterator_range_base - : public iterator_range_base + : public iterator_range_base { - typedef iterator_range_base base_type; + typedef iterator_range_base base_type; protected: iterator_range_base() @@ -262,7 +304,7 @@ protected: template iterator_range_base(Iterator first, Iterator last) - : iterator_range_base(first, last) + : base_type(first, last) { } @@ -328,8 +370,7 @@ protected: template iterator_range_base(Iterator first, Iterator last) - : iterator_range_base( - first, last) + : base_type(first, last) { } @@ -384,12 +425,12 @@ public: class iterator_range : public iterator_range_detail::iterator_range_base< IteratorT, - BOOST_DEDUCED_TYPENAME iterator_traversal::type + BOOST_DEDUCED_TYPENAME iterator_range_detail::pure_iterator_traversal::type > { typedef iterator_range_detail::iterator_range_base< IteratorT, - BOOST_DEDUCED_TYPENAME iterator_traversal::type + BOOST_DEDUCED_TYPENAME iterator_range_detail::pure_iterator_traversal::type > base_type; template