Merge branch 'develop' - contains emergency fix to traversal tags to fix the accumulator tests.

This commit is contained in:
Neil Groves
2014-06-19 10:33:51 +01:00

View File

@ -25,6 +25,7 @@
#include <boost/assert.hpp>
#include <boost/iterator/iterator_traits.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/or.hpp>
#include <boost/type_traits/is_abstract.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>
class iterator_range_base
: public iterator_range_tag
@ -251,9 +293,9 @@ protected:
template<class IteratorT>
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:
iterator_range_base()
@ -262,7 +304,7 @@ protected:
template<class Iterator>
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>
iterator_range_base(Iterator first, Iterator last)
: iterator_range_base<IteratorT, bidirectional_traversal_tag>(
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<IteratorT>::type
BOOST_DEDUCED_TYPENAME iterator_range_detail::pure_iterator_traversal<IteratorT>::type
>
{
typedef iterator_range_detail::iterator_range_base<
IteratorT,
BOOST_DEDUCED_TYPENAME iterator_traversal<IteratorT>::type
BOOST_DEDUCED_TYPENAME iterator_range_detail::pure_iterator_traversal<IteratorT>::type
> base_type;
template<class Source>