forked from boostorg/iterator
initial checkin of iterator_adaptors, same as original wrapped_iterator
except for changing the name to iterator_adaptor [SVN r7644]
This commit is contained in:
211
include/boost/iterator_adaptors.hpp
Normal file
211
include/boost/iterator_adaptors.hpp
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
// (C) Copyright David Abrahams 2000. Permission to copy, use, modify, sell and
|
||||||
|
// distribute this software is granted provided this copyright notice appears
|
||||||
|
// in all copies. This software is provided "as is" without express or implied
|
||||||
|
// warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_ADAPTOR_DWA053000_HPP_
|
||||||
|
# define BOOST_ITERATOR_ADAPTOR_DWA053000_HPP_
|
||||||
|
|
||||||
|
// MSVC complains about the wrong stuff unless you disable this. We should add
|
||||||
|
// this to config.hpp
|
||||||
|
|
||||||
|
#include <boost/operators.hpp>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
|
||||||
|
// Just a "type envelope"; works around some MSVC deficiencies.
|
||||||
|
template <class T>
|
||||||
|
struct type {};
|
||||||
|
|
||||||
|
// Default policies for wrapped iterators. You can use this as a base
|
||||||
|
// class if you want to customize particular policies.
|
||||||
|
struct default_iterator_policies
|
||||||
|
{
|
||||||
|
template <class Reference, class Iterator>
|
||||||
|
static Reference dereference(type<Reference>, const Iterator& x)
|
||||||
|
{ return *x; }
|
||||||
|
|
||||||
|
template <class Iterator>
|
||||||
|
static void increment(Iterator& x)
|
||||||
|
{ ++x; }
|
||||||
|
|
||||||
|
template <class Iterator>
|
||||||
|
static void decrement(Iterator& x)
|
||||||
|
{ --x; }
|
||||||
|
|
||||||
|
template <class Iterator, class DifferenceType>
|
||||||
|
static void advance(Iterator& x, DifferenceType n)
|
||||||
|
{ x += n; }
|
||||||
|
|
||||||
|
template <class Difference, class Iterator1, class Iterator2>
|
||||||
|
static Difference distance(type<Difference>, Iterator1& x, Iterator2& y)
|
||||||
|
{ return y - x; }
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2>
|
||||||
|
static bool equal(Iterator1& x, Iterator2& y)
|
||||||
|
{ return x == y; }
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2>
|
||||||
|
static bool less(Iterator1& x, Iterator2& y)
|
||||||
|
{ return x < y; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// iterator_adaptor - A generalized adaptor around an existing iterator, which is itself an iterator
|
||||||
|
//
|
||||||
|
// Iterator - the iterator type being wrapped.
|
||||||
|
//
|
||||||
|
// Policies - a set of policies determining how the resulting iterator
|
||||||
|
// works.
|
||||||
|
//
|
||||||
|
// NonconstIterator - the corresponding non-const iterator type for
|
||||||
|
// Iterator, if any. You don't need to supply this if you are not make a
|
||||||
|
// const/non-const iterator pair.
|
||||||
|
//
|
||||||
|
// Traits - a class satisfying the same requirements as a specialization of
|
||||||
|
// std::iterator_traits for the resulting iterator.
|
||||||
|
//
|
||||||
|
template <class Iterator, class Policies, class NonconstIterator = Iterator, class Traits = std::iterator_traits<Iterator> >
|
||||||
|
struct iterator_adaptor
|
||||||
|
: std::iterator<typename Traits::iterator_category, typename Traits::value_type, typename Traits::difference_type, typename Traits::pointer, typename Traits::reference>
|
||||||
|
{
|
||||||
|
typedef iterator_adaptor<Iterator, Policies, NonconstIterator, Traits> Self;
|
||||||
|
public:
|
||||||
|
typedef typename Traits::difference_type difference_type;
|
||||||
|
typedef typename Traits::value_type value_type;
|
||||||
|
typedef typename Traits::pointer pointer;
|
||||||
|
typedef typename Traits::reference reference;
|
||||||
|
typedef typename Traits::iterator_category iterator_category;
|
||||||
|
|
||||||
|
iterator_adaptor(const Iterator& impl)
|
||||||
|
: m_impl(impl) {}
|
||||||
|
|
||||||
|
template <class OtherTraits>
|
||||||
|
iterator_adaptor(const iterator_adaptor<NonconstIterator, Policies, NonconstIterator, OtherTraits>& rhs)
|
||||||
|
: m_impl(rhs.m_impl) {}
|
||||||
|
|
||||||
|
template <class OtherTraits>
|
||||||
|
Self& operator=(const iterator_adaptor<NonconstIterator, Policies, NonconstIterator, OtherTraits>& rhs)
|
||||||
|
{ m_impl = rhs.m_impl; return *this; }
|
||||||
|
|
||||||
|
reference operator*() const {
|
||||||
|
return Policies::dereference(type<reference>(), m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(push)
|
||||||
|
# pragma warning( disable : 4284 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pointer operator->() const
|
||||||
|
{ return &*this; }
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
reference operator[](difference_type n)
|
||||||
|
{ return *(*this + n); }
|
||||||
|
|
||||||
|
Self& operator++() {
|
||||||
|
Policies::increment(m_impl);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self& operator++(int) { Self tmp(*this); ++*this; return tmp; }
|
||||||
|
|
||||||
|
Self& operator--() {
|
||||||
|
Policies::decrement(m_impl);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self& operator--(int) { Self tmp(*this); --*this; return tmp; }
|
||||||
|
|
||||||
|
Self& operator+=(difference_type n) {
|
||||||
|
Policies::advance(m_impl, n);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self& operator-=(difference_type n) {
|
||||||
|
Policies::advance(m_impl, -n);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef Policies policies_type;
|
||||||
|
public: // too many compilers have trouble when this is private.
|
||||||
|
Iterator m_impl;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Iterator, class Policies, class NonconstIterator, class Traits>
|
||||||
|
iterator_adaptor<Iterator,Policies,NonconstIterator,Traits>
|
||||||
|
operator-(iterator_adaptor<Iterator,Policies,NonconstIterator,Traits> p, const typename Traits::difference_type x)
|
||||||
|
{
|
||||||
|
return p -= x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator, class Policies, class NonconstIterator, class Traits>
|
||||||
|
iterator_adaptor<Iterator,Policies,NonconstIterator,Traits>
|
||||||
|
operator+(iterator_adaptor<Iterator,Policies,NonconstIterator,Traits> p, const typename Traits::difference_type x)
|
||||||
|
{
|
||||||
|
return p += x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator, class Policies, class NonconstIterator, class Traits>
|
||||||
|
iterator_adaptor<Iterator,Policies,NonconstIterator,Traits>
|
||||||
|
operator+(const typename Traits::difference_type x, iterator_adaptor<Iterator,Policies,NonconstIterator,Traits> p)
|
||||||
|
{
|
||||||
|
return p += x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
typename Traits1::difference_type operator-(
|
||||||
|
const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x,
|
||||||
|
const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y )
|
||||||
|
{
|
||||||
|
typedef typename Traits1::difference_type difference_type;
|
||||||
|
return Policies::distance(type<difference_type>(), y.m_impl, x.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
inline bool
|
||||||
|
operator==(const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x, const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y) {
|
||||||
|
return Policies::equal(x.m_impl, y.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
inline bool
|
||||||
|
operator<(const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x, const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y) {
|
||||||
|
return Policies::less(x.m_impl, y.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
inline bool
|
||||||
|
operator>(const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x,
|
||||||
|
const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y) {
|
||||||
|
return Policies::less(y.m_impl, x.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
inline bool
|
||||||
|
operator>=(const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x, const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y) {
|
||||||
|
return !Policies::less(x.m_impl, y.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
inline bool
|
||||||
|
operator<=(const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x,
|
||||||
|
const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y) {
|
||||||
|
return !Policies::less(y.m_impl, x.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator1, class Iterator2, class Policies, class NonconstIterator, class Traits1, class Traits2>
|
||||||
|
inline bool
|
||||||
|
operator!=(const iterator_adaptor<Iterator1,Policies,NonconstIterator,Traits1>& x,
|
||||||
|
const iterator_adaptor<Iterator2,Policies,NonconstIterator,Traits2>& y) {
|
||||||
|
return !Policies::equal(x.m_impl, y.m_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Reference in New Issue
Block a user