merged fix

[SVN r21869]
This commit is contained in:
Jeremy Siek
2004-01-21 20:03:32 +00:00
parent c90b123e7a
commit 62ecb49bb5
3 changed files with 24 additions and 47 deletions

View File

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

View File

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

View File

@ -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();