diff DEPENDENCIES/generic/include/boost/container/static_vector.hpp @ 101:c530137014c0

Update Boost headers (1.58.0)
author Chris Cannam
date Mon, 07 Sep 2015 11:12:49 +0100
parents 2665513ce2d3
children
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/container/static_vector.hpp	Fri Sep 04 12:01:02 2015 +0100
+++ b/DEPENDENCIES/generic/include/boost/container/static_vector.hpp	Mon Sep 07 11:12:49 2015 +0100
@@ -2,6 +2,7 @@
 //
 // Copyright (c) 2012-2013 Adam Wulkiewicz, Lodz, Poland.
 // Copyright (c) 2011-2013 Andrew Hundt.
+// Copyright (c) 2013-2014 Ion Gaztanaga
 //
 // Use, modification and distribution is subject to the Boost Software License,
 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,17 +11,28 @@
 #ifndef BOOST_CONTAINER_STATIC_VECTOR_HPP
 #define BOOST_CONTAINER_STATIC_VECTOR_HPP
 
-#if defined(_MSC_VER)
+#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/detail/type_traits.hpp>
+#include <boost/container/vector.hpp>
 
-#include <boost/container/vector.hpp>
-#include <boost/aligned_storage.hpp>
+#include <cstddef>
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+#include <initializer_list>
+#endif
 
 namespace boost { namespace container {
 
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
 namespace container_detail {
 
 template<class T, std::size_t N>
@@ -29,78 +41,77 @@
    public:
    typedef T value_type;
 
-   static_storage_allocator() BOOST_CONTAINER_NOEXCEPT
+   static_storage_allocator() BOOST_NOEXCEPT_OR_NOTHROW
    {}
 
-   static_storage_allocator(const static_storage_allocator &) BOOST_CONTAINER_NOEXCEPT
+   static_storage_allocator(const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
    {}
 
-   static_storage_allocator & operator=(const static_storage_allocator &) BOOST_CONTAINER_NOEXCEPT
+   static_storage_allocator & operator=(const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
    {}
 
-   T* internal_storage() const BOOST_CONTAINER_NOEXCEPT
+   T* internal_storage() const BOOST_NOEXCEPT_OR_NOTHROW
    {  return const_cast<T*>(static_cast<const T*>(static_cast<const void*>(&storage)));  }
 
-   T* internal_storage() BOOST_CONTAINER_NOEXCEPT
+   T* internal_storage() BOOST_NOEXCEPT_OR_NOTHROW
    {  return static_cast<T*>(static_cast<void*>(&storage));  }
 
    static const std::size_t internal_capacity = N;
 
    typedef boost::container::container_detail::version_type<static_storage_allocator, 0>   version;
 
-   friend bool operator==(const static_storage_allocator &, const static_storage_allocator &) BOOST_CONTAINER_NOEXCEPT
+   friend bool operator==(const static_storage_allocator &, const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
    {  return false;  }
 
-   friend bool operator!=(const static_storage_allocator &, const static_storage_allocator &) BOOST_CONTAINER_NOEXCEPT
+   friend bool operator!=(const static_storage_allocator &, const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
    {  return true;  }
 
    private:
-   typename boost::aligned_storage
-      <sizeof(T)*N, boost::alignment_of<T>::value>::type storage;
+   typename aligned_storage<sizeof(T)*N, alignment_of<T>::value>::type storage;
 };
 
 }  //namespace container_detail {
 
-/**
- * @defgroup static_vector_non_member static_vector non-member functions
- */
+#endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
 
-/**
- * @brief A variable-size array container with fixed capacity.
- *
- * static_vector is a sequence container like boost::container::vector with contiguous storage that can
- * change in size, along with the static allocation, low overhead, and fixed capacity of boost::array.
- *
- * A static_vector is a sequence that supports random access to elements, constant time insertion and
- * removal of elements at the end, and linear time insertion and removal of elements at the beginning or 
- * in the middle. The number of elements in a static_vector may vary dynamically up to a fixed capacity
- * because elements are stored within the object itself similarly to an array. However, objects are 
- * initialized as they are inserted into static_vector unlike C arrays or std::array which must construct
- * all elements on instantiation. The behavior of static_vector enables the use of statically allocated
- * elements in cases with complex object lifetime requirements that would otherwise not be trivially 
- * possible.
- *
- * @par Error Handling
- *  Insertion beyond the capacity result in throwing std::bad_alloc() if exceptions are enabled or
- *  calling throw_bad_alloc() if not enabled.
- *
- *  std::out_of_range is thrown if out of bound access is performed in `at()` if exceptions are
- *  enabled, throw_out_of_range() if not enabled.
- *
- * @tparam Value    The type of element that will be stored.
- * @tparam Capacity The maximum number of elements static_vector can store, fixed at compile time.
- */
+//!
+//!@brief A variable-size array container with fixed capacity.
+//!
+//!static_vector is a sequence container like boost::container::vector with contiguous storage that can
+//!change in size, along with the static allocation, low overhead, and fixed capacity of boost::array.
+//!
+//!A static_vector is a sequence that supports random access to elements, constant time insertion and
+//!removal of elements at the end, and linear time insertion and removal of elements at the beginning or
+//!in the middle. The number of elements in a static_vector may vary dynamically up to a fixed capacity
+//!because elements are stored within the object itself similarly to an array. However, objects are
+//!initialized as they are inserted into static_vector unlike C arrays or std::array which must construct
+//!all elements on instantiation. The behavior of static_vector enables the use of statically allocated
+//!elements in cases with complex object lifetime requirements that would otherwise not be trivially
+//!possible.
+//!
+//!@par Error Handling
+//! Insertion beyond the capacity result in throwing std::bad_alloc() if exceptions are enabled or
+//! calling throw_bad_alloc() if not enabled.
+//!
+//! std::out_of_range is thrown if out of bound access is performed in <code>at()</code> if exceptions are
+//! enabled, throw_out_of_range() if not enabled.
+//!
+//!@tparam Value    The type of element that will be stored.
+//!@tparam Capacity The maximum number of elements static_vector can store, fixed at compile time.
 template <typename Value, std::size_t Capacity>
 class static_vector
     : public vector<Value, container_detail::static_storage_allocator<Value, Capacity> >
 {
-    typedef vector<Value, container_detail::static_storage_allocator<Value, Capacity> > base_t;
+   #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+   typedef vector<Value, container_detail::static_storage_allocator<Value, Capacity> > base_t;
 
-    BOOST_COPYABLE_AND_MOVABLE(static_vector)
+   BOOST_COPYABLE_AND_MOVABLE(static_vector)
 
    template<class U, std::size_t OtherCapacity>
    friend class static_vector;
 
+   #endif   //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
 public:
     //! @brief The type of elements stored in the container.
     typedef typename base_t::value_type value_type;
@@ -132,7 +143,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    static_vector() BOOST_CONTAINER_NOEXCEPT
+    static_vector() BOOST_NOEXCEPT_OR_NOTHROW
         : base_t()
     {}
 
@@ -143,7 +154,7 @@
     //! @param count    The number of values which will be contained in the container.
     //!
     //! @par Throws
-    //!   If Value's default constructor throws.
+    //!   If Value's value initialization throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
@@ -153,12 +164,12 @@
 
     //! @pre <tt>count <= capacity()</tt>
     //!
-    //! @brief Constructs a static_vector containing count value initialized values.
+    //! @brief Constructs a static_vector containing count default initialized values.
     //!
     //! @param count    The number of values which will be contained in the container.
     //!
     //! @par Throws
-    //!   If Value's default constructor throws.
+    //!   If Value's default initialization throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
@@ -204,6 +215,24 @@
         : base_t(first, last)
     {}
 
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+    //! @pre
+    //!  @li <tt>distance(il.begin(), il.end()) <= capacity()</tt>
+    //!
+    //! @brief Constructs a static_vector containing copy of a range <tt>[il.begin(), il.end())</tt>.
+    //!
+    //! @param il       std::initializer_list with values to initialize vector.
+    //!
+    //! @par Throws
+    //!   If Value's constructor taking a dereferenced std::initializer_list throws.
+    //!
+    //! @par Complexity
+    //!   Linear O(N).
+    static_vector(std::initializer_list<value_type> il)
+        : base_t(il)
+    {}
+#endif
+
     //! @brief Constructs a copy of other static_vector.
     //!
     //! @param other    The static_vector which content will be copied to this one.
@@ -229,7 +258,40 @@
     //! @par Complexity
     //!   Linear O(N).
     template <std::size_t C>
-    static_vector(static_vector<value_type, C> const& other) : base_t(other) {}
+    static_vector(static_vector<value_type, C> const& other)
+        : base_t(other)
+    {}
+
+    //! @brief Move constructor. Moves Values stored in the other static_vector to this one.
+    //!
+    //! @param other    The static_vector which content will be moved to this one.
+    //!
+    //! @par Throws
+    //!   @li If \c has_nothrow_move<Value>::value is \c true and Value's move constructor throws.
+    //!   @li If \c has_nothrow_move<Value>::value is \c false and Value's copy constructor throws.
+    //!
+    //! @par Complexity
+    //!   Linear O(N).
+    static_vector(BOOST_RV_REF(static_vector) other)
+        : base_t(BOOST_MOVE_BASE(base_t, other))
+    {}
+
+    //! @pre <tt>other.size() <= capacity()</tt>
+    //!
+    //! @brief Move constructor. Moves Values stored in the other static_vector to this one.
+    //!
+    //! @param other    The static_vector which content will be moved to this one.
+    //!
+    //! @par Throws
+    //!   @li If \c has_nothrow_move<Value>::value is \c true and Value's move constructor throws.
+    //!   @li If \c has_nothrow_move<Value>::value is \c false and Value's copy constructor throws.
+    //!
+    //! @par Complexity
+    //!   Linear O(N).
+    template <std::size_t C>
+    static_vector(BOOST_RV_REF_BEG static_vector<value_type, C> BOOST_RV_REF_END other)
+        : base_t(BOOST_MOVE_BASE(typename static_vector<value_type BOOST_MOVE_I C>::base_t, other))
+    {}
 
     //! @brief Copy assigns Values stored in the other static_vector to this one.
     //!
@@ -242,10 +304,23 @@
     //! Linear O(N).
     static_vector & operator=(BOOST_COPY_ASSIGN_REF(static_vector) other)
     {
-        base_t::operator=(static_cast<base_t const&>(other));
-        return *this;
+        return static_cast<static_vector&>(base_t::operator=(static_cast<base_t const&>(other)));
     }
 
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+    //! @brief Copy assigns Values stored in std::initializer_list to *this.
+    //!
+    //! @param il    The std::initializer_list which content will be copied to this one.
+    //!
+    //! @par Throws
+    //!   If Value's copy constructor or copy assignment throws.
+    //!
+    //! @par Complexity
+    //! Linear O(N).
+    static_vector & operator=(std::initializer_list<value_type> il)
+    { return static_cast<static_vector&>(base_t::operator=(il));  }
+#endif
+
     //! @pre <tt>other.size() <= capacity()</tt>
     //!
     //! @brief Copy assigns Values stored in the other static_vector to this one.
@@ -258,62 +333,25 @@
     //! @par Complexity
     //!   Linear O(N).
     template <std::size_t C>
-// TEMPORARY WORKAROUND
-#if defined(BOOST_NO_RVALUE_REFERENCES)
-    static_vector & operator=(::boost::rv< static_vector<value_type, C> > const& other)
-#else
     static_vector & operator=(static_vector<value_type, C> const& other)
-#endif
     {
-        base_t::operator=(static_cast<static_vector<value_type, C> const&>(other));
-        return *this;
+        return static_cast<static_vector&>(base_t::operator=
+            (static_cast<typename static_vector<value_type, C>::base_t const&>(other)));
     }
 
-    //! @brief Move constructor. Moves Values stored in the other static_vector to this one.
-    //!
-    //! @param other    The static_vector which content will be moved to this one.
-    //!
-    //! @par Throws
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c true and Value's move constructor throws.
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c false and Value's copy constructor throws.
-    //!
-    //! @par Complexity
-    //!   Linear O(N).
-    static_vector(BOOST_RV_REF(static_vector) other)
-        : base_t(boost::move(static_cast<base_t&>(other)))
-    {}
-
-    //! @pre <tt>other.size() <= capacity()</tt>
-    //!
-    //! @brief Move constructor. Moves Values stored in the other static_vector to this one.
-    //!
-    //! @param other    The static_vector which content will be moved to this one.
-    //!
-    //! @par Throws
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c true and Value's move constructor throws.
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c false and Value's copy constructor throws.
-    //!
-    //! @par Complexity
-    //!   Linear O(N).
-    template <std::size_t C>
-    static_vector(BOOST_RV_REF_BEG static_vector<value_type, C> BOOST_RV_REF_END other)
-        : base_t(boost::move(static_cast<typename static_vector<value_type, C>::base_t&>(other)))
-    {}
-
     //! @brief Move assignment. Moves Values stored in the other static_vector to this one.
     //!
     //! @param other    The static_vector which content will be moved to this one.
     //!
     //! @par Throws
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws.
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws.
+    //!   @li If \c has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws.
+    //!   @li If \c has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
     static_vector & operator=(BOOST_RV_REF(static_vector) other)
     {
-        base_t::operator=(boost::move(static_cast<base_t&>(other)));
-        return *this;
+        return static_cast<static_vector&>(base_t::operator=(BOOST_MOVE_BASE(base_t, other)));
     }
 
     //! @pre <tt>other.size() <= capacity()</tt>
@@ -323,16 +361,16 @@
     //! @param other    The static_vector which content will be moved to this one.
     //!
     //! @par Throws
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws.
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws.
+    //!   @li If \c has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws.
+    //!   @li If \c has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
     template <std::size_t C>
     static_vector & operator=(BOOST_RV_REF_BEG static_vector<value_type, C> BOOST_RV_REF_END other)
     {
-        base_t::operator=(boost::move(static_cast<typename static_vector<value_type, C>::base_t&>(other)));
-        return *this;
+        return static_cast<static_vector&>(base_t::operator=
+         (BOOST_MOVE_BASE(typename static_vector<value_type BOOST_MOVE_I C>::base_t, other)));
     }
 
 #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
@@ -351,8 +389,8 @@
     //! @param other    The static_vector which content will be swapped with this one's content.
     //!
     //! @par Throws
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws,
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws,
+    //!   @li If \c has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws,
+    //!   @li If \c has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws,
     //!
     //! @par Complexity
     //!   Linear O(N).
@@ -365,8 +403,8 @@
     //! @param other    The static_vector which content will be swapped with this one's content.
     //!
     //! @par Throws
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws,
-    //!   @li If \c boost::has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws,
+    //!   @li If \c has_nothrow_move<Value>::value is \c true and Value's move constructor or move assignment throws,
+    //!   @li If \c has_nothrow_move<Value>::value is \c false and Value's copy constructor or copy assignment throws,
     //!
     //! @par Complexity
     //!   Linear O(N).
@@ -381,7 +419,7 @@
     //! @param count    The number of elements which will be stored in the container.
     //!
     //! @par Throws
-    //!   If Value's default constructor throws.
+    //!   If Value's value initialization throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
@@ -395,7 +433,7 @@
     //! @param count    The number of elements which will be stored in the container.
     //!
     //! @par Throws
-    //!   If Value's default constructor throws.
+    //!   If Value's default initialization throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
@@ -430,7 +468,7 @@
     //!
     //! @par Complexity
     //!   Linear O(N).
-    void reserve(size_type count)  BOOST_CONTAINER_NOEXCEPT;
+    void reserve(size_type count)  BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @pre <tt>size() < capacity()</tt>
     //!
@@ -470,13 +508,13 @@
     void pop_back();
 
     //! @pre
-    //!  @li \c position must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
+    //!  @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
     //!  @li <tt>size() < capacity()</tt>
     //!
-    //! @brief Inserts a copy of element at position.
+    //! @brief Inserts a copy of element at p.
     //!
-    //! @param position    The position at which the new value will be inserted.
-    //! @param value       The value used to copy construct the new element.
+    //! @param p     The position at which the new value will be inserted.
+    //! @param value The value used to copy construct the new element.
     //!
     //! @par Throws
     //!   @li If Value's copy constructor or copy assignment throws
@@ -484,33 +522,33 @@
     //!
     //! @par Complexity
     //!   Constant or linear.
-    iterator insert(iterator position, value_type const& value);
+    iterator insert(const_iterator p, value_type const& value);
 
     //! @pre
-    //!  @li \c position must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
+    //!  @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
     //!  @li <tt>size() < capacity()</tt>
     //!
-    //! @brief Inserts a move-constructed element at position.
+    //! @brief Inserts a move-constructed element at p.
     //!
-    //! @param position    The position at which the new value will be inserted.
-    //! @param value       The value used to move construct the new element.
+    //! @param p     The position at which the new value will be inserted.
+    //! @param value The value used to move construct the new element.
     //!
     //! @par Throws
     //!   If Value's move constructor or move assignment throws.
     //!
     //! @par Complexity
     //!   Constant or linear.
-    iterator insert(iterator position, BOOST_RV_REF(value_type) value);
+    iterator insert(const_iterator p, BOOST_RV_REF(value_type) value);
 
     //! @pre
-    //!  @li \c position must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
+    //!  @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
     //!  @li <tt>size() + count <= capacity()</tt>
     //!
-    //! @brief Inserts a count copies of value at position.
+    //! @brief Inserts a count copies of value at p.
     //!
-    //! @param position    The position at which new elements will be inserted.
-    //! @param count       The number of new elements which will be inserted.
-    //! @param value       The value used to copy construct new elements.
+    //! @param p     The position at which new elements will be inserted.
+    //! @param count The number of new elements which will be inserted.
+    //! @param value The value used to copy construct new elements.
     //!
     //! @par Throws
     //!   @li If Value's copy constructor or copy assignment throws.
@@ -518,18 +556,18 @@
     //!
     //! @par Complexity
     //!   Linear O(N).
-    iterator insert(iterator position, size_type count, value_type const& value);
+    iterator insert(const_iterator p, size_type count, value_type const& value);
 
     //! @pre
-    //!  @li \c position must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
+    //!  @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
     //!  @li <tt>distance(first, last) <= capacity()</tt>
     //!  @li \c Iterator must meet the \c ForwardTraversalIterator concept.
     //!
-    //! @brief Inserts a copy of a range <tt>[first, last)</tt> at position.
+    //! @brief Inserts a copy of a range <tt>[first, last)</tt> at p.
     //!
-    //! @param position    The position at which new elements will be inserted.
-    //! @param first       The iterator to the first element of a range used to construct new elements.
-    //! @param last        The iterator to the one after the last element of a range used to construct new elements.
+    //! @param p     The position at which new elements will be inserted.
+    //! @param first The iterator to the first element of a range used to construct new elements.
+    //! @param last  The iterator to the one after the last element of a range used to construct new elements.
     //!
     //! @par Throws
     //!   @li If Value's constructor and assignment taking a dereferenced \c Iterator.
@@ -538,20 +576,38 @@
     //! @par Complexity
     //!   Linear O(N).
     template <typename Iterator>
-    iterator insert(iterator position, Iterator first, Iterator last);
+    iterator insert(const_iterator p, Iterator first, Iterator last);
 
-    //! @pre \c position must be a valid iterator of \c *this in range <tt>[begin(), end())</tt>
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+    //! @pre
+    //!  @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>.
+    //!  @li <tt>distance(il.begin(), il.end()) <= capacity()</tt>
     //!
-    //! @brief Erases Value from position.
+    //! @brief Inserts a copy of a range <tt>[il.begin(), il.end())</tt> at p.
     //!
-    //! @param position    The position of the element which will be erased from the container.
+    //! @param p     The position at which new elements will be inserted.
+    //! @param il    The std::initializer_list which contains elements that will be inserted.
+    //!
+    //! @par Throws
+    //!   @li If Value's constructor and assignment taking a dereferenced std::initializer_list iterator.
+    //!
+    //! @par Complexity
+    //!   Linear O(N).
+    iterator insert(const_iterator p, std::initializer_list<value_type> il);
+#endif
+
+    //! @pre \c p must be a valid iterator of \c *this in range <tt>[begin(), end())</tt>
+    //!
+    //! @brief Erases Value from p.
+    //!
+    //! @param p    The position of the element which will be erased from the container.
     //!
     //! @par Throws
     //!   If Value's move assignment throws.
     //!
     //! @par Complexity
     //!   Linear O(N).
-    iterator erase(iterator position);
+    iterator erase(const_iterator p);
 
     //! @pre
     //!  @li \c first and \c last must define a valid range
@@ -567,7 +623,7 @@
     //!
     //! @par Complexity
     //!   Linear O(N).
-    iterator erase(iterator first, iterator last);
+    iterator erase(const_iterator first, const_iterator last);
 
     //! @pre <tt>distance(first, last) <= capacity()</tt>
     //!
@@ -584,6 +640,21 @@
     template <typename Iterator>
     void assign(Iterator first, Iterator last);
 
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+    //! @pre <tt>distance(il.begin(), il.end()) <= capacity()</tt>
+    //!
+    //! @brief Assigns a range <tt>[il.begin(), il.end())</tt> of Values to this container.
+    //!
+    //! @param first       std::initializer_list with values used to construct new content of this container.
+    //!
+    //! @par Throws
+    //!   If Value's copy constructor or copy assignment throws,
+    //!
+    //! @par Complexity
+    //!   Linear O(N).
+    void assign(std::initializer_list<value_type> il);
+#endif
+
     //! @pre <tt>count <= capacity()</tt>
     //!
     //! @brief Assigns a count copies of value to this container.
@@ -614,14 +685,14 @@
     void emplace_back(Args &&...args);
 
     //! @pre
-    //!  @li \c position must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>
+    //!  @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>
     //!  @li <tt>size() < capacity()</tt>
     //!
     //! @brief Inserts a Value constructed with
-    //!   \c std::forward<Args>(args)... before position
+    //!   \c std::forward<Args>(args)... before p
     //!
-    //! @param position The position at which new elements will be inserted.
-    //! @param args     The arguments of the constructor of the new element.
+    //! @param p     The position at which new elements will be inserted.
+    //! @param args  The arguments of the constructor of the new element.
     //!
     //! @par Throws
     //!   If in-place constructor throws or if Value's move constructor or move assignment throws.
@@ -629,7 +700,7 @@
     //! @par Complexity
     //!   Constant or linear.
     template<class ...Args>
-    iterator emplace(iterator position, Args &&...args);
+    iterator emplace(const_iterator p, Args &&...args);
 
     //! @brief Removes all elements from the container.
     //!
@@ -638,7 +709,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    void clear()  BOOST_CONTAINER_NOEXCEPT;
+    void clear()  BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @pre <tt>i < size()</tt>
     //!
@@ -704,6 +775,66 @@
     //!   Constant O(1).
     const_reference operator[](size_type i) const;
 
+    //! @pre <tt>i =< size()</tt>
+    //!
+    //! @brief Returns a iterator to the i-th element.
+    //!
+    //! @param i    The element's index.
+    //!
+    //! @return a iterator to the i-th element.
+    //!
+    //! @par Throws
+    //!   Nothing by default.
+    //!
+    //! @par Complexity
+    //!   Constant O(1).
+    iterator nth(size_type i);
+
+    //! @pre <tt>i =< size()</tt>
+    //!
+    //! @brief Returns a const_iterator to the i-th element.
+    //!
+    //! @param i    The element's index.
+    //!
+    //! @return a const_iterator to the i-th element.
+    //!
+    //! @par Throws
+    //!   Nothing by default.
+    //!
+    //! @par Complexity
+    //!   Constant O(1).
+    const_iterator nth(size_type i) const;
+
+    //! @pre <tt>begin() <= p <= end()</tt>
+    //!
+    //! @brief Returns the index of the element pointed by p.
+    //!
+    //! @param i    The element's index.
+    //!
+    //! @return The index of the element pointed by p.
+    //!
+    //! @par Throws
+    //!   Nothing by default.
+    //!
+    //! @par Complexity
+    //!   Constant O(1).
+    size_type index_of(iterator p);
+
+    //! @pre <tt>begin() <= p <= end()</tt>
+    //!
+    //! @brief Returns the index of the element pointed by p.
+    //!
+    //! @param i    The index of the element pointed by p.
+    //!
+    //! @return a const_iterator to the i-th element.
+    //!
+    //! @par Throws
+    //!   Nothing by default.
+    //!
+    //! @par Complexity
+    //!   Constant O(1).
+    size_type index_of(const_iterator p) const;
+
     //! @pre \c !empty()
     //!
     //! @brief Returns reference to the first element.
@@ -768,7 +899,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    Value * data() BOOST_CONTAINER_NOEXCEPT;
+    Value * data() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Const pointer such that <tt>[data(), data() + size())</tt> is a valid range.
     //!   For a non-empty vector <tt>data() == &front()</tt>.
@@ -778,7 +909,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const Value * data() const BOOST_CONTAINER_NOEXCEPT;
+    const Value * data() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns iterator to the first element.
     //!
@@ -789,7 +920,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    iterator begin() BOOST_CONTAINER_NOEXCEPT;
+    iterator begin() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const iterator to the first element.
     //!
@@ -800,7 +931,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_iterator begin() const BOOST_CONTAINER_NOEXCEPT;
+    const_iterator begin() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const iterator to the first element.
     //!
@@ -811,7 +942,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_iterator cbegin() const BOOST_CONTAINER_NOEXCEPT;
+    const_iterator cbegin() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns iterator to the one after the last element.
     //!
@@ -822,7 +953,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    iterator end() BOOST_CONTAINER_NOEXCEPT;
+    iterator end() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const iterator to the one after the last element.
     //!
@@ -833,7 +964,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_iterator end() const BOOST_CONTAINER_NOEXCEPT;
+    const_iterator end() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const iterator to the one after the last element.
     //!
@@ -844,7 +975,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_iterator cend() const BOOST_CONTAINER_NOEXCEPT;
+    const_iterator cend() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns reverse iterator to the first element of the reversed container.
     //!
@@ -856,7 +987,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    reverse_iterator rbegin() BOOST_CONTAINER_NOEXCEPT;
+    reverse_iterator rbegin() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const reverse iterator to the first element of the reversed container.
     //!
@@ -868,7 +999,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_reverse_iterator rbegin() const BOOST_CONTAINER_NOEXCEPT;
+    const_reverse_iterator rbegin() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const reverse iterator to the first element of the reversed container.
     //!
@@ -880,7 +1011,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_reverse_iterator crbegin() const BOOST_CONTAINER_NOEXCEPT;
+    const_reverse_iterator crbegin() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns reverse iterator to the one after the last element of the reversed container.
     //!
@@ -892,7 +1023,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    reverse_iterator rend() BOOST_CONTAINER_NOEXCEPT;
+    reverse_iterator rend() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const reverse iterator to the one after the last element of the reversed container.
     //!
@@ -904,7 +1035,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_reverse_iterator rend() const BOOST_CONTAINER_NOEXCEPT;
+    const_reverse_iterator rend() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns const reverse iterator to the one after the last element of the reversed container.
     //!
@@ -916,7 +1047,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    const_reverse_iterator crend() const BOOST_CONTAINER_NOEXCEPT;
+    const_reverse_iterator crend() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns container's capacity.
     //!
@@ -927,7 +1058,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    static size_type capacity() BOOST_CONTAINER_NOEXCEPT;
+    static size_type capacity() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns container's capacity.
     //!
@@ -938,7 +1069,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    static size_type max_size() BOOST_CONTAINER_NOEXCEPT;
+    static size_type max_size() BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Returns the number of stored elements.
     //!
@@ -949,7 +1080,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    size_type size() const BOOST_CONTAINER_NOEXCEPT;
+    size_type size() const BOOST_NOEXCEPT_OR_NOTHROW;
 
     //! @brief Queries if the container contains elements.
     //!
@@ -961,7 +1092,7 @@
     //!
     //! @par Complexity
     //!   Constant O(1).
-    bool empty() const BOOST_CONTAINER_NOEXCEPT;
+    bool empty() const BOOST_NOEXCEPT_OR_NOTHROW;
 #else
 
    friend void swap(static_vector &x, static_vector &y)