forked from boostorg/range
fix for recently introduced regression to sub_range const propagation.
This commit is contained in:
@ -24,6 +24,7 @@
|
||||
#include <boost/range/value_type.hpp>
|
||||
#include <boost/range/size_type.hpp>
|
||||
#include <boost/range/difference_type.hpp>
|
||||
#include <boost/range/reference.hpp>
|
||||
#include <boost/range/algorithm/equal.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/type_traits/is_reference.hpp>
|
||||
@ -31,25 +32,135 @@
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace range_detail
|
||||
{
|
||||
|
||||
template< class ForwardRange >
|
||||
class sub_range
|
||||
template<class ForwardRange, class TraversalTag>
|
||||
class sub_range_base
|
||||
: public iterator_range<
|
||||
BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef iterator_range<
|
||||
BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type
|
||||
> base;
|
||||
|
||||
protected:
|
||||
typedef BOOST_DEDUCED_TYPENAME base::iterator_range_ iterator_range_;
|
||||
|
||||
public:
|
||||
typedef BOOST_DEDUCED_TYPENAME range_value<ForwardRange>::type value_type;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type const_iterator;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_difference<ForwardRange>::type difference_type;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_size<ForwardRange>::type size_type;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_reference<ForwardRange>::type reference;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_reference<const ForwardRange>::type const_reference;
|
||||
|
||||
sub_range_base()
|
||||
{
|
||||
typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator_t;
|
||||
typedef iterator_range< iterator_t > base;
|
||||
}
|
||||
|
||||
template<class Iterator>
|
||||
sub_range_base(Iterator first, Iterator last)
|
||||
: base(first, last)
|
||||
{
|
||||
}
|
||||
|
||||
reference front()
|
||||
{
|
||||
return base::front();
|
||||
}
|
||||
|
||||
const_reference front() const
|
||||
{
|
||||
return base::front();
|
||||
}
|
||||
};
|
||||
|
||||
template<class ForwardRange>
|
||||
class sub_range_base<ForwardRange, bidirectional_traversal_tag>
|
||||
: public sub_range_base<ForwardRange, forward_traversal_tag>
|
||||
{
|
||||
typedef sub_range_base<ForwardRange, forward_traversal_tag> base;
|
||||
public:
|
||||
sub_range_base()
|
||||
{
|
||||
}
|
||||
|
||||
template<class Iterator>
|
||||
sub_range_base(Iterator first, Iterator last)
|
||||
: base(first, last)
|
||||
{
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::reference back()
|
||||
{
|
||||
return base::back();
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::const_reference back() const
|
||||
{
|
||||
return base::back();
|
||||
}
|
||||
};
|
||||
|
||||
template<class ForwardRange>
|
||||
class sub_range_base<ForwardRange, random_access_traversal_tag>
|
||||
: public sub_range_base<ForwardRange, bidirectional_traversal_tag>
|
||||
{
|
||||
typedef sub_range_base<ForwardRange, bidirectional_traversal_tag> base;
|
||||
|
||||
public:
|
||||
sub_range_base()
|
||||
{
|
||||
}
|
||||
|
||||
template<class Iterator>
|
||||
sub_range_base(Iterator first, Iterator last)
|
||||
: base(first, last)
|
||||
{
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::reference
|
||||
operator[](BOOST_DEDUCED_TYPENAME base::difference_type n)
|
||||
{
|
||||
return this->begin()[n];
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::const_reference
|
||||
operator[](BOOST_DEDUCED_TYPENAME base::difference_type n) const
|
||||
{
|
||||
return this->begin()[n];
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace range_detail
|
||||
|
||||
template<class ForwardRange>
|
||||
class sub_range
|
||||
: public range_detail::sub_range_base<
|
||||
ForwardRange,
|
||||
BOOST_DEDUCED_TYPENAME iterator_traversal<
|
||||
BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type
|
||||
>::type
|
||||
>
|
||||
{
|
||||
typedef BOOST_DEDUCED_TYPENAME range_iterator<
|
||||
ForwardRange
|
||||
>::type iterator_t;
|
||||
|
||||
typedef range_detail::sub_range_base<
|
||||
ForwardRange,
|
||||
BOOST_DEDUCED_TYPENAME iterator_traversal<
|
||||
BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type
|
||||
>::type
|
||||
> base;
|
||||
|
||||
typedef BOOST_DEDUCED_TYPENAME base::impl impl;
|
||||
|
||||
public:
|
||||
typedef BOOST_DEDUCED_TYPENAME range_value<ForwardRange>::type value_type;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type const_iterator;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_difference<ForwardRange>::type difference_type;
|
||||
typedef BOOST_DEDUCED_TYPENAME range_size<ForwardRange>::type size_type;
|
||||
typedef BOOST_DEDUCED_TYPENAME base::reference reference;
|
||||
protected:
|
||||
typedef BOOST_DEDUCED_TYPENAME base::iterator_range_ iterator_range_;
|
||||
|
||||
private:
|
||||
template<class Source>
|
||||
@ -60,7 +171,7 @@ namespace boost
|
||||
range_iterator<Source>,
|
||||
mpl::identity<void>
|
||||
>::type,
|
||||
iterator
|
||||
BOOST_DEDUCED_TYPENAME base::iterator
|
||||
>
|
||||
{
|
||||
};
|
||||
@ -70,8 +181,9 @@ namespace boost
|
||||
{ }
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) )
|
||||
sub_range( const sub_range& r )
|
||||
: base( static_cast<const base&>( r ) )
|
||||
sub_range(const sub_range& r)
|
||||
: base(impl::adl_begin(static_cast<const base&>(r)),
|
||||
impl::adl_end(static_cast<const base&>(r)))
|
||||
{ }
|
||||
#endif
|
||||
|
||||
@ -81,14 +193,10 @@ namespace boost
|
||||
BOOST_DEDUCED_TYPENAME enable_if<
|
||||
is_compatible_range<ForwardRange2>
|
||||
>::type* = 0
|
||||
) :
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
|
||||
base( impl::adl_begin( r ), impl::adl_end( r ) )
|
||||
#else
|
||||
base( r )
|
||||
#endif
|
||||
{ }
|
||||
)
|
||||
: base(impl::adl_begin(r), impl::adl_end(r))
|
||||
{
|
||||
}
|
||||
|
||||
template< class ForwardRange2 >
|
||||
sub_range(
|
||||
@ -96,14 +204,30 @@ namespace boost
|
||||
BOOST_DEDUCED_TYPENAME enable_if<
|
||||
is_compatible_range<const ForwardRange2>
|
||||
>::type* = 0
|
||||
) :
|
||||
)
|
||||
: base(impl::adl_begin(r), impl::adl_end(r))
|
||||
{
|
||||
}
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
|
||||
base( impl::adl_begin( r ), impl::adl_end( r ) )
|
||||
#else
|
||||
base( r )
|
||||
#endif
|
||||
{ }
|
||||
BOOST_DEDUCED_TYPENAME base::const_iterator begin() const
|
||||
{
|
||||
return base::begin();
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::iterator begin()
|
||||
{
|
||||
return base::begin();
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::const_iterator end() const
|
||||
{
|
||||
return base::end();
|
||||
}
|
||||
|
||||
BOOST_DEDUCED_TYPENAME base::iterator end()
|
||||
{
|
||||
return base::end();
|
||||
}
|
||||
|
||||
template< class Iter >
|
||||
sub_range( Iter first, Iter last ) :
|
||||
@ -117,7 +241,7 @@ namespace boost
|
||||
>::type
|
||||
operator=(ForwardRange2& r)
|
||||
{
|
||||
base::operator=( r );
|
||||
iterator_range_::operator=( r );
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -128,13 +252,13 @@ namespace boost
|
||||
>::type
|
||||
operator=( const ForwardRange2& r )
|
||||
{
|
||||
base::operator=( r );
|
||||
iterator_range_::operator=( r );
|
||||
return *this;
|
||||
}
|
||||
|
||||
sub_range& operator=( const sub_range& r )
|
||||
{
|
||||
base::operator=( static_cast<const base&>(r) );
|
||||
iterator_range_::operator=( static_cast<const iterator_range_&>(r) );
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
Reference in New Issue
Block a user