Merge branch 'develop'

These changes are just to address some small issues on some compiler versions with newly introduced tests. It also includes a fix to a recent regression in the sub_range class so that it preserves constness propagation as before the SFINAE improvement changes.
This commit is contained in:
Neil Groves
2014-03-05 22:02:25 +00:00
7 changed files with 513 additions and 75 deletions

View File

@ -206,12 +206,18 @@ public:
return *m_Begin;
}
void pop_front()
void drop_front()
{
BOOST_ASSERT(!empty());
++m_Begin;
}
void drop_front(difference_type n)
{
BOOST_ASSERT(n >= difference_type());
std::advance(this->m_Begin, n);
}
protected:
template<class Iterator>
void assign(Iterator first, Iterator last)
@ -256,17 +262,26 @@ protected:
}
public:
BOOST_DEDUCED_TYPENAME base_type::reference back() const
typedef BOOST_DEDUCED_TYPENAME base_type::difference_type difference_type;
typedef BOOST_DEDUCED_TYPENAME base_type::reference reference;
reference back() const
{
BOOST_ASSERT(!this->empty());
return *boost::prior(this->m_End);
}
void pop_back()
void drop_back()
{
BOOST_ASSERT(!this->empty());
--this->m_End;
}
void drop_back(difference_type n)
{
BOOST_ASSERT(n >= difference_type());
std::advance(this->m_End, -n);
}
};
template<class IteratorT>
@ -328,20 +343,6 @@ public:
return this->m_Begin[at];
}
void pop_front(difference_type n)
{
BOOST_ASSERT(n >= difference_type());
BOOST_ASSERT(size() >= static_cast<size_type>(n));
std::advance(this->m_Begin, n);
}
void pop_back(difference_type n)
{
BOOST_ASSERT(n >= difference_type());
BOOST_ASSERT(size() >= static_cast<size_type>(n));
std::advance(this->m_End, -n);
}
BOOST_DEDUCED_TYPENAME base_type::size_type size() const
{
return this->m_End - this->m_Begin;

View File

@ -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;
}
};