From d5443d7fe25ba4b52ea328bece995ef9695b3ccb Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Fri, 12 Oct 2001 21:58:50 +0000 Subject: [PATCH] removed less() function from policies policies now operate on whole adaptors rather than Base types [SVN r11377] --- include/boost/counting_iterator.hpp | 27 +++-- include/boost/iterator_adaptors.hpp | 172 +++++++++++++--------------- 2 files changed, 99 insertions(+), 100 deletions(-) diff --git a/include/boost/counting_iterator.hpp b/include/boost/counting_iterator.hpp index 90d808d..84dce41 100644 --- a/include/boost/counting_iterator.hpp +++ b/include/boost/counting_iterator.hpp @@ -135,7 +135,15 @@ namespace detail { // For a while, this wasn't true, but we rely on it below. This is a regression assert. BOOST_STATIC_ASSERT(::boost::is_integral::value); # ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits::is_specialized); +# if defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) + BOOST_STATIC_CONSTANT(bool, + value = ( + std::numeric_limits::is_specialized + | boost::is_same::value + | boost::is_same::value)); +# else + BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits::is_specialized); +# endif # else # if !defined(__BORLANDC__) BOOST_STATIC_CONSTANT(bool, value = ( @@ -173,14 +181,17 @@ struct counting_iterator_traits { template struct counting_iterator_policies : public default_iterator_policies { - const Incrementable& dereference(type, const Incrementable& i) const - { return i; } - - template - Difference distance(type, const Iterator1& x, - const Iterator2& y) const + template + typename IteratorAdaptor::reference dereference(const IteratorAdaptor& i) const + { return i.base(); } + + template + typename Iterator1::difference_type distance( + const Iterator1& x, const Iterator2& y) const { - return boost::detail::any_distance(x, y);//,(Difference*)()); + typedef typename Iterator1::difference_type difference_type; + return boost::detail::any_distance( + x.base(), y.base()); } }; diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp index 96c60b8..2208d31 100644 --- a/include/boost/iterator_adaptors.hpp +++ b/include/boost/iterator_adaptors.hpp @@ -146,7 +146,7 @@ struct TrivialIteratorPoliciesConcept const_constraints(); } void const_constraints() const { - Reference r = p.dereference(type(), x); + Reference r = p.dereference(x); b = p.equal(x, x); ignore_unused_variable_warning(r); } @@ -208,8 +208,7 @@ struct RandomAccessIteratorPoliciesConcept ignore_unused_variable_warning(t); } void const_constraints() const { - n = p.distance(type(), x, x); - b = p.less(x, x); + n = p.distance(x, x); } Policies p; Adapted x; @@ -231,37 +230,30 @@ struct default_iterator_policies void initialize(Base&) { } - // The "type" parameter is a portable mechanism for - // the iterator_adaptor class to tell this member function what - // the Reference type is, which is needed for the return type. - template - Reference dereference(type, const Base& x) const - { return *x; } + template + typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const + { return *x.base(); } - template - void increment(Base& x) - { ++x; } + template + void increment(IteratorAdaptor& x) + { ++x.base(); } - template - void decrement(Base& x) - { --x; } + template + void decrement(IteratorAdaptor& x) + { --x.base(); } - template - void advance(Base& x, DifferenceType n) - { x += n; } + template + void advance(IteratorAdaptor& x, DifferenceType n) + { x.base() += n; } - template - Difference distance(type, const Iterator1& x, - const Iterator2& y) const - { return y - x; } + template + typename IteratorAdaptor1::difference_type + distance(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const + { return y.base() - x.base(); } - template - bool equal(const Iterator1& x, const Iterator2& y) const - { return x == y; } - - template - bool less(const Iterator1& x, const Iterator2& y) const - { return x < y; } + template + bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const + { return x.base() == y.base(); } }; // putting the comparisons in a base class avoids the g++ @@ -277,7 +269,7 @@ inline bool operator==(const iterator_comparisons& xb, { const D1& x = static_cast(xb); const D2& y = static_cast(yb); - return x.policies().equal(x.iter(), y.iter()); + return x.policies().equal(x, y); } template @@ -286,7 +278,7 @@ inline bool operator!=(const iterator_comparisons& xb, { const D1& x = static_cast(xb); const D2& y = static_cast(yb); - return !x.policies().equal(x.iter(), y.iter()); + return !x.policies().equal(x, y); } template @@ -295,7 +287,7 @@ inline bool operator<(const iterator_comparisons& xb, { const D1& x = static_cast(xb); const D2& y = static_cast(yb); - return x.policies().less(x.iter(), y.iter()); + return x.policies().distance(x, y) > 0; } template @@ -304,7 +296,7 @@ inline bool operator>(const iterator_comparisons& xb, { const D1& x = static_cast(xb); const D2& y = static_cast(yb); - return x.policies().less(y.iter(), x.iter()); + return x.policies().distance(y, x) > 0; } template @@ -313,7 +305,7 @@ inline bool operator>=(const iterator_comparisons& xb, { const D1& x = static_cast(xb); const D2& y = static_cast(yb); - return !x.policies().less(x.iter(), y.iter()); + return !(x.policies().distance(x, y) > 0); } template @@ -322,7 +314,7 @@ inline bool operator<=(const iterator_comparisons& xb, { const D1& x = static_cast(xb); const D2& y = static_cast(yb); - return !x.policies().less(y.iter(), x.iter()); + return !(x.policies().distance(y, x) > 0); } #endif @@ -641,15 +633,15 @@ struct iterator_adaptor : explicit iterator_adaptor(const Base& it, const Policies& p = Policies()) : m_iter_p(it, p) { - policies().initialize(iter()); + policies().initialize(base()); } template iterator_adaptor ( const iterator_adaptor& src) - : m_iter_p(src.iter(), src.policies()) + : m_iter_p(src.base(), src.policies()) { - policies().initialize(iter()); + policies().initialize(base()); } #if defined(BOOST_MSVC) || defined(__BORLANDC__) @@ -661,7 +653,7 @@ struct iterator_adaptor : } #endif reference operator*() const { - return policies().dereference(type(), iter()); + return policies().dereference(*this); } #ifdef BOOST_MSVC @@ -684,9 +676,9 @@ struct iterator_adaptor : #ifdef __MWERKS__ // Odd bug, MWERKS couldn't deduce the type for the member template // Workaround by explicitly specifying the type. - policies().increment(iter()); + policies().increment(*this); #else - policies().increment(iter()); + policies().increment(*this); #endif return *this; } @@ -695,9 +687,9 @@ struct iterator_adaptor : self& operator--() { #ifdef __MWERKS__ - policies().decrement(iter()); + policies().decrement(*this); #else - policies().decrement(iter()); + policies().decrement(*this); #endif return *this; } @@ -705,16 +697,16 @@ struct iterator_adaptor : self operator--(int) { self tmp(*this); --*this; return tmp; } self& operator+=(difference_type n) { - policies().advance(iter(), n); + policies().advance(*this, n); return *this; } self& operator-=(difference_type n) { - policies().advance(iter(), -n); + policies().advance(*this, -n); return *this; } - base_type base() const { return m_iter_p.first(); } + base_type const& base() const { return m_iter_p.first(); } // Moved from global scope to avoid ambiguity with the operator-() which // subtracts iterators from one another. @@ -724,11 +716,9 @@ private: compressed_pair m_iter_p; public: // implementation details (too many compilers have trouble when these are private). + base_type& base() { return m_iter_p.first(); } Policies& policies() { return m_iter_p.second(); } const Policies& policies() const { return m_iter_p.second(); } - - Base& iter() { return m_iter_p.first(); } - const Base& iter() const { return m_iter_p.first(); } }; template ::difference_type difference_type; - return x.policies().distance(type(), y.iter(), x.iter()); + return x.policies().distance(y, x); } #ifndef BOOST_RELOPS_AMBIGUITY_BUG @@ -773,7 +763,7 @@ operator==( const iterator_adaptor& x, const iterator_adaptor& y) { - return x.policies().equal(x.iter(), y.iter()); + return x.policies().equal(x, y); } template & x, const iterator_adaptor& y) { - return x.policies().less(x.iter(), y.iter()); + return x.policies().distance(x, y) > 0; } template ( const iterator_adaptor& x, const iterator_adaptor& y) { - return x.policies().less(y.iter(), x.iter()); + return x.policies().distance(y, x) > 0; } template =( const iterator_adaptor& x, const iterator_adaptor& y) { - return !x.policies().less(x.iter(), y.iter()); + return !(x.policies().distance(x, y) > 0); } template & x, const iterator_adaptor& y) { - return !x.policies().less(y.iter(), x.iter()); + return !(x.policies().distance(y, x) > 0); } template & x, const iterator_adaptor& y) { - return !x.policies().equal(x.iter(), y.iter()); + return !x.policies().equal(x, y); } #endif @@ -844,9 +834,10 @@ struct transform_iterator_policies : public default_iterator_policies transform_iterator_policies() { } transform_iterator_policies(const AdaptableUnaryFunction& f) : m_f(f) { } - template - Reference dereference(type, const Iterator& iter) const - { return m_f(*iter); } + template + typename IteratorAdaptor::reference + dereference(const IteratorAdaptor& iter) const + { return m_f(*iter.base()); } AdaptableUnaryFunction m_f; }; @@ -889,9 +880,9 @@ make_transform_iterator( struct indirect_iterator_policies : public default_iterator_policies { - template - Reference dereference(type, const Iterator& x) const - { return **x; } + template + typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const + { return **x.base(); } }; namespace detail { @@ -984,34 +975,30 @@ make_indirect_iterator(OuterIterator base) struct reverse_iterator_policies : public default_iterator_policies { - template - Reference dereference(type, const BidirectionalIterator& x) const - { return *boost::prior(x); } + template + typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const + { return *boost::prior(x.base()); } template void increment(BidirectionalIterator& x) const - { --x; } + { --x.base(); } template void decrement(BidirectionalIterator& x) const - { ++x; } + { ++x.base(); } template void advance(BidirectionalIterator& x, DifferenceType n) const - { x -= n; } + { x.base() -= n; } - template - Difference distance(type, const Iterator1& x, - const Iterator2& y) const - { return x - y; } + template + typename Iterator1::difference_type distance( + const Iterator1& x, const Iterator2& y) const + { return x.base() - y.base(); } template bool equal(const Iterator1& x, const Iterator2& y) const - { return x == y; } - - template - bool less(const Iterator1& x, const Iterator2& y) const - { return y < x; } + { return x.base() == y.base(); } }; template - Reference dereference (type, Iterator const& iter) const { - return m_f(*iter); + template + typename IteratorAdaptor::reference dereference(IteratorAdaptor const& iter) const { + return m_f(*iter.base()); } AdaptableUnaryFunction m_f; @@ -1113,28 +1100,29 @@ public: // The Iter template argument is neccessary for compatibility with a MWCW // bug workaround - template - void increment(Iter& x) { - ++x; - satisfy_predicate(x); + template + void increment(IteratorAdaptor& x) { + ++x.base(); + satisfy_predicate(x.base()); } - template - Reference dereference(type, const Iter& x) const - { return *x; } + template + typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const + { return *x.base(); } - template - bool equal(const Iterator1& x, const Iterator2& y) const - { return x == y; } + template + bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const + { return x.base() == y.base(); } private: void satisfy_predicate(Iterator& iter); Predicate m_predicate; Iterator m_end; }; + template -void filter_iterator_policies -::satisfy_predicate(Iterator& iter) +void filter_iterator_policies::satisfy_predicate( + Iterator& iter) { while (m_end != iter && !m_predicate(*iter)) ++iter;