876 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			876 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// (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:
							 | 
						||
| 
								 | 
							
								   explicit constant_iterator(const T &ref, Difference range_size)
							 | 
						||
| 
								 | 
							
								      :  m_ptr(&ref), m_num(range_size){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Constructors
							 | 
						||
| 
								 | 
							
								   constant_iterator()
							 | 
						||
| 
								 | 
							
								      :  m_ptr(0), m_num(0){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator& operator++()
							 | 
						||
| 
								 | 
							
								   { increment();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator operator++(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      constant_iterator result (*this);
							 | 
						||
| 
								 | 
							
								      increment();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator& operator--()
							 | 
						||
| 
								 | 
							
								   { decrement();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator operator--(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      constant_iterator result (*this);
							 | 
						||
| 
								 | 
							
								      decrement();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator== (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i.equal(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator!= (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i == i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator< (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i.less(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator> (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i2 < i; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator<= (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i > i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator>= (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i < i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend Difference operator- (const constant_iterator& i, const constant_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i2.distance_to(i); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Arithmetic
							 | 
						||
| 
								 | 
							
								   constant_iterator& operator+=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator operator+(Difference off) const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      constant_iterator other(*this);
							 | 
						||
| 
								 | 
							
								      other.advance(off);
							 | 
						||
| 
								 | 
							
								      return other;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend constant_iterator operator+(Difference off, const constant_iterator& right)
							 | 
						||
| 
								 | 
							
								   {  return right + off; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator& operator-=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(-off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   constant_iterator operator-(Difference off) const
							 | 
						||
| 
								 | 
							
								   {  return *this + (-off);  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const T& operator*() const
							 | 
						||
| 
								 | 
							
								   { return dereference(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const T& operator[] (Difference ) const
							 | 
						||
| 
								 | 
							
								   { return dereference(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const T* operator->() const
							 | 
						||
| 
								 | 
							
								   { return &(dereference()); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   private:
							 | 
						||
| 
								 | 
							
								   const T *   m_ptr;
							 | 
						||
| 
								 | 
							
								   Difference  m_num;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void increment()
							 | 
						||
| 
								 | 
							
								   { --m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void decrement()
							 | 
						||
| 
								 | 
							
								   { ++m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool equal(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return m_num == other.m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool less(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return other.m_num < m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const T & dereference() const
							 | 
						||
| 
								 | 
							
								   { return *m_ptr; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void advance(Difference n)
							 | 
						||
| 
								 | 
							
								   {  m_num -= n; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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:
							 | 
						||
| 
								 | 
							
								   explicit value_init_construct_iterator(Difference range_size)
							 | 
						||
| 
								 | 
							
								      :  m_num(range_size){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Constructors
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator()
							 | 
						||
| 
								 | 
							
								      :  m_num(0){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator& operator++()
							 | 
						||
| 
								 | 
							
								   { increment();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator operator++(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      value_init_construct_iterator result (*this);
							 | 
						||
| 
								 | 
							
								      increment();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator& operator--()
							 | 
						||
| 
								 | 
							
								   { decrement();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator operator--(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      value_init_construct_iterator result (*this);
							 | 
						||
| 
								 | 
							
								      decrement();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator== (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i.equal(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator!= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i == i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator< (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i.less(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator> (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i2 < i; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator<= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i > i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator>= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i < i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend Difference operator- (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i2.distance_to(i); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Arithmetic
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator& operator+=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator operator+(Difference off) const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      value_init_construct_iterator other(*this);
							 | 
						||
| 
								 | 
							
								      other.advance(off);
							 | 
						||
| 
								 | 
							
								      return other;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend value_init_construct_iterator operator+(Difference off, const value_init_construct_iterator& right)
							 | 
						||
| 
								 | 
							
								   {  return right + off; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   value_init_construct_iterator& operator-=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(-off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void increment()
							 | 
						||
| 
								 | 
							
								   { --m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void decrement()
							 | 
						||
| 
								 | 
							
								   { ++m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool equal(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return m_num == other.m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool less(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return other.m_num < m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const T & dereference() const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      static T dummy;
							 | 
						||
| 
								 | 
							
								      return dummy;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void advance(Difference n)
							 | 
						||
| 
								 | 
							
								   {  m_num -= n; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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:
							 | 
						||
| 
								 | 
							
								   explicit default_init_construct_iterator(Difference range_size)
							 | 
						||
| 
								 | 
							
								      :  m_num(range_size){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Constructors
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator()
							 | 
						||
| 
								 | 
							
								      :  m_num(0){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator& operator++()
							 | 
						||
| 
								 | 
							
								   { increment();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator operator++(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      default_init_construct_iterator result (*this);
							 | 
						||
| 
								 | 
							
								      increment();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator& operator--()
							 | 
						||
| 
								 | 
							
								   { decrement();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator operator--(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      default_init_construct_iterator result (*this);
							 | 
						||
| 
								 | 
							
								      decrement();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator== (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i.equal(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator!= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i == i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator< (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i.less(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator> (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i2 < i; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator<= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i > i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator>= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i < i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend Difference operator- (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
							 | 
						||
| 
								 | 
							
								   { return i2.distance_to(i); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Arithmetic
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator& operator+=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator operator+(Difference off) const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      default_init_construct_iterator other(*this);
							 | 
						||
| 
								 | 
							
								      other.advance(off);
							 | 
						||
| 
								 | 
							
								      return other;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend default_init_construct_iterator operator+(Difference off, const default_init_construct_iterator& right)
							 | 
						||
| 
								 | 
							
								   {  return right + off; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   default_init_construct_iterator& operator-=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(-off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void increment()
							 | 
						||
| 
								 | 
							
								   { --m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void decrement()
							 | 
						||
| 
								 | 
							
								   { ++m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool equal(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return m_num == other.m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool less(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return other.m_num < m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   const T & dereference() const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      static T dummy;
							 | 
						||
| 
								 | 
							
								      return dummy;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void advance(Difference n)
							 | 
						||
| 
								 | 
							
								   {  m_num -= n; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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:
							 | 
						||
| 
								 | 
							
								   explicit repeat_iterator(T &ref, Difference range_size)
							 | 
						||
| 
								 | 
							
								      :  m_ptr(&ref), m_num(range_size){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Constructors
							 | 
						||
| 
								 | 
							
								   repeat_iterator()
							 | 
						||
| 
								 | 
							
								      :  m_ptr(0), m_num(0){}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type& operator++()
							 | 
						||
| 
								 | 
							
								   { increment();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type operator++(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      this_type result (*this);
							 | 
						||
| 
								 | 
							
								      increment();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type& operator--()
							 | 
						||
| 
								 | 
							
								   { increment();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type operator--(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      this_type result (*this);
							 | 
						||
| 
								 | 
							
								      increment();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator== (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return i.equal(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator!= (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i == i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator< (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return i.less(i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator> (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return i2 < i; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator<= (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i > i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend bool operator>= (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return !(i < i2); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend Difference operator- (const this_type& i, const this_type& i2)
							 | 
						||
| 
								 | 
							
								   { return i2.distance_to(i); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   //Arithmetic
							 | 
						||
| 
								 | 
							
								   this_type& operator+=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type operator+(Difference off) const
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      this_type other(*this);
							 | 
						||
| 
								 | 
							
								      other.advance(off);
							 | 
						||
| 
								 | 
							
								      return other;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   friend this_type operator+(Difference off, const this_type& right)
							 | 
						||
| 
								 | 
							
								   {  return right + off; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type& operator-=(Difference off)
							 | 
						||
| 
								 | 
							
								   {  this->advance(-off); return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type operator-(Difference off) const
							 | 
						||
| 
								 | 
							
								   {  return *this + (-off);  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   T& operator*() const
							 | 
						||
| 
								 | 
							
								   { return dereference(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   T& operator[] (Difference ) const
							 | 
						||
| 
								 | 
							
								   { return dereference(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   T *operator->() const
							 | 
						||
| 
								 | 
							
								   { return &(dereference()); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   private:
							 | 
						||
| 
								 | 
							
								   T *         m_ptr;
							 | 
						||
| 
								 | 
							
								   Difference  m_num;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void increment()
							 | 
						||
| 
								 | 
							
								   { --m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void decrement()
							 | 
						||
| 
								 | 
							
								   { ++m_num; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool equal(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return m_num == other.m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   bool less(const this_type &other) const
							 | 
						||
| 
								 | 
							
								   {  return other.m_num < m_num;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   T & dereference() const
							 | 
						||
| 
								 | 
							
								   { return *m_ptr; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   void advance(Difference n)
							 | 
						||
| 
								 | 
							
								   {  m_num -= n; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   this_type operator++(int)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      this_type result (*this);
							 | 
						||
| 
								 | 
							
								      increment();
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   BOOST_CONTAINER_FORCEINLINE this_type& operator--()
							 | 
						||
| 
								 | 
							
								   { decrement();   return *this;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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;   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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>
							 | 
						||
| 
								 | 
							
								   void construct_in_place(Allocator &a, T* ptr)
							 | 
						||
| 
								 | 
							
								   {  (*m_pe)(a, ptr);  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   template<class DestIt>
							 | 
						||
| 
								 | 
							
								   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 container_detail::build_number_seq<sizeof...(Args)>::type index_tuple_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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 container_detail::index_tuple<IdxPack...>&)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      allocator_traits<Allocator>::construct
							 | 
						||
| 
								 | 
							
								         (a, ptr, ::boost::forward<Args>(container_detail::get<IdxPack>(args_))...);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   template<class DestIt, std::size_t ...IdxPack>
							 | 
						||
| 
								 | 
							
								   BOOST_CONTAINER_FORCEINLINE void inplace_impl(DestIt dest, const container_detail::index_tuple<IdxPack...>&)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      typedef typename boost::container::iterator_traits<DestIt>::value_type value_type;
							 | 
						||
| 
								 | 
							
								      value_type && tmp= value_type(::boost::forward<Args>(container_detail::get<IdxPack>(args_))...);
							 | 
						||
| 
								 | 
							
								      *dest = ::boost::move(tmp);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   container_detail::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\
							 | 
						||
| 
								 | 
							
								{\
							 | 
						||
| 
								 | 
							
								   explicit emplace_functor##N( BOOST_MOVE_UREF##N )\
							 | 
						||
| 
								 | 
							
								      BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\
							 | 
						||
| 
								 | 
							
								   \
							 | 
						||
| 
								 | 
							
								   template<class Allocator, class T>\
							 | 
						||
| 
								 | 
							
								   void operator()(Allocator &a, T *ptr)\
							 | 
						||
| 
								 | 
							
								   {  allocator_traits<Allocator>::construct(a, ptr BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);  }\
							 | 
						||
| 
								 | 
							
								   \
							 | 
						||
| 
								 | 
							
								   template<class DestIt>\
							 | 
						||
| 
								 | 
							
								   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), container_detail::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 container_detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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(iterator_from_iiterator<IIterator, false> const& other) BOOST_NOEXCEPT_OR_NOTHROW
							 | 
						||
| 
								 | 
							
								      :  m_iit(other.get())
							 | 
						||
| 
								 | 
							
								   {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   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 container_detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using ::boost::intrusive::reverse_iterator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}  //namespace container {
							 | 
						||
| 
								 | 
							
								}  //namespace boost {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/container/detail/config_end.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif   //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
							 |