diff --git a/include/boost/iterator/permutation_iterator.hpp b/include/boost/iterator/permutation_iterator.hpp index f41da1a..bb601c8 100644 --- a/include/boost/iterator/permutation_iterator.hpp +++ b/include/boost/iterator/permutation_iterator.hpp @@ -18,64 +18,40 @@ namespace boost { template< class ElementIterator - , class IndexIterator - , class ValueT = use_default - , class CategoryT = use_default - , class ReferenceT = use_default - , class DifferenceT = use_default > + , class IndexIterator> class permutation_iterator : public iterator_adaptor< - permutation_iterator - , ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT > + permutation_iterator + , IndexIterator, typename detail::iterator_traits::value_type + , use_default, typename detail::iterator_traits::reference> { typedef iterator_adaptor< - permutation_iterator - , ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT > super_t; + permutation_iterator + , IndexIterator, typename detail::iterator_traits::value_type + , use_default, typename detail::iterator_traits::reference> super_t; friend class iterator_core_access; public: - permutation_iterator() : order_it_() {} + permutation_iterator() : m_elt_iter() {} explicit permutation_iterator(ElementIterator x, IndexIterator y) - : super_t(x), order_it_(y) {} + : super_t(y), m_elt_iter(x) {} - template + template permutation_iterator( - permutation_iterator const& r + permutation_iterator const& r , typename enable_if_convertible::type* = 0 , typename enable_if_convertible::type* = 0 ) - : super_t(r.base()) + : super_t(r.base()), m_elt_iter(r.m_elt_iter) {} private: typename super_t::reference dereference() const - { return *(this->base() + *this->order_it_); } - - void increment() { ++this->order_it_; } - void decrement() { --this->order_it_; } + { return *(m_elt_iter + *this->base()); } - void advance(typename super_t::difference_type n) - { - std::advance( order_it_, n ); - } - - template - typename super_t::difference_type - distance_to( permutation_iterator const& y ) const - { - return std::distance( this->order_it_, y.order_it_ ); - } - - template - bool - equal( permutation_iterator const& y ) const - { - return( y.order_it_ == this->order_it_ ); - } - - IndexIterator order_it_; + ElementIterator m_elt_iter; }; diff --git a/test/iterator_adaptor_test.cpp b/test/iterator_adaptor_test.cpp index 961895f..ca39a87 100644 --- a/test/iterator_adaptor_test.cpp +++ b/test/iterator_adaptor_test.cpp @@ -150,18 +150,18 @@ template struct in_iterator : boost::iterator_adaptor< in_iterator - , boost::input_iterator_archetype + , boost::input_iterator_archetype_no_proxy > { private: typedef boost::iterator_adaptor< in_iterator - , boost::input_iterator_archetype + , boost::input_iterator_archetype_no_proxy > super_t; public: in_iterator() { } - in_iterator(boost::input_iterator_archetype d) : super_t(d) { } + in_iterator(boost::input_iterator_archetype_no_proxy d) : super_t(d) { } }; template @@ -309,7 +309,7 @@ main() // check operator-> with an input iterator { - boost::input_iterator_archetype input_iter; + boost::input_iterator_archetype_no_proxy input_iter; typedef in_iterator adaptor_type; adaptor_type i(input_iter); int zero = 0; diff --git a/test/permutation_iterator_test.cpp b/test/permutation_iterator_test.cpp index f409698..ad23300 100644 --- a/test/permutation_iterator_test.cpp +++ b/test/permutation_iterator_test.cpp @@ -20,7 +20,7 @@ void permutation_test() { // 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; const int element_range_size = 10; @@ -52,21 +52,22 @@ void permutation_test() } 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(); std::advance( i_it2, i1 ); BOOST_CHECK( *it == elements[ *i_it2 ] ); } - - it = begin + (index_size); + it = begin; + std::advance(it, index_size); for( index_type::iterator i_it3 = indices.end(); it != begin; ) { 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 ) { index_type::iterator i_it4 = --indices.end();