forked from boostorg/iterator
This change excludes boost:: and boost::detail:: namespaces from ADL for unqualified function calls (e.g. algorithms). This reduces the possibility of name clashes with other libraries and user's code. One of the effects should be fixing test failures on gcc 4.2 and 4.4 due to clashed with Boost.TypeTraits. Also some of the functions marked with inline keyword.
75 lines
2.0 KiB
C++
75 lines
2.0 KiB
C++
// (C) Copyright David Abrahams 2002.
|
|
// (C) Copyright Jeremy Siek 2002.
|
|
// (C) Copyright Thomas Witt 2002.
|
|
// Distributed under the Boost Software License, Version 1.0. (See
|
|
// accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
#ifndef BOOST_REVERSE_ITERATOR_23022003THW_HPP
|
|
#define BOOST_REVERSE_ITERATOR_23022003THW_HPP
|
|
|
|
#include <boost/next_prior.hpp>
|
|
#include <boost/iterator.hpp>
|
|
#include <boost/iterator/iterator_adaptor.hpp>
|
|
|
|
namespace boost {
|
|
namespace iterators {
|
|
|
|
//
|
|
//
|
|
//
|
|
template <class Iterator>
|
|
class reverse_iterator
|
|
: public iterator_adaptor< reverse_iterator<Iterator>, Iterator >
|
|
{
|
|
typedef iterator_adaptor< reverse_iterator<Iterator>, Iterator > super_t;
|
|
|
|
friend class iterator_core_access;
|
|
|
|
public:
|
|
reverse_iterator() {}
|
|
|
|
explicit reverse_iterator(Iterator x)
|
|
: super_t(x) {}
|
|
|
|
template<class OtherIterator>
|
|
reverse_iterator(
|
|
reverse_iterator<OtherIterator> const& r
|
|
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
|
|
)
|
|
: super_t(r.base())
|
|
{}
|
|
|
|
private:
|
|
typename super_t::reference dereference() const { return *boost::prior(this->base()); }
|
|
|
|
void increment() { --this->base_reference(); }
|
|
void decrement() { ++this->base_reference(); }
|
|
|
|
void advance(typename super_t::difference_type n)
|
|
{
|
|
this->base_reference() += -n;
|
|
}
|
|
|
|
template <class OtherIterator>
|
|
typename super_t::difference_type
|
|
distance_to(reverse_iterator<OtherIterator> const& y) const
|
|
{
|
|
return this->base_reference() - y.base();
|
|
}
|
|
};
|
|
|
|
template <class BidirectionalIterator>
|
|
inline reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
|
|
{
|
|
return reverse_iterator<BidirectionalIterator>(x);
|
|
}
|
|
|
|
} // namespace iterators
|
|
|
|
using iterators::reverse_iterator;
|
|
using iterators::make_reverse_iterator;
|
|
|
|
} // namespace boost
|
|
|
|
#endif // BOOST_REVERSE_ITERATOR_23022003THW_HPP
|