forked from boostorg/range
Merge branch 'develop' - contains emergency fix to traversal tags to fix the accumulator tests.
This commit is contained in:
@ -25,6 +25,7 @@
|
|||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/iterator/iterator_traits.hpp>
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
#include <boost/iterator/iterator_facade.hpp>
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
|
#include <boost/mpl/if.hpp>
|
||||||
#include <boost/mpl/or.hpp>
|
#include <boost/mpl/or.hpp>
|
||||||
#include <boost/type_traits/is_abstract.hpp>
|
#include <boost/type_traits/is_abstract.hpp>
|
||||||
#include <boost/type_traits/is_array.hpp>
|
#include <boost/type_traits/is_array.hpp>
|
||||||
@ -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<std::size_t S>
|
||||||
|
struct pure_iterator_traversal_impl
|
||||||
|
{
|
||||||
|
typedef boost::incrementable_traversal_tag type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct pure_iterator_traversal_impl<sizeof(bidirectional_t)>
|
||||||
|
{
|
||||||
|
typedef boost::bidirectional_traversal_tag type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct pure_iterator_traversal_impl<sizeof(random_access_t)>
|
||||||
|
{
|
||||||
|
typedef boost::random_access_traversal_tag type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename IteratorT>
|
||||||
|
struct pure_iterator_traversal
|
||||||
|
{
|
||||||
|
typedef
|
||||||
|
BOOST_DEDUCED_TYPENAME iterator_traversal<IteratorT>::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<traversal_i>::type
|
||||||
|
type;
|
||||||
|
};
|
||||||
|
|
||||||
template<class IteratorT, class TraversalTag>
|
template<class IteratorT, class TraversalTag>
|
||||||
class iterator_range_base
|
class iterator_range_base
|
||||||
: public iterator_range_tag
|
: public iterator_range_tag
|
||||||
@ -251,9 +293,9 @@ protected:
|
|||||||
|
|
||||||
template<class IteratorT>
|
template<class IteratorT>
|
||||||
class iterator_range_base<IteratorT, bidirectional_traversal_tag>
|
class iterator_range_base<IteratorT, bidirectional_traversal_tag>
|
||||||
: public iterator_range_base<IteratorT, forward_traversal_tag>
|
: public iterator_range_base<IteratorT, incrementable_traversal_tag>
|
||||||
{
|
{
|
||||||
typedef iterator_range_base<IteratorT, forward_traversal_tag> base_type;
|
typedef iterator_range_base<IteratorT, incrementable_traversal_tag> base_type;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
iterator_range_base()
|
iterator_range_base()
|
||||||
@ -262,7 +304,7 @@ protected:
|
|||||||
|
|
||||||
template<class Iterator>
|
template<class Iterator>
|
||||||
iterator_range_base(Iterator first, Iterator last)
|
iterator_range_base(Iterator first, Iterator last)
|
||||||
: iterator_range_base<IteratorT, forward_traversal_tag>(first, last)
|
: base_type(first, last)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,8 +370,7 @@ protected:
|
|||||||
|
|
||||||
template<class Iterator>
|
template<class Iterator>
|
||||||
iterator_range_base(Iterator first, Iterator last)
|
iterator_range_base(Iterator first, Iterator last)
|
||||||
: iterator_range_base<IteratorT, bidirectional_traversal_tag>(
|
: base_type(first, last)
|
||||||
first, last)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,12 +425,12 @@ public:
|
|||||||
class iterator_range
|
class iterator_range
|
||||||
: public iterator_range_detail::iterator_range_base<
|
: public iterator_range_detail::iterator_range_base<
|
||||||
IteratorT,
|
IteratorT,
|
||||||
BOOST_DEDUCED_TYPENAME iterator_traversal<IteratorT>::type
|
BOOST_DEDUCED_TYPENAME iterator_range_detail::pure_iterator_traversal<IteratorT>::type
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
typedef iterator_range_detail::iterator_range_base<
|
typedef iterator_range_detail::iterator_range_base<
|
||||||
IteratorT,
|
IteratorT,
|
||||||
BOOST_DEDUCED_TYPENAME iterator_traversal<IteratorT>::type
|
BOOST_DEDUCED_TYPENAME iterator_range_detail::pure_iterator_traversal<IteratorT>::type
|
||||||
> base_type;
|
> base_type;
|
||||||
|
|
||||||
template<class Source>
|
template<class Source>
|
||||||
|
Reference in New Issue
Block a user