mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-30 04:47:20 +02:00
merged fix
[SVN r21869]
This commit is contained in:
@ -18,64 +18,40 @@ namespace boost
|
|||||||
{
|
{
|
||||||
|
|
||||||
template< class ElementIterator
|
template< class ElementIterator
|
||||||
, class IndexIterator
|
, class IndexIterator>
|
||||||
, class ValueT = use_default
|
|
||||||
, class CategoryT = use_default
|
|
||||||
, class ReferenceT = use_default
|
|
||||||
, class DifferenceT = use_default >
|
|
||||||
class permutation_iterator
|
class permutation_iterator
|
||||||
: public iterator_adaptor<
|
: public iterator_adaptor<
|
||||||
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
permutation_iterator<ElementIterator, IndexIterator>
|
||||||
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT >
|
, IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type
|
||||||
|
, use_default, typename detail::iterator_traits<ElementIterator>::reference>
|
||||||
{
|
{
|
||||||
typedef iterator_adaptor<
|
typedef iterator_adaptor<
|
||||||
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
permutation_iterator<ElementIterator, IndexIterator>
|
||||||
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT > super_t;
|
, IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type
|
||||||
|
, use_default, typename detail::iterator_traits<ElementIterator>::reference> super_t;
|
||||||
|
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
permutation_iterator() : order_it_() {}
|
permutation_iterator() : m_elt_iter() {}
|
||||||
|
|
||||||
explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
||||||
: super_t(x), order_it_(y) {}
|
: super_t(y), m_elt_iter(x) {}
|
||||||
|
|
||||||
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
template<class OtherElementIterator, class OtherIndexIterator>
|
||||||
permutation_iterator(
|
permutation_iterator(
|
||||||
permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& r
|
permutation_iterator<OtherElementIterator, OtherIndexIterator> const& r
|
||||||
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
||||||
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
|
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
|
||||||
)
|
)
|
||||||
: super_t(r.base())
|
: super_t(r.base()), m_elt_iter(r.m_elt_iter)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typename super_t::reference dereference() const
|
typename super_t::reference dereference() const
|
||||||
{ return *(this->base() + *this->order_it_); }
|
{ return *(m_elt_iter + *this->base()); }
|
||||||
|
|
||||||
void increment() { ++this->order_it_; }
|
|
||||||
void decrement() { --this->order_it_; }
|
|
||||||
|
|
||||||
void advance(typename super_t::difference_type n)
|
ElementIterator m_elt_iter;
|
||||||
{
|
|
||||||
std::advance( order_it_, n );
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
|
||||||
typename super_t::difference_type
|
|
||||||
distance_to( permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& y ) const
|
|
||||||
{
|
|
||||||
return std::distance( this->order_it_, y.order_it_ );
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
|
||||||
bool
|
|
||||||
equal( permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& y ) const
|
|
||||||
{
|
|
||||||
return( y.order_it_ == this->order_it_ );
|
|
||||||
}
|
|
||||||
|
|
||||||
IndexIterator order_it_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -150,18 +150,18 @@ template <class T>
|
|||||||
struct in_iterator
|
struct in_iterator
|
||||||
: boost::iterator_adaptor<
|
: boost::iterator_adaptor<
|
||||||
in_iterator<T>
|
in_iterator<T>
|
||||||
, boost::input_iterator_archetype<T>
|
, boost::input_iterator_archetype_no_proxy<T>
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
typedef boost::iterator_adaptor<
|
typedef boost::iterator_adaptor<
|
||||||
in_iterator<T>
|
in_iterator<T>
|
||||||
, boost::input_iterator_archetype<T>
|
, boost::input_iterator_archetype_no_proxy<T>
|
||||||
> super_t;
|
> super_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
in_iterator() { }
|
in_iterator() { }
|
||||||
in_iterator(boost::input_iterator_archetype<T> d) : super_t(d) { }
|
in_iterator(boost::input_iterator_archetype_no_proxy<T> d) : super_t(d) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Iter>
|
template <class Iter>
|
||||||
@ -309,7 +309,7 @@ main()
|
|||||||
|
|
||||||
// check operator-> with an input iterator
|
// check operator-> with an input iterator
|
||||||
{
|
{
|
||||||
boost::input_iterator_archetype<dummyT> input_iter;
|
boost::input_iterator_archetype_no_proxy<dummyT> input_iter;
|
||||||
typedef in_iterator<dummyT> adaptor_type;
|
typedef in_iterator<dummyT> adaptor_type;
|
||||||
adaptor_type i(input_iter);
|
adaptor_type i(input_iter);
|
||||||
int zero = 0;
|
int zero = 0;
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
void permutation_test()
|
void permutation_test()
|
||||||
{
|
{
|
||||||
// Example taken from documentation of old permutation_iterator.
|
// Example taken from documentation of old permutation_iterator.
|
||||||
typedef std::vector< int > element_range_type;
|
typedef std::vector< double > element_range_type;
|
||||||
typedef std::list< int > index_type;
|
typedef std::list< int > index_type;
|
||||||
|
|
||||||
const int element_range_size = 10;
|
const int element_range_size = 10;
|
||||||
@ -52,21 +52,22 @@ void permutation_test()
|
|||||||
}
|
}
|
||||||
|
|
||||||
it = begin;
|
it = begin;
|
||||||
for( int i1 = 0; i1 < index_size - 1 ; i1+=2, it+=2 )
|
for( int i1 = 0; i1 < index_size - 1 ; ++++i1, ++++it )
|
||||||
{
|
{
|
||||||
index_type::iterator i_it2 = indices.begin();
|
index_type::iterator i_it2 = indices.begin();
|
||||||
std::advance( i_it2, i1 );
|
std::advance( i_it2, i1 );
|
||||||
BOOST_CHECK( *it == elements[ *i_it2 ] );
|
BOOST_CHECK( *it == elements[ *i_it2 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it = begin;
|
||||||
it = begin + (index_size);
|
std::advance(it, index_size);
|
||||||
for( index_type::iterator i_it3 = indices.end(); it != begin; )
|
for( index_type::iterator i_it3 = indices.end(); it != begin; )
|
||||||
{
|
{
|
||||||
BOOST_CHECK( *--it == elements[ *--i_it3 ] );
|
BOOST_CHECK( *--it == elements[ *--i_it3 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
it = begin + index_size;
|
it = begin;
|
||||||
|
std::advance(it, index_size);
|
||||||
for( int i2 = 0; i2 < index_size - 1; i2+=2, --it )
|
for( int i2 = 0; i2 < index_size - 1; i2+=2, --it )
|
||||||
{
|
{
|
||||||
index_type::iterator i_it4 = --indices.end();
|
index_type::iterator i_it4 = --indices.end();
|
||||||
|
Reference in New Issue
Block a user