123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892 |
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Ion Gaztanaga 2005-2013.
- // (C) Copyright Gennaro Prota 2003 - 2004.
- //
- // 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)
- //
- // See http://www.boost.org/libs/container for documentation.
- //
- //////////////////////////////////////////////////////////////////////////////
- #ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
- #define BOOST_CONTAINER_DETAIL_ITERATORS_HPP
- #ifndef BOOST_CONFIG_HPP
- # include <boost/config.hpp>
- #endif
- #if defined(BOOST_HAS_PRAGMA_ONCE)
- # pragma once
- #endif
- #include <boost/container/detail/config_begin.hpp>
- #include <boost/container/detail/workaround.hpp>
- #include <boost/container/allocator_traits.hpp>
- #include <boost/container/detail/type_traits.hpp>
- #include <boost/container/detail/value_init.hpp>
- #include <boost/static_assert.hpp>
- #include <boost/move/utility_core.hpp>
- #include <boost/intrusive/detail/reverse_iterator.hpp>
- #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- #include <boost/move/detail/fwd_macros.hpp>
- #else
- #include <boost/container/detail/variadic_templates_tools.hpp>
- #endif
- #include <boost/container/detail/iterator.hpp>
- namespace boost {
- namespace container {
- template <class T, class Difference = std::ptrdiff_t>
- class constant_iterator
- : public ::boost::container::iterator
- <std::random_access_iterator_tag, T, Difference, const T*, const T &>
- {
- typedef constant_iterator<T, Difference> this_type;
- public:
- BOOST_CONTAINER_FORCEINLINE explicit constant_iterator(const T &ref, Difference range_size)
- : m_ptr(&ref), m_num(range_size){}
- //Constructors
- BOOST_CONTAINER_FORCEINLINE constant_iterator()
- : m_ptr(0), m_num(0){}
- BOOST_CONTAINER_FORCEINLINE constant_iterator& operator++()
- { increment(); return *this; }
- BOOST_CONTAINER_FORCEINLINE constant_iterator operator++(int)
- {
- constant_iterator result (*this);
- increment();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE constant_iterator& operator--()
- { decrement(); return *this; }
- BOOST_CONTAINER_FORCEINLINE constant_iterator operator--(int)
- {
- constant_iterator result (*this);
- decrement();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE friend bool operator== (const constant_iterator& i, const constant_iterator& i2)
- { return i.equal(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const constant_iterator& i, const constant_iterator& i2)
- { return !(i == i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator< (const constant_iterator& i, const constant_iterator& i2)
- { return i.less(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator> (const constant_iterator& i, const constant_iterator& i2)
- { return i2 < i; }
- BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const constant_iterator& i, const constant_iterator& i2)
- { return !(i > i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const constant_iterator& i, const constant_iterator& i2)
- { return !(i < i2); }
- BOOST_CONTAINER_FORCEINLINE friend Difference operator- (const constant_iterator& i, const constant_iterator& i2)
- { return i2.distance_to(i); }
- //Arithmetic
- BOOST_CONTAINER_FORCEINLINE constant_iterator& operator+=(Difference off)
- { this->advance(off); return *this; }
- BOOST_CONTAINER_FORCEINLINE constant_iterator operator+(Difference off) const
- {
- constant_iterator other(*this);
- other.advance(off);
- return other;
- }
- BOOST_CONTAINER_FORCEINLINE friend constant_iterator operator+(Difference off, const constant_iterator& right)
- { return right + off; }
- BOOST_CONTAINER_FORCEINLINE constant_iterator& operator-=(Difference off)
- { this->advance(-off); return *this; }
- BOOST_CONTAINER_FORCEINLINE constant_iterator operator-(Difference off) const
- { return *this + (-off); }
- BOOST_CONTAINER_FORCEINLINE const T& operator*() const
- { return dereference(); }
- BOOST_CONTAINER_FORCEINLINE const T& operator[] (Difference ) const
- { return dereference(); }
- BOOST_CONTAINER_FORCEINLINE const T* operator->() const
- { return &(dereference()); }
- private:
- const T * m_ptr;
- Difference m_num;
- BOOST_CONTAINER_FORCEINLINE void increment()
- { --m_num; }
- BOOST_CONTAINER_FORCEINLINE void decrement()
- { ++m_num; }
- BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const
- { return m_num == other.m_num; }
- BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const
- { return other.m_num < m_num; }
- BOOST_CONTAINER_FORCEINLINE const T & dereference() const
- { return *m_ptr; }
- BOOST_CONTAINER_FORCEINLINE void advance(Difference n)
- { m_num -= n; }
- BOOST_CONTAINER_FORCEINLINE Difference distance_to(const this_type &other)const
- { return m_num - other.m_num; }
- };
- template <class T, class Difference>
- class value_init_construct_iterator
- : public ::boost::container::iterator
- <std::random_access_iterator_tag, T, Difference, const T*, const T &>
- {
- typedef value_init_construct_iterator<T, Difference> this_type;
- public:
- BOOST_CONTAINER_FORCEINLINE explicit value_init_construct_iterator(Difference range_size)
- : m_num(range_size){}
- //Constructors
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator()
- : m_num(0){}
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator++()
- { increment(); return *this; }
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator++(int)
- {
- value_init_construct_iterator result (*this);
- increment();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator--()
- { decrement(); return *this; }
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator--(int)
- {
- value_init_construct_iterator result (*this);
- decrement();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE friend bool operator== (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return i.equal(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return !(i == i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator< (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return i.less(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator> (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return i2 < i; }
- BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return !(i > i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return !(i < i2); }
- BOOST_CONTAINER_FORCEINLINE friend Difference operator- (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
- { return i2.distance_to(i); }
- //Arithmetic
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator+=(Difference off)
- { this->advance(off); return *this; }
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator+(Difference off) const
- {
- value_init_construct_iterator other(*this);
- other.advance(off);
- return other;
- }
- BOOST_CONTAINER_FORCEINLINE friend value_init_construct_iterator operator+(Difference off, const value_init_construct_iterator& right)
- { return right + off; }
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator& operator-=(Difference off)
- { this->advance(-off); return *this; }
- BOOST_CONTAINER_FORCEINLINE value_init_construct_iterator operator-(Difference off) const
- { return *this + (-off); }
- //This pseudo-iterator's dereference operations have no sense since value is not
- //constructed until ::boost::container::construct_in_place is called.
- //So comment them to catch bad uses
- //const T& operator*() const;
- //const T& operator[](difference_type) const;
- //const T* operator->() const;
- private:
- Difference m_num;
- BOOST_CONTAINER_FORCEINLINE void increment()
- { --m_num; }
- BOOST_CONTAINER_FORCEINLINE void decrement()
- { ++m_num; }
- BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const
- { return m_num == other.m_num; }
- BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const
- { return other.m_num < m_num; }
- BOOST_CONTAINER_FORCEINLINE const T & dereference() const
- {
- static T dummy;
- return dummy;
- }
- BOOST_CONTAINER_FORCEINLINE void advance(Difference n)
- { m_num -= n; }
- BOOST_CONTAINER_FORCEINLINE Difference distance_to(const this_type &other)const
- { return m_num - other.m_num; }
- };
- template <class T, class Difference>
- class default_init_construct_iterator
- : public ::boost::container::iterator
- <std::random_access_iterator_tag, T, Difference, const T*, const T &>
- {
- typedef default_init_construct_iterator<T, Difference> this_type;
- public:
- BOOST_CONTAINER_FORCEINLINE explicit default_init_construct_iterator(Difference range_size)
- : m_num(range_size){}
- //Constructors
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator()
- : m_num(0){}
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator++()
- { increment(); return *this; }
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator++(int)
- {
- default_init_construct_iterator result (*this);
- increment();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator--()
- { decrement(); return *this; }
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator--(int)
- {
- default_init_construct_iterator result (*this);
- decrement();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE friend bool operator== (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return i.equal(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return !(i == i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator< (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return i.less(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator> (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return i2 < i; }
- BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return !(i > i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return !(i < i2); }
- BOOST_CONTAINER_FORCEINLINE friend Difference operator- (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
- { return i2.distance_to(i); }
- //Arithmetic
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator+=(Difference off)
- { this->advance(off); return *this; }
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator+(Difference off) const
- {
- default_init_construct_iterator other(*this);
- other.advance(off);
- return other;
- }
- BOOST_CONTAINER_FORCEINLINE friend default_init_construct_iterator operator+(Difference off, const default_init_construct_iterator& right)
- { return right + off; }
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator& operator-=(Difference off)
- { this->advance(-off); return *this; }
- BOOST_CONTAINER_FORCEINLINE default_init_construct_iterator operator-(Difference off) const
- { return *this + (-off); }
- //This pseudo-iterator's dereference operations have no sense since value is not
- //constructed until ::boost::container::construct_in_place is called.
- //So comment them to catch bad uses
- //const T& operator*() const;
- //const T& operator[](difference_type) const;
- //const T* operator->() const;
- private:
- Difference m_num;
- BOOST_CONTAINER_FORCEINLINE void increment()
- { --m_num; }
- BOOST_CONTAINER_FORCEINLINE void decrement()
- { ++m_num; }
- BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const
- { return m_num == other.m_num; }
- BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const
- { return other.m_num < m_num; }
- BOOST_CONTAINER_FORCEINLINE const T & dereference() const
- {
- static T dummy;
- return dummy;
- }
- BOOST_CONTAINER_FORCEINLINE void advance(Difference n)
- { m_num -= n; }
- BOOST_CONTAINER_FORCEINLINE Difference distance_to(const this_type &other) const
- { return m_num - other.m_num; }
- };
- template <class T, class Difference = std::ptrdiff_t>
- class repeat_iterator
- : public ::boost::container::iterator
- <std::random_access_iterator_tag, T, Difference, T*, T&>
- {
- typedef repeat_iterator<T, Difference> this_type;
- public:
- BOOST_CONTAINER_FORCEINLINE explicit repeat_iterator(T &ref, Difference range_size)
- : m_ptr(&ref), m_num(range_size){}
- //Constructors
- BOOST_CONTAINER_FORCEINLINE repeat_iterator()
- : m_ptr(0), m_num(0){}
- BOOST_CONTAINER_FORCEINLINE this_type& operator++()
- { increment(); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator++(int)
- {
- this_type result (*this);
- increment();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE this_type& operator--()
- { increment(); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator--(int)
- {
- this_type result (*this);
- increment();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE friend bool operator== (const this_type& i, const this_type& i2)
- { return i.equal(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const this_type& i, const this_type& i2)
- { return !(i == i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator< (const this_type& i, const this_type& i2)
- { return i.less(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator> (const this_type& i, const this_type& i2)
- { return i2 < i; }
- BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const this_type& i, const this_type& i2)
- { return !(i > i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const this_type& i, const this_type& i2)
- { return !(i < i2); }
- BOOST_CONTAINER_FORCEINLINE friend Difference operator- (const this_type& i, const this_type& i2)
- { return i2.distance_to(i); }
- //Arithmetic
- BOOST_CONTAINER_FORCEINLINE this_type& operator+=(Difference off)
- { this->advance(off); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator+(Difference off) const
- {
- this_type other(*this);
- other.advance(off);
- return other;
- }
- BOOST_CONTAINER_FORCEINLINE friend this_type operator+(Difference off, const this_type& right)
- { return right + off; }
- BOOST_CONTAINER_FORCEINLINE this_type& operator-=(Difference off)
- { this->advance(-off); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator-(Difference off) const
- { return *this + (-off); }
- BOOST_CONTAINER_FORCEINLINE T& operator*() const
- { return dereference(); }
- BOOST_CONTAINER_FORCEINLINE T& operator[] (Difference ) const
- { return dereference(); }
- BOOST_CONTAINER_FORCEINLINE T *operator->() const
- { return &(dereference()); }
- private:
- T * m_ptr;
- Difference m_num;
- BOOST_CONTAINER_FORCEINLINE void increment()
- { --m_num; }
- BOOST_CONTAINER_FORCEINLINE void decrement()
- { ++m_num; }
- BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const
- { return m_num == other.m_num; }
- BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const
- { return other.m_num < m_num; }
- BOOST_CONTAINER_FORCEINLINE T & dereference() const
- { return *m_ptr; }
- BOOST_CONTAINER_FORCEINLINE void advance(Difference n)
- { m_num -= n; }
- BOOST_CONTAINER_FORCEINLINE Difference distance_to(const this_type &other)const
- { return m_num - other.m_num; }
- };
- template <class T, class EmplaceFunctor, class Difference /*= std::ptrdiff_t*/>
- class emplace_iterator
- : public ::boost::container::iterator
- <std::random_access_iterator_tag, T, Difference, const T*, const T &>
- {
- typedef emplace_iterator this_type;
- public:
- typedef Difference difference_type;
- BOOST_CONTAINER_FORCEINLINE explicit emplace_iterator(EmplaceFunctor&e)
- : m_num(1), m_pe(&e){}
- BOOST_CONTAINER_FORCEINLINE emplace_iterator()
- : m_num(0), m_pe(0){}
- BOOST_CONTAINER_FORCEINLINE this_type& operator++()
- { increment(); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator++(int)
- {
- this_type result (*this);
- increment();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE this_type& operator--()
- { decrement(); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator--(int)
- {
- this_type result (*this);
- decrement();
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE friend bool operator== (const this_type& i, const this_type& i2)
- { return i.equal(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const this_type& i, const this_type& i2)
- { return !(i == i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator< (const this_type& i, const this_type& i2)
- { return i.less(i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator> (const this_type& i, const this_type& i2)
- { return i2 < i; }
- BOOST_CONTAINER_FORCEINLINE friend bool operator<= (const this_type& i, const this_type& i2)
- { return !(i > i2); }
- BOOST_CONTAINER_FORCEINLINE friend bool operator>= (const this_type& i, const this_type& i2)
- { return !(i < i2); }
- BOOST_CONTAINER_FORCEINLINE friend difference_type operator- (const this_type& i, const this_type& i2)
- { return i2.distance_to(i); }
- //Arithmetic
- BOOST_CONTAINER_FORCEINLINE this_type& operator+=(difference_type off)
- { this->advance(off); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator+(difference_type off) const
- {
- this_type other(*this);
- other.advance(off);
- return other;
- }
- BOOST_CONTAINER_FORCEINLINE friend this_type operator+(difference_type off, const this_type& right)
- { return right + off; }
- BOOST_CONTAINER_FORCEINLINE this_type& operator-=(difference_type off)
- { this->advance(-off); return *this; }
- BOOST_CONTAINER_FORCEINLINE this_type operator-(difference_type off) const
- { return *this + (-off); }
- private:
- //This pseudo-iterator's dereference operations have no sense since value is not
- //constructed until ::boost::container::construct_in_place is called.
- //So comment them to catch bad uses
- const T& operator*() const;
- const T& operator[](difference_type) const;
- const T* operator->() const;
- public:
- template<class Allocator>
- BOOST_CONTAINER_FORCEINLINE void construct_in_place(Allocator &a, T* ptr)
- { (*m_pe)(a, ptr); }
- template<class DestIt>
- BOOST_CONTAINER_FORCEINLINE void assign_in_place(DestIt dest)
- { (*m_pe)(dest); }
- private:
- difference_type m_num;
- EmplaceFunctor * m_pe;
- BOOST_CONTAINER_FORCEINLINE void increment()
- { --m_num; }
- BOOST_CONTAINER_FORCEINLINE void decrement()
- { ++m_num; }
- BOOST_CONTAINER_FORCEINLINE bool equal(const this_type &other) const
- { return m_num == other.m_num; }
- BOOST_CONTAINER_FORCEINLINE bool less(const this_type &other) const
- { return other.m_num < m_num; }
- BOOST_CONTAINER_FORCEINLINE const T & dereference() const
- {
- static T dummy;
- return dummy;
- }
- BOOST_CONTAINER_FORCEINLINE void advance(difference_type n)
- { m_num -= n; }
- BOOST_CONTAINER_FORCEINLINE difference_type distance_to(const this_type &other)const
- { return difference_type(m_num - other.m_num); }
- };
- #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- template<class ...Args>
- struct emplace_functor
- {
- typedef typename dtl::build_number_seq<sizeof...(Args)>::type index_tuple_t;
- BOOST_CONTAINER_FORCEINLINE emplace_functor(BOOST_FWD_REF(Args)... args)
- : args_(args...)
- {}
- template<class Allocator, class T>
- BOOST_CONTAINER_FORCEINLINE void operator()(Allocator &a, T *ptr)
- { emplace_functor::inplace_impl(a, ptr, index_tuple_t()); }
- template<class DestIt>
- BOOST_CONTAINER_FORCEINLINE void operator()(DestIt dest)
- { emplace_functor::inplace_impl(dest, index_tuple_t()); }
- private:
- template<class Allocator, class T, std::size_t ...IdxPack>
- BOOST_CONTAINER_FORCEINLINE void inplace_impl(Allocator &a, T* ptr, const dtl::index_tuple<IdxPack...>&)
- {
- allocator_traits<Allocator>::construct
- (a, ptr, ::boost::forward<Args>(dtl::get<IdxPack>(args_))...);
- }
- template<class DestIt, std::size_t ...IdxPack>
- BOOST_CONTAINER_FORCEINLINE void inplace_impl(DestIt dest, const dtl::index_tuple<IdxPack...>&)
- {
- typedef typename boost::container::iterator_traits<DestIt>::value_type value_type;
- value_type && tmp= value_type(::boost::forward<Args>(dtl::get<IdxPack>(args_))...);
- *dest = ::boost::move(tmp);
- }
- dtl::tuple<Args&...> args_;
- };
- template<class ...Args>
- struct emplace_functor_type
- {
- typedef emplace_functor<Args...> type;
- };
- #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- //Partial specializations cannot match argument list for primary template, so add an extra argument
- template <BOOST_MOVE_CLASSDFLT9, class Dummy = void>
- struct emplace_functor_type;
- #define BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE(N) \
- BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
- struct emplace_functor##N\
- {\
- BOOST_CONTAINER_FORCEINLINE explicit emplace_functor##N( BOOST_MOVE_UREF##N )\
- BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\
- \
- template<class Allocator, class T>\
- BOOST_CONTAINER_FORCEINLINE void operator()(Allocator &a, T *ptr)\
- { allocator_traits<Allocator>::construct(a, ptr BOOST_MOVE_I##N BOOST_MOVE_MFWD##N); }\
- \
- template<class DestIt>\
- BOOST_CONTAINER_FORCEINLINE void operator()(DestIt dest)\
- {\
- typedef typename boost::container::iterator_traits<DestIt>::value_type value_type;\
- BOOST_MOVE_IF(N, value_type tmp(BOOST_MOVE_MFWD##N), dtl::value_init<value_type> tmp) ;\
- *dest = ::boost::move(const_cast<value_type &>(BOOST_MOVE_IF(N, tmp, tmp.get())));\
- }\
- \
- BOOST_MOVE_MREF##N\
- };\
- \
- template <BOOST_MOVE_CLASS##N>\
- struct emplace_functor_type<BOOST_MOVE_TARG##N>\
- {\
- typedef emplace_functor##N BOOST_MOVE_LT##N BOOST_MOVE_TARG##N BOOST_MOVE_GT##N type;\
- };\
- //
- BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE)
- #undef BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE
- #endif
- namespace dtl {
- template<class T>
- struct has_iterator_category
- {
- struct two { char _[2]; };
- template <typename X>
- static char test(int, typename X::iterator_category*);
- template <typename X>
- static two test(int, ...);
- static const bool value = (1 == sizeof(test<T>(0, 0)));
- };
- template<class T, bool = has_iterator_category<T>::value >
- struct is_input_iterator
- {
- static const bool value = is_same<typename T::iterator_category, std::input_iterator_tag>::value;
- };
- template<class T>
- struct is_input_iterator<T, false>
- {
- static const bool value = false;
- };
- template<class T>
- struct is_not_input_iterator
- {
- static const bool value = !is_input_iterator<T>::value;
- };
- template<class T, bool = has_iterator_category<T>::value >
- struct is_forward_iterator
- {
- static const bool value = is_same<typename T::iterator_category, std::forward_iterator_tag>::value;
- };
- template<class T>
- struct is_forward_iterator<T, false>
- {
- static const bool value = false;
- };
- template<class T, bool = has_iterator_category<T>::value >
- struct is_bidirectional_iterator
- {
- static const bool value = is_same<typename T::iterator_category, std::bidirectional_iterator_tag>::value;
- };
- template<class T>
- struct is_bidirectional_iterator<T, false>
- {
- static const bool value = false;
- };
- template<class IINodeType>
- struct iiterator_node_value_type {
- typedef typename IINodeType::value_type type;
- };
- template<class IIterator>
- struct iiterator_types
- {
- typedef typename IIterator::value_type it_value_type;
- typedef typename iiterator_node_value_type<it_value_type>::type value_type;
- typedef typename boost::container::iterator_traits<IIterator>::pointer it_pointer;
- typedef typename boost::container::iterator_traits<IIterator>::difference_type difference_type;
- typedef typename ::boost::intrusive::pointer_traits<it_pointer>::
- template rebind_pointer<value_type>::type pointer;
- typedef typename ::boost::intrusive::pointer_traits<it_pointer>::
- template rebind_pointer<const value_type>::type const_pointer;
- typedef typename ::boost::intrusive::
- pointer_traits<pointer>::reference reference;
- typedef typename ::boost::intrusive::
- pointer_traits<const_pointer>::reference const_reference;
- typedef typename IIterator::iterator_category iterator_category;
- };
- template<class IIterator, bool IsConst>
- struct iterator_types
- {
- typedef typename ::boost::container::iterator
- < typename iiterator_types<IIterator>::iterator_category
- , typename iiterator_types<IIterator>::value_type
- , typename iiterator_types<IIterator>::difference_type
- , typename iiterator_types<IIterator>::const_pointer
- , typename iiterator_types<IIterator>::const_reference> type;
- };
- template<class IIterator>
- struct iterator_types<IIterator, false>
- {
- typedef typename ::boost::container::iterator
- < typename iiterator_types<IIterator>::iterator_category
- , typename iiterator_types<IIterator>::value_type
- , typename iiterator_types<IIterator>::difference_type
- , typename iiterator_types<IIterator>::pointer
- , typename iiterator_types<IIterator>::reference> type;
- };
- template<class IIterator, bool IsConst>
- class iterator_from_iiterator
- {
- typedef typename iterator_types<IIterator, IsConst>::type types_t;
- class nat
- {
- public:
- IIterator get() const
- { return IIterator(); }
- };
- typedef typename dtl::if_c< IsConst
- , iterator_from_iiterator<IIterator, false>
- , nat>::type nonconst_iterator;
- public:
- typedef typename types_t::pointer pointer;
- typedef typename types_t::reference reference;
- typedef typename types_t::difference_type difference_type;
- typedef typename types_t::iterator_category iterator_category;
- typedef typename types_t::value_type value_type;
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator()
- : m_iit()
- {}
- BOOST_CONTAINER_FORCEINLINE explicit iterator_from_iiterator(IIterator iit) BOOST_NOEXCEPT_OR_NOTHROW
- : m_iit(iit)
- {}
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator(const iterator_from_iiterator& other) BOOST_NOEXCEPT_OR_NOTHROW
- : m_iit(other.get())
- {}
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator(const nonconst_iterator& other) BOOST_NOEXCEPT_OR_NOTHROW
- : m_iit(other.get())
- {}
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator& operator=(const iterator_from_iiterator& other) BOOST_NOEXCEPT_OR_NOTHROW
- { m_iit = other.get(); return *this; }
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW
- { ++this->m_iit; return *this; }
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW
- {
- iterator_from_iiterator result (*this);
- ++this->m_iit;
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW
- {
- //If the iterator_from_iiterator is not a bidirectional iterator, operator-- should not exist
- BOOST_STATIC_ASSERT((is_bidirectional_iterator<iterator_from_iiterator>::value));
- --this->m_iit; return *this;
- }
- BOOST_CONTAINER_FORCEINLINE iterator_from_iiterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW
- {
- iterator_from_iiterator result (*this);
- --this->m_iit;
- return result;
- }
- BOOST_CONTAINER_FORCEINLINE friend bool operator== (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW
- { return l.m_iit == r.m_iit; }
- BOOST_CONTAINER_FORCEINLINE friend bool operator!= (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW
- { return !(l == r); }
- BOOST_CONTAINER_FORCEINLINE reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW
- { return this->m_iit->get_data(); }
- BOOST_CONTAINER_FORCEINLINE pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW
- { return ::boost::intrusive::pointer_traits<pointer>::pointer_to(this->operator*()); }
- BOOST_CONTAINER_FORCEINLINE const IIterator &get() const BOOST_NOEXCEPT_OR_NOTHROW
- { return this->m_iit; }
- private:
- IIterator m_iit;
- };
- } //namespace dtl {
- using ::boost::intrusive::reverse_iterator;
- } //namespace container {
- } //namespace boost {
- #include <boost/container/detail/config_end.hpp>
- #endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|