Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@101: // (C) Copyright Ion Gaztanaga 2005-2013. Chris@16: // (C) Copyright Gennaro Prota 2003 - 2004. Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/container for documentation. Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP Chris@16: #define BOOST_CONTAINER_DETAIL_ITERATORS_HPP Chris@16: Chris@101: #ifndef BOOST_CONFIG_HPP Chris@101: # include Chris@101: #endif Chris@101: Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@101: #include Chris@16: Chris@101: #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@101: #include Chris@101: #else Chris@16: #include Chris@16: #endif Chris@101: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace container { Chris@16: Chris@16: template Chris@16: class constant_iterator Chris@101: : public ::boost::container::iterator Chris@16: Chris@16: { Chris@16: typedef constant_iterator this_type; Chris@16: Chris@16: public: Chris@16: explicit constant_iterator(const T &ref, Difference range_size) Chris@16: : m_ptr(&ref), m_num(range_size){} Chris@16: Chris@16: //Constructors Chris@16: constant_iterator() Chris@16: : m_ptr(0), m_num(0){} Chris@16: Chris@16: constant_iterator& operator++() Chris@16: { increment(); return *this; } Chris@101: Chris@16: constant_iterator operator++(int) Chris@16: { Chris@16: constant_iterator result (*this); Chris@16: increment(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: constant_iterator& operator--() Chris@16: { decrement(); return *this; } Chris@101: Chris@16: constant_iterator operator--(int) Chris@16: { Chris@16: constant_iterator result (*this); Chris@16: decrement(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: friend bool operator== (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return i.equal(i2); } Chris@16: Chris@16: friend bool operator!= (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return !(i == i2); } Chris@16: Chris@16: friend bool operator< (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return i.less(i2); } Chris@16: Chris@16: friend bool operator> (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return i2 < i; } Chris@16: Chris@16: friend bool operator<= (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return !(i > i2); } Chris@16: Chris@16: friend bool operator>= (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return !(i < i2); } Chris@16: Chris@16: friend Difference operator- (const constant_iterator& i, const constant_iterator& i2) Chris@16: { return i2.distance_to(i); } Chris@16: Chris@16: //Arithmetic Chris@16: constant_iterator& operator+=(Difference off) Chris@16: { this->advance(off); return *this; } Chris@16: Chris@16: constant_iterator operator+(Difference off) const Chris@16: { Chris@16: constant_iterator other(*this); Chris@16: other.advance(off); Chris@16: return other; Chris@16: } Chris@16: Chris@16: friend constant_iterator operator+(Difference off, const constant_iterator& right) Chris@16: { return right + off; } Chris@16: Chris@16: constant_iterator& operator-=(Difference off) Chris@16: { this->advance(-off); return *this; } Chris@16: Chris@16: constant_iterator operator-(Difference off) const Chris@16: { return *this + (-off); } Chris@16: Chris@16: const T& operator*() const Chris@16: { return dereference(); } Chris@16: Chris@16: const T& operator[] (Difference ) const Chris@16: { return dereference(); } Chris@16: Chris@16: const T* operator->() const Chris@16: { return &(dereference()); } Chris@16: Chris@16: private: Chris@16: const T * m_ptr; Chris@16: Difference m_num; Chris@16: Chris@16: void increment() Chris@16: { --m_num; } Chris@16: Chris@16: void decrement() Chris@16: { ++m_num; } Chris@16: Chris@16: bool equal(const this_type &other) const Chris@16: { return m_num == other.m_num; } Chris@16: Chris@16: bool less(const this_type &other) const Chris@16: { return other.m_num < m_num; } Chris@16: Chris@16: const T & dereference() const Chris@16: { return *m_ptr; } Chris@16: Chris@16: void advance(Difference n) Chris@16: { m_num -= n; } Chris@16: Chris@16: Difference distance_to(const this_type &other)const Chris@16: { return m_num - other.m_num; } Chris@16: }; Chris@16: Chris@101: template Chris@16: class value_init_construct_iterator Chris@101: : public ::boost::container::iterator Chris@16: Chris@16: { Chris@16: typedef value_init_construct_iterator this_type; Chris@16: Chris@16: public: Chris@16: explicit value_init_construct_iterator(Difference range_size) Chris@16: : m_num(range_size){} Chris@16: Chris@16: //Constructors Chris@16: value_init_construct_iterator() Chris@16: : m_num(0){} Chris@16: Chris@16: value_init_construct_iterator& operator++() Chris@16: { increment(); return *this; } Chris@101: Chris@16: value_init_construct_iterator operator++(int) Chris@16: { Chris@16: value_init_construct_iterator result (*this); Chris@16: increment(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: value_init_construct_iterator& operator--() Chris@16: { decrement(); return *this; } Chris@101: Chris@16: value_init_construct_iterator operator--(int) Chris@16: { Chris@16: value_init_construct_iterator result (*this); Chris@16: decrement(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: friend bool operator== (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return i.equal(i2); } Chris@16: Chris@16: friend bool operator!= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return !(i == i2); } Chris@16: Chris@16: friend bool operator< (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return i.less(i2); } Chris@16: Chris@16: friend bool operator> (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return i2 < i; } Chris@16: Chris@16: friend bool operator<= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return !(i > i2); } Chris@16: Chris@16: friend bool operator>= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return !(i < i2); } Chris@16: Chris@16: friend Difference operator- (const value_init_construct_iterator& i, const value_init_construct_iterator& i2) Chris@16: { return i2.distance_to(i); } Chris@16: Chris@16: //Arithmetic Chris@16: value_init_construct_iterator& operator+=(Difference off) Chris@16: { this->advance(off); return *this; } Chris@16: Chris@16: value_init_construct_iterator operator+(Difference off) const Chris@16: { Chris@16: value_init_construct_iterator other(*this); Chris@16: other.advance(off); Chris@16: return other; Chris@16: } Chris@16: Chris@16: friend value_init_construct_iterator operator+(Difference off, const value_init_construct_iterator& right) Chris@16: { return right + off; } Chris@16: Chris@16: value_init_construct_iterator& operator-=(Difference off) Chris@16: { this->advance(-off); return *this; } Chris@16: Chris@16: value_init_construct_iterator operator-(Difference off) const Chris@16: { return *this + (-off); } Chris@16: Chris@16: //This pseudo-iterator's dereference operations have no sense since value is not Chris@16: //constructed until ::boost::container::construct_in_place is called. Chris@16: //So comment them to catch bad uses Chris@16: //const T& operator*() const; Chris@16: //const T& operator[](difference_type) const; Chris@16: //const T* operator->() const; Chris@16: Chris@16: private: Chris@16: Difference m_num; Chris@16: Chris@16: void increment() Chris@16: { --m_num; } Chris@16: Chris@16: void decrement() Chris@16: { ++m_num; } Chris@16: Chris@16: bool equal(const this_type &other) const Chris@16: { return m_num == other.m_num; } Chris@16: Chris@16: bool less(const this_type &other) const Chris@16: { return other.m_num < m_num; } Chris@16: Chris@16: const T & dereference() const Chris@16: { Chris@16: static T dummy; Chris@16: return dummy; Chris@16: } Chris@16: Chris@16: void advance(Difference n) Chris@16: { m_num -= n; } Chris@16: Chris@16: Difference distance_to(const this_type &other)const Chris@16: { return m_num - other.m_num; } Chris@16: }; Chris@16: Chris@101: template Chris@16: class default_init_construct_iterator Chris@101: : public ::boost::container::iterator Chris@16: Chris@16: { Chris@16: typedef default_init_construct_iterator this_type; Chris@16: Chris@16: public: Chris@16: explicit default_init_construct_iterator(Difference range_size) Chris@16: : m_num(range_size){} Chris@16: Chris@16: //Constructors Chris@16: default_init_construct_iterator() Chris@16: : m_num(0){} Chris@16: Chris@16: default_init_construct_iterator& operator++() Chris@16: { increment(); return *this; } Chris@101: Chris@16: default_init_construct_iterator operator++(int) Chris@16: { Chris@16: default_init_construct_iterator result (*this); Chris@16: increment(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: default_init_construct_iterator& operator--() Chris@16: { decrement(); return *this; } Chris@101: Chris@16: default_init_construct_iterator operator--(int) Chris@16: { Chris@16: default_init_construct_iterator result (*this); Chris@16: decrement(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: friend bool operator== (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return i.equal(i2); } Chris@16: Chris@16: friend bool operator!= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return !(i == i2); } Chris@16: Chris@16: friend bool operator< (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return i.less(i2); } Chris@16: Chris@16: friend bool operator> (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return i2 < i; } Chris@16: Chris@16: friend bool operator<= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return !(i > i2); } Chris@16: Chris@16: friend bool operator>= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return !(i < i2); } Chris@16: Chris@16: friend Difference operator- (const default_init_construct_iterator& i, const default_init_construct_iterator& i2) Chris@16: { return i2.distance_to(i); } Chris@16: Chris@16: //Arithmetic Chris@16: default_init_construct_iterator& operator+=(Difference off) Chris@16: { this->advance(off); return *this; } Chris@16: Chris@16: default_init_construct_iterator operator+(Difference off) const Chris@16: { Chris@16: default_init_construct_iterator other(*this); Chris@16: other.advance(off); Chris@16: return other; Chris@16: } Chris@16: Chris@16: friend default_init_construct_iterator operator+(Difference off, const default_init_construct_iterator& right) Chris@16: { return right + off; } Chris@16: Chris@16: default_init_construct_iterator& operator-=(Difference off) Chris@16: { this->advance(-off); return *this; } Chris@16: Chris@16: default_init_construct_iterator operator-(Difference off) const Chris@16: { return *this + (-off); } Chris@16: Chris@16: //This pseudo-iterator's dereference operations have no sense since value is not Chris@16: //constructed until ::boost::container::construct_in_place is called. Chris@16: //So comment them to catch bad uses Chris@16: //const T& operator*() const; Chris@16: //const T& operator[](difference_type) const; Chris@16: //const T* operator->() const; Chris@16: Chris@16: private: Chris@16: Difference m_num; Chris@16: Chris@16: void increment() Chris@16: { --m_num; } Chris@16: Chris@16: void decrement() Chris@16: { ++m_num; } Chris@16: Chris@16: bool equal(const this_type &other) const Chris@16: { return m_num == other.m_num; } Chris@16: Chris@16: bool less(const this_type &other) const Chris@16: { return other.m_num < m_num; } Chris@16: Chris@16: const T & dereference() const Chris@16: { Chris@16: static T dummy; Chris@16: return dummy; Chris@16: } Chris@16: Chris@16: void advance(Difference n) Chris@16: { m_num -= n; } Chris@16: Chris@16: Difference distance_to(const this_type &other)const Chris@16: { return m_num - other.m_num; } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: class repeat_iterator Chris@101: : public ::boost::container::iterator Chris@16: Chris@16: { Chris@16: typedef repeat_iterator this_type; Chris@16: public: Chris@16: explicit repeat_iterator(T &ref, Difference range_size) Chris@16: : m_ptr(&ref), m_num(range_size){} Chris@16: Chris@16: //Constructors Chris@16: repeat_iterator() Chris@16: : m_ptr(0), m_num(0){} Chris@16: Chris@16: this_type& operator++() Chris@16: { increment(); return *this; } Chris@101: Chris@16: this_type operator++(int) Chris@16: { Chris@16: this_type result (*this); Chris@16: increment(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: this_type& operator--() Chris@16: { increment(); return *this; } Chris@101: Chris@16: this_type operator--(int) Chris@16: { Chris@16: this_type result (*this); Chris@16: increment(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: friend bool operator== (const this_type& i, const this_type& i2) Chris@16: { return i.equal(i2); } Chris@16: Chris@16: friend bool operator!= (const this_type& i, const this_type& i2) Chris@16: { return !(i == i2); } Chris@16: Chris@16: friend bool operator< (const this_type& i, const this_type& i2) Chris@16: { return i.less(i2); } Chris@16: Chris@16: friend bool operator> (const this_type& i, const this_type& i2) Chris@16: { return i2 < i; } Chris@16: Chris@16: friend bool operator<= (const this_type& i, const this_type& i2) Chris@16: { return !(i > i2); } Chris@16: Chris@16: friend bool operator>= (const this_type& i, const this_type& i2) Chris@16: { return !(i < i2); } Chris@16: Chris@16: friend Difference operator- (const this_type& i, const this_type& i2) Chris@16: { return i2.distance_to(i); } Chris@16: Chris@16: //Arithmetic Chris@16: this_type& operator+=(Difference off) Chris@16: { this->advance(off); return *this; } Chris@16: Chris@16: this_type operator+(Difference off) const Chris@16: { Chris@16: this_type other(*this); Chris@16: other.advance(off); Chris@16: return other; Chris@16: } Chris@16: Chris@16: friend this_type operator+(Difference off, const this_type& right) Chris@16: { return right + off; } Chris@16: Chris@16: this_type& operator-=(Difference off) Chris@16: { this->advance(-off); return *this; } Chris@16: Chris@16: this_type operator-(Difference off) const Chris@16: { return *this + (-off); } Chris@16: Chris@16: T& operator*() const Chris@16: { return dereference(); } Chris@16: Chris@16: T& operator[] (Difference ) const Chris@16: { return dereference(); } Chris@16: Chris@16: T *operator->() const Chris@16: { return &(dereference()); } Chris@16: Chris@16: private: Chris@16: T * m_ptr; Chris@16: Difference m_num; Chris@16: Chris@16: void increment() Chris@16: { --m_num; } Chris@16: Chris@16: void decrement() Chris@16: { ++m_num; } Chris@16: Chris@16: bool equal(const this_type &other) const Chris@16: { return m_num == other.m_num; } Chris@16: Chris@16: bool less(const this_type &other) const Chris@16: { return other.m_num < m_num; } Chris@16: Chris@16: T & dereference() const Chris@16: { return *m_ptr; } Chris@16: Chris@16: void advance(Difference n) Chris@16: { m_num -= n; } Chris@16: Chris@16: Difference distance_to(const this_type &other)const Chris@16: { return m_num - other.m_num; } Chris@16: }; Chris@16: Chris@16: template Chris@16: class emplace_iterator Chris@101: : public ::boost::container::iterator Chris@16: Chris@16: { Chris@16: typedef emplace_iterator this_type; Chris@16: Chris@16: public: Chris@16: typedef Difference difference_type; Chris@16: explicit emplace_iterator(EmplaceFunctor&e) Chris@16: : m_num(1), m_pe(&e){} Chris@16: Chris@16: emplace_iterator() Chris@16: : m_num(0), m_pe(0){} Chris@16: Chris@16: this_type& operator++() Chris@16: { increment(); return *this; } Chris@101: Chris@16: this_type operator++(int) Chris@16: { Chris@16: this_type result (*this); Chris@16: increment(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: this_type& operator--() Chris@16: { decrement(); return *this; } Chris@101: Chris@16: this_type operator--(int) Chris@16: { Chris@16: this_type result (*this); Chris@16: decrement(); Chris@16: return result; Chris@16: } Chris@16: Chris@16: friend bool operator== (const this_type& i, const this_type& i2) Chris@16: { return i.equal(i2); } Chris@16: Chris@16: friend bool operator!= (const this_type& i, const this_type& i2) Chris@16: { return !(i == i2); } Chris@16: Chris@16: friend bool operator< (const this_type& i, const this_type& i2) Chris@16: { return i.less(i2); } Chris@16: Chris@16: friend bool operator> (const this_type& i, const this_type& i2) Chris@16: { return i2 < i; } Chris@16: Chris@16: friend bool operator<= (const this_type& i, const this_type& i2) Chris@16: { return !(i > i2); } Chris@16: Chris@16: friend bool operator>= (const this_type& i, const this_type& i2) Chris@16: { return !(i < i2); } Chris@16: Chris@16: friend difference_type operator- (const this_type& i, const this_type& i2) Chris@16: { return i2.distance_to(i); } Chris@16: Chris@16: //Arithmetic Chris@16: this_type& operator+=(difference_type off) Chris@16: { this->advance(off); return *this; } Chris@16: Chris@16: this_type operator+(difference_type off) const Chris@16: { Chris@16: this_type other(*this); Chris@16: other.advance(off); Chris@16: return other; Chris@16: } Chris@16: Chris@16: friend this_type operator+(difference_type off, const this_type& right) Chris@16: { return right + off; } Chris@16: Chris@16: this_type& operator-=(difference_type off) Chris@16: { this->advance(-off); return *this; } Chris@16: Chris@16: this_type operator-(difference_type off) const Chris@16: { return *this + (-off); } Chris@16: Chris@16: //This pseudo-iterator's dereference operations have no sense since value is not Chris@16: //constructed until ::boost::container::construct_in_place is called. Chris@16: //So comment them to catch bad uses Chris@16: //const T& operator*() const; Chris@16: //const T& operator[](difference_type) const; Chris@16: //const T* operator->() const; Chris@16: Chris@101: template Chris@101: void construct_in_place(Allocator &a, T* ptr) Chris@16: { (*m_pe)(a, ptr); } Chris@16: Chris@16: private: Chris@16: difference_type m_num; Chris@16: EmplaceFunctor * m_pe; Chris@16: Chris@16: void increment() Chris@16: { --m_num; } Chris@16: Chris@16: void decrement() Chris@16: { ++m_num; } Chris@16: Chris@16: bool equal(const this_type &other) const Chris@16: { return m_num == other.m_num; } Chris@16: Chris@16: bool less(const this_type &other) const Chris@16: { return other.m_num < m_num; } Chris@16: Chris@16: const T & dereference() const Chris@16: { Chris@16: static T dummy; Chris@16: return dummy; Chris@16: } Chris@16: Chris@16: void advance(difference_type n) Chris@16: { m_num -= n; } Chris@16: Chris@16: difference_type distance_to(const this_type &other)const Chris@16: { return difference_type(m_num - other.m_num); } Chris@16: }; Chris@16: Chris@101: #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: Chris@16: template Chris@16: struct emplace_functor Chris@16: { Chris@16: typedef typename container_detail::build_number_seq::type index_tuple_t; Chris@16: Chris@101: emplace_functor(BOOST_FWD_REF(Args)... args) Chris@16: : args_(args...) Chris@16: {} Chris@16: Chris@101: template Chris@101: void operator()(Allocator &a, T *ptr) Chris@16: { emplace_functor::inplace_impl(a, ptr, index_tuple_t()); } Chris@16: Chris@101: template Chris@101: void inplace_impl(Allocator &a, T* ptr, const container_detail::index_tuple&) Chris@16: { Chris@101: allocator_traits::construct Chris@16: (a, ptr, ::boost::forward(container_detail::get(args_))...); Chris@16: } Chris@16: Chris@16: container_detail::tuple args_; Chris@16: }; Chris@16: Chris@101: #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: Chris@101: #define BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE(N) \ Chris@101: BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \ Chris@101: struct emplace_functor##N\ Chris@101: {\ Chris@101: explicit emplace_functor##N( BOOST_MOVE_UREF##N )\ Chris@101: BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\ Chris@101: \ Chris@101: template\ Chris@101: void operator()(Allocator &a, T *ptr)\ Chris@101: { allocator_traits::construct(a, ptr BOOST_MOVE_I##N BOOST_MOVE_MFWD##N); }\ Chris@101: \ Chris@101: BOOST_MOVE_MREF##N\ Chris@101: };\ Chris@101: // Chris@101: BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE) Chris@101: #undef BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE Chris@16: Chris@16: #endif Chris@16: Chris@16: namespace container_detail { Chris@16: Chris@16: template Chris@16: struct has_iterator_category Chris@16: { Chris@16: template Chris@16: static char test(int, typename X::iterator_category*); Chris@16: Chris@16: template Chris@16: static int test(int, ...); Chris@16: Chris@16: static const bool value = (1 == sizeof(test(0, 0))); Chris@16: }; Chris@16: Chris@16: Chris@16: template::value > Chris@16: struct is_input_iterator Chris@16: { Chris@16: static const bool value = is_same::value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct is_input_iterator Chris@16: { Chris@16: static const bool value = false; Chris@16: }; Chris@16: Chris@16: template::value > Chris@16: struct is_forward_iterator Chris@16: { Chris@16: static const bool value = is_same::value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct is_forward_iterator Chris@16: { Chris@16: static const bool value = false; Chris@16: }; Chris@16: Chris@16: template::value > Chris@16: struct is_bidirectional_iterator Chris@16: { Chris@16: static const bool value = is_same::value; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct is_bidirectional_iterator Chris@16: { Chris@16: static const bool value = false; Chris@16: }; Chris@16: Chris@101: template Chris@101: struct iiterator_node_value_type { Chris@101: typedef typename IINodeType::value_type type; Chris@101: }; Chris@101: Chris@16: template Chris@16: struct iiterator_types Chris@16: { Chris@16: typedef typename IIterator::value_type it_value_type; Chris@101: typedef typename iiterator_node_value_type::type value_type; Chris@101: typedef typename boost::container::iterator_traits::pointer it_pointer; Chris@101: typedef typename boost::container::iterator_traits::difference_type difference_type; Chris@16: typedef typename ::boost::intrusive::pointer_traits:: Chris@16: template rebind_pointer::type pointer; Chris@16: typedef typename ::boost::intrusive::pointer_traits:: Chris@16: template rebind_pointer::type const_pointer; Chris@16: typedef typename ::boost::intrusive:: Chris@16: pointer_traits::reference reference; Chris@16: typedef typename ::boost::intrusive:: Chris@16: pointer_traits::reference const_reference; Chris@16: typedef typename IIterator::iterator_category iterator_category; Chris@16: }; Chris@16: Chris@16: template Chris@101: struct iterator_types Chris@16: { Chris@101: typedef typename ::boost::container::iterator Chris@16: < typename iiterator_types::iterator_category Chris@16: , typename iiterator_types::value_type Chris@16: , typename iiterator_types::difference_type Chris@16: , typename iiterator_types::const_pointer Chris@16: , typename iiterator_types::const_reference> type; Chris@16: }; Chris@16: Chris@16: template Chris@101: struct iterator_types Chris@16: { Chris@101: typedef typename ::boost::container::iterator Chris@16: < typename iiterator_types::iterator_category Chris@16: , typename iiterator_types::value_type Chris@16: , typename iiterator_types::difference_type Chris@16: , typename iiterator_types::pointer Chris@16: , typename iiterator_types::reference> type; Chris@16: }; Chris@16: Chris@16: template Chris@101: class iterator_from_iiterator Chris@16: { Chris@101: typedef typename iterator_types::type types_t; Chris@16: Chris@16: public: Chris@101: typedef typename types_t::pointer pointer; Chris@101: typedef typename types_t::reference reference; Chris@101: typedef typename types_t::difference_type difference_type; Chris@101: typedef typename types_t::iterator_category iterator_category; Chris@101: typedef typename types_t::value_type value_type; Chris@16: Chris@101: iterator_from_iiterator() Chris@16: {} Chris@16: Chris@101: explicit iterator_from_iiterator(IIterator iit) BOOST_NOEXCEPT_OR_NOTHROW Chris@16: : m_iit(iit) Chris@16: {} Chris@16: Chris@101: iterator_from_iiterator(iterator_from_iiterator const& other) BOOST_NOEXCEPT_OR_NOTHROW Chris@16: : m_iit(other.get()) Chris@16: {} Chris@16: Chris@101: iterator_from_iiterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { ++this->m_iit; return *this; } Chris@16: Chris@101: iterator_from_iiterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { Chris@101: iterator_from_iiterator result (*this); Chris@16: ++this->m_iit; Chris@16: return result; Chris@16: } Chris@16: Chris@101: iterator_from_iiterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { Chris@101: //If the iterator_from_iiterator is not a bidirectional iterator, operator-- should not exist Chris@101: BOOST_STATIC_ASSERT((is_bidirectional_iterator::value)); Chris@16: --this->m_iit; return *this; Chris@16: } Chris@16: Chris@101: iterator_from_iiterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { Chris@101: iterator_from_iiterator result (*this); Chris@16: --this->m_iit; Chris@16: return result; Chris@16: } Chris@16: Chris@101: friend bool operator== (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { return l.m_iit == r.m_iit; } Chris@16: Chris@101: friend bool operator!= (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { return !(l == r); } Chris@16: Chris@101: reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { return (*this->m_iit).get_data(); } Chris@16: Chris@101: pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { return ::boost::intrusive::pointer_traits::pointer_to(this->operator*()); } Chris@16: Chris@101: const IIterator &get() const BOOST_NOEXCEPT_OR_NOTHROW Chris@16: { return this->m_iit; } Chris@16: Chris@16: private: Chris@16: IIterator m_iit; Chris@16: }; Chris@16: Chris@16: } //namespace container_detail { Chris@101: Chris@101: using ::boost::intrusive::reverse_iterator; Chris@101: Chris@16: } //namespace container { Chris@16: } //namespace boost { Chris@16: Chris@16: #include Chris@16: Chris@16: #endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP