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
 | 
