| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891 | ////////////////////////////////////////////////////////////////////////////////// (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 argumenttemplate <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#endifnamespace 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
 |