|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r82373 - sandbox/static_vector/boost/container
From: athundt_at_[hidden]
Date: 2013-01-06 02:09:08
Author: ahundt
Date: 2013-01-06 02:09:06 EST (Sun, 06 Jan 2013)
New Revision: 82373
URL: http://svn.boost.org/trac/boost/changeset/82373
Log:
static_vector significant documentation update
Text files modified:
sandbox/static_vector/boost/container/static_vector.hpp | 762 +++++++++++++++++++++++++--------------
1 files changed, 487 insertions(+), 275 deletions(-)
Modified: sandbox/static_vector/boost/container/static_vector.hpp
==============================================================================
--- sandbox/static_vector/boost/container/static_vector.hpp (original)
+++ sandbox/static_vector/boost/container/static_vector.hpp 2013-01-06 02:09:06 EST (Sun, 06 Jan 2013)
@@ -1,4 +1,4 @@
-// Boost.Container StaticVector
+// Boost.Container static_vector
//
// Copyright (c) 2012 Adam Wulkiewicz, Lodz, Poland.
// Copyright (c) 2011-2012 Andrew Hundt.
@@ -59,8 +59,7 @@
// Could say
// "cannot reserve(4) due to fixed capacity of 3 elements"
-
-// TODO: document strategy concept, possibly define as subset of Allocator concept
+
template <typename Value>
struct default_strategy/*fake_allocator*/
{
@@ -169,9 +168,36 @@
* static_vector is a sequence container like boost::container::vector with contiguous storage that can
* change in size, but provides the static allocation, low overhead, and fixed capacity of boost::array.
*
- * @tparam Value the type of element that will be stored
+ * @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.
- * @tparam Strategy
+ *
+ *
+ * static_vector stores elements within the object itself similarly to an array, allowing dynamic resizing
+ * up to a fixed capacity. Objects are initialized as they are inserted into static_vector. This behavior
+ * differs from C arrays or std::array which must construct all elements on instantiation, enabling the use
+ * of statically allocated elements in cases that would otherwise not be trivially possible.
+ *
+ * \include example/static_vector_example.cpp
+ *
+ * @par Error Handling
+ *
+ * Insertion beyond the capacity and out of bounds errors result in undefined behavior unless
+ * otherwise specified. In this respect if size() == capacity(), then static_vector::push_back()
+ * behaves like std::vector pop_front() if size() == empty(). The reason for this difference
+ * is because unlike vectors, static_vector does not perform allocation.
+ *
+ * @internal
+ *
+ * @tparam Strategy defines the public typedefs and error handlers,
+ * implements StaticVectorStrategy and has some similarities
+ * to an Allocator. @see StaticVectorStrategy
+ *
+ * @par Advanced Usage
+ *
+ * Error handling behavior can be modified to more closely match std::vector exception behavior
+ * when exceeding bounds by providing an alternate Strategy and static_vector_traits instantiation.
+ *
+ * @endinternal
*/
template <typename Value, std::size_t Capacity, typename Strategy/*FakeAllocator*/ = static_vector_detail::default_strategy<Value>/*fake_allocator*/ >
class static_vector
@@ -227,52 +253,66 @@
typedef boost::reverse_iterator<iterator> reverse_iterator;
typedef boost::reverse_iterator<const_iterator> const_reverse_iterator;
- //! <b>Effects</b>: Constructs an empty static_vector.
+ //! @brief Constructs an empty static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
static_vector()
: m_size(0)
{}
- //! <b>Requires</b>: count <= Capacity.
+ //! @pre count <= Capacity.
//!
- //! <b>Effects</b>: Constructs a static_vector containing count default constructed Values.
+ //! @brief Constructs a static_vector containing count default constructed Values.
//!
- //! <b>Throws</b>: If Value's default constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's default constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
explicit static_vector(size_type count)
: m_size(0)
{
this->resize(count); // may throw
}
- //! <b>Requires</b>: count <= Capacity.
+ //! @pre count <= Capacity.
//!
- //! <b>Effects</b>: Constructs a static_vector containing count copies of value.
+ //! @brief Constructs a static_vector containing count copies of value.
//!
- //! <b>Throws</b>: If Value's copy constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's copy constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
static_vector(size_type count, value_type const& value)
: m_size(0)
{
this->resize(count, value); // may throw
}
- //! <b>Requires</b>: distance(first, last) <= Capacity.
+ //! @pre distance(first, last) <= Capacity.
//! Iterator must meet the ForwardTraversal Iterator concept
//!
- //! <b>Effects</b>: Constructs a static_vector containing copy of a range [first, last).
+ //! @brief Constructs a static_vector containing copy of a range [first, last).
//!
- //! <b>Throws</b>: If Value's constructor taking a dereferenced Iterator throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's constructor taking a dereferenced Iterator throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <typename Iterator>
static_vector(Iterator first, Iterator last)
: m_size(0)
@@ -282,11 +322,13 @@
this->assign(first, last); // may throw
}
- //! <b>Effects</b>: Constructs a copy of other static_vector.
+ //! @brief Constructs a copy of other static_vector.
//!
- //! <b>Throws</b>: If Value's copy constructor throws.
+ //! @throws
+ //! If Value's copy constructor throws.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
static_vector(static_vector const& other)
: m_size(other.size())
{
@@ -294,14 +336,18 @@
sv::uninitialized_copy(other.begin(), other.end(), this->begin()); // may throw
}
- //! <b>Requires</b>: other.size() <= Capacity.
+ //! @pre other.size() <= Capacity.
//!
- //! <b>Effects</b>: Constructs a copy of other static_vector.
+ //! @brief Constructs a copy of other static_vector.
//!
- //! <b>Throws</b>: If Value's copy constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's copy constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <std::size_t C, typename S>
static_vector(static_vector<value_type, C, S> const& other)
: m_size(other.size())
@@ -312,11 +358,13 @@
sv::uninitialized_copy(other.begin(), other.end(), this->begin()); // may throw
}
- //! <b>Effects</b>: Copy assigns Values stored in the other static_vector to this one.
+ //! @brief Copy assigns Values stored in the other static_vector to this one.
//!
- //! <b>Throws</b>: If Value's copy constructor or copy assignment throws.
+ //! @throws
+ //! If Value's copy constructor or copy assignment throws.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
static_vector & operator=(BOOST_COPY_ASSIGN_REF(static_vector) other)
{
this->assign(other.begin(), other.end()); // may throw
@@ -324,14 +372,18 @@
return *this;
}
- //! <b>Requires</b>: other.size() <= Capacity.
+ //! @pre other.size() <= Capacity.
//!
- //! <b>Effects</b>: Copy assigns Values stored in the other static_vector to this one.
+ //! @brief Copy assigns Values stored in the other static_vector to this one.
//!
- //! <b>Throws</b>: If Value's copy constructor or copy assignment throws,
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's copy constructor or copy assignment throws,
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <std::size_t C, typename S>
// TEMPORARY WORKAROUND
#if defined(BOOST_NO_RVALUE_REFERENCES)
@@ -345,13 +397,15 @@
return *this;
}
- //! <b>Effects</b>: Move constructor. Moves Values stored in the other static_vector to this one.
+ //! @brief Move constructor. Moves Values stored in the other static_vector to this one.
//!
- //! <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor throws
- //! or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor throws
- //! but only if use_memop_in_swap_and_move is false_type - default.
+ //! @throws
+ //! @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor throws
+ //! @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor throws
+ //! but only if use_memop_in_swap_and_move is false_type - default.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
static_vector(BOOST_RV_REF(static_vector) other)
{
typedef typename
@@ -362,16 +416,20 @@
this->move_ctor_dispatch(other, use_memop_in_swap_and_move());
}
- //! <b>Requires</b>: other.size() <= Capacity.
+ //! @pre other.size() <= Capacity.
//!
- //! <b>Effects</b>: Move constructor. Moves Values stored in the other static_vector to this one.
+ //! @brief Move constructor. Moves Values stored in the other static_vector to this one.
//!
- //! <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor throws
- //! or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor throws
- //! but only if use_memop_in_swap_and_move is false_type - default.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor throws
+ //! @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor throws
+ //! but only if use_memop_in_swap_and_move is false_type - default.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <std::size_t C, typename S>
static_vector(BOOST_RV_REF_3_TEMPL_ARGS(static_vector, value_type, C, S) other)
: m_size(other.m_size)
@@ -386,13 +444,15 @@
this->move_ctor_dispatch(other, use_memop_in_swap_and_move());
}
- //! <b>Effects</b>: Move assignment. Moves Values stored in the other static_vector to this one.
+ //! @brief Move assignment. Moves Values stored in the other static_vector to this one.
//!
- //! <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
- //! or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
- //! but only if use_memop_in_swap_and_move is false_type - default.
+ //! @throws
+ //! @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
+ //! @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
+ //! but only if use_memop_in_swap_and_move is false_type - default.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
static_vector & operator=(BOOST_RV_REF(static_vector) other)
{
if ( &other == this )
@@ -408,16 +468,20 @@
return *this;
}
- //! <b>Requires</b>: other.size() <= Capacity.
+ //! @pre other.size() <= Capacity.
//!
- //! <b>Effects</b>: Move assignment. Moves Values stored in the other static_vector to this one.
+ //! @brief Move assignment. Moves Values stored in the other static_vector to this one.
//!
- //! <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
- //! or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
- //! but only if use_memop_in_swap_and_move is false_type - default.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
+ //! @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
+ //! but only if use_memop_in_swap_and_move is false_type - default.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <std::size_t C, typename S>
static_vector & operator=(BOOST_RV_REF_3_TEMPL_ARGS(static_vector, value_type, C, S) other)
{
@@ -433,24 +497,28 @@
return *this;
}
- //! <b>Effects</b>: Destructor. Destroys Values stored in this container.
+ //! @brief Destructor. Destroys Values stored in this container.
//!
- //! <b>Throws</b>: Nothing
+ //! @throws
+ //! Nothing
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
~static_vector()
{
namespace sv = static_vector_detail;
sv::destroy(this->begin(), this->end());
}
- //! <b>Effects</b>: Swaps contents of the other static_vector and this one.
+ //! @brief Swaps contents of the other static_vector and this one.
//!
- //! <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
- //! or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
- //! but only if use_memop_in_swap_and_move and use_optimized_swap are false_type - default.
+ //! @throws
+ //! @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
+ //! @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
+ //! but only if use_memop_in_swap_and_move and use_optimized_swap are false_type - default.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
void swap(static_vector & other)
{
typedef typename
@@ -461,16 +529,20 @@
this->swap_dispatch(other, use_optimized_swap());
}
- //! <b>Requires</b>: other.size() <= Capacity && size() <= other.capacity().
+ //! @pre other.size() <= Capacity && size() <= other.capacity().
//!
- //! <b>Effects</b>: Swaps contents of the other static_vector and this one.
+ //! @brief Swaps contents of the other static_vector and this one.
//!
- //! <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
- //! or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
- //! but only if use_memop_in_swap_and_move and use_optimized_swap are false_type - default.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws,
+ //! @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor or copy assignment throws,
+ //! but only if use_memop_in_swap_and_move and use_optimized_swap are false_type - default.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <std::size_t C, typename S>
void swap(static_vector<value_type, C, S> & other)
{
@@ -485,15 +557,19 @@
this->swap_dispatch(other, use_optimized_swap());
}
- //! <b>Requires</b>: count <= Capacity.
+ //! @pre count <= Capacity.
//!
- //! <b>Effects</b>: Inserts or erases elements at the end such that
+ //! @brief Inserts or erases elements at the end such that
//! the size becomes count. New elements are default constructed.
//!
- //! <b>Throws</b>: If Value's default constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's default constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
void resize(size_type count)
{
namespace sv = static_vector_detail;
@@ -511,15 +587,19 @@
m_size = count; // update end
}
- //! <b>Requires</b>: count <= Capacity.
+ //! @pre count <= Capacity.
//!
- //! <b>Effects</b>: Inserts or erases elements at the end such that
+ //! @brief Inserts or erases elements at the end such that
//! the size becomes count. New elements are copy constructed from value.
//!
- //! <b>Throws</b>: If Value's copy constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's copy constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
void resize(size_type count, value_type const& value)
{
if ( count < m_size )
@@ -536,26 +616,34 @@
m_size = count; // update end
}
- //! <b>Requires</b>: count <= Capacity.
+ //! @pre count <= Capacity.
//!
- //! <b>Effects</b>: This call has no effect because the Capacity of this container is constant.
+ //! @brief This call has no effect because the Capacity of this container is constant.
//!
- //! <b>Throws</b>: If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
void reserve(size_type count)
{
errh::check_capacity(*this, count); // may throw
}
- //! <b>Requires</b>: size() < Capacity.
+ //! @pre size() < Capacity.
//!
- //! <b>Effects</b>: Adds a copy of value at the end.
+ //! @brief Adds a copy of value at the end.
//!
- //! <b>Throws</b>: If Value's copy constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's copy constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
void push_back(value_type const& value)
{
errh::check_capacity(*this, m_size + 1); // may throw
@@ -565,14 +653,18 @@
++m_size; // update end
}
- //! <b>Requires</b>: size() < Capacity.
+ //! @pre size() < Capacity.
//!
- //! <b>Effects</b>: Moves value to the end.
+ //! @brief Moves value to the end.
//!
- //! <b>Throws</b>: If Value's move constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's move constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
void push_back(BOOST_RV_REF(value_type) value)
{
errh::check_capacity(*this, m_size + 1); // may throw
@@ -582,13 +674,15 @@
++m_size; // update end
}
- //! <b>Requires</b>: !empty().
+ //! @pre !empty().
//!
- //! <b>Effects</b>: Destroys last value and decreases the size.
+ //! @brief Destroys last value and decreases the size.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
void pop_back()
{
errh::check_empty(*this);
@@ -598,44 +692,56 @@
--m_size; // update end
}
- //! <b>Requires</b>: position must be a valid iterator of *this in range [begin(), end()].
+ //! @pre position must be a valid iterator of *this in range [begin(), end()].
//!
- //! <b>Effects</b>: Inserts a copy of element at position.
+ //! @brief Inserts a copy of element at position.
//!
- //! <b>Throws</b>: If Value's copy constructor or copy assignment throws
+ //! @throws
+ //! If Value's copy constructor or copy assignment throws
//! or if Value's move constructor or move assignment throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Constant or linear.
+ //! @par Complexity
+ //! Constant or linear.
iterator insert(iterator position, value_type const& value)
{
return this->priv_insert(position, value);
}
- //! <b>Requires</b>: position must be a valid iterator of *this in range [begin(), end()]
+ //! @pre position must be a valid iterator of *this in range [begin(), end()]
//! and size() < Capacity.
//!
- //! <b>Effects</b>: Inserts a move-constructed element at position.
+ //! @brief Inserts a move-constructed element at position.
//!
- //! <b>Throws</b>: If Value's move constructor or move assignment throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If Value's move constructor or move assignment throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Constant or linear.
+ //! @par Complexity
+ //! Constant or linear.
iterator insert(iterator position, BOOST_RV_REF(value_type) value)
{
return this->priv_insert(position, value);
}
- //! <b>Requires</b>: position must be a valid iterator of *this in range [begin(), end()]
+ //! @pre position must be a valid iterator of *this in range [begin(), end()]
//! and size() + count <= Capacity.
//!
- //! <b>Effects</b>: Inserts a count copies of value at position.
+ //! @brief Inserts a count copies of value at position.
//!
- //! <b>Throws</b>: If Value's copy constructor or copy assignment throws
+ //! @throws
+ //! If Value's copy constructor or copy assignment throws
//! or if Value's move constructor or move assignment throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
iterator insert(iterator position, size_type count, value_type const& value)
{
errh::check_iterator_end_eq(*this, position);
@@ -674,17 +780,22 @@
return position;
}
- //! <b>Requires</b>: position must be a valid iterator of *this in range [begin(), end()]
+ //! @pre position must be a valid iterator of *this in range [begin(), end()]
//! and distance(first, last) <= Capacity.
//! Iterator must meet the ForwardTraversal Iterator concept
//!
- //! <b>Effects</b>: Inserts a copy of a range [first, last) at position.
+ //! @brief Inserts a copy of a range [first, last) at position.
//!
- //! <b>Throws</b>: If Value's constructor and assignment taking a dereferenced Iterator throws
- //! or if Value's move constructor or move assignment throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! @li If Value's constructor and assignment taking a dereferenced Iterator
+ //! @li If Value's move constructor or move assignment throws.
+ //!
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <typename Iterator>
iterator insert(iterator position, Iterator first, Iterator last)
{
@@ -696,13 +807,15 @@
return position;
}
- //! <b>Requires</b>: position must be a valid iterator of *this in range [begin(), end()).
+ //! @pre position must be a valid iterator of *this in range [begin(), end()).
//!
- //! <b>Effects</b>: Erases Value from position.
+ //! @brief Erases Value from position.
//!
- //! <b>Throws</b>: If Value's move assignment throws.
+ //! @throws
+ //! If Value's move assignment throws.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
iterator erase(iterator position)
{
namespace sv = static_vector_detail;
@@ -719,13 +832,15 @@
return position;
}
- //! <b>Requires</b>: first and last must define a valid range, iterators must be in range [begin(), end()].
+ //! @pre first and last must define a valid range, iterators must be in range [begin(), end()].
//!
- //! <b>Effects</b>: Erases Values from a range [first, last).
+ //! @brief Erases Values from a range [first, last).
//!
- //! <b>Throws</b>: If Value's move assignment throws.
+ //! @throws
+ //! If Value's move assignment throws.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
iterator erase(iterator first, iterator last)
{
namespace sv = static_vector_detail;
@@ -747,13 +862,15 @@
return first;
}
- //! <b>Requires</b>: distance(first, last) <= Capacity.
+ //! @pre distance(first, last) <= Capacity.
//!
- //! <b>Effects</b>: Assigns a range [first, last) of Values to this container.
+ //! @brief Assigns a range [first, last) of Values to this container.
//!
- //! <b>Throws</b>: If Value's copy constructor or copy assignment throws,
+ //! @throws
+ //! If Value's copy constructor or copy assignment throws,
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
template <typename Iterator>
void assign(Iterator first, Iterator last)
{
@@ -763,13 +880,15 @@
this->assign_dispatch(first, last, traversal()); // may throw
}
- //! <b>Requires</b>: count <= Capacity.
+ //! @pre count <= Capacity.
//!
- //! <b>Effects</b>: Assigns a count copies of value to this container.
+ //! @brief Assigns a count copies of value to this container.
//!
- //! <b>Throws</b>: If Value's copy constructor or copy assignment throws.
+ //! @throws
+ //! If Value's copy constructor or copy assignment throws.
//!
- //! <b>Complexity</b>: Linear.
+ //! @par Complexity
+ //! Linear O(N).
void assign(size_type count, value_type const& value)
{
if ( count < m_size )
@@ -791,15 +910,19 @@
#if !defined(BOOST_CONTAINER_STATIC_VECTOR_DISABLE_EMPLACE)
#if defined(BOOST_CONTAINER_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
- //! <b>Requires</b>: size() < Capacity.
+ //! @pre size() < Capacity.
//!
- //! <b>Effects</b>: Inserts a Value constructed with
+ //! @brief Inserts a Value constructed with
//! std::forward<Args>(args)... in the end of the container.
//!
- //! <b>Throws</b>: If in-place constructor throws or Value's move constructor throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @throws
+ //! If in-place constructor throws or Value's move constructor throws.
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
template<class ...Args>
void emplace_back(Args &&...args)
{
@@ -810,17 +933,21 @@
++m_size; // update end
}
- //! <b>Requires</b>: position must be a valid iterator of *this in range [begin(), end()]
+ //! @pre position must be a valid iterator of *this in range [begin(), end()]
//! and size() < Capacity.
//!
- //! <b>Effects</b>: Inserts a Value constructed with
+ //! @brief Inserts a Value constructed with
//! std::forward<Args>(args)... before position
//!
- //! <b>Throws</b>: If in-place constructor throws or Value's move
+ //! @throws
+ //! If in-place constructor throws or Value's move
//! constructor or move assignment throws.
- //! If the error handler throws in capacity check (nothing by default).
+ //! @internal
+ //! @li If a throwing error handler is specified, throws when the capacity is exceeded. (not by default).
+ //! @endinternal
//!
- //! <b>Complexity</b>: Constant or linear.
+ //! @par Complexity
+ //! Constant or linear.
template<class ...Args>
iterator emplace(iterator position, Args &&...args)
{
@@ -910,11 +1037,13 @@
#endif // BOOST_CONTAINER_PERFECT_FORWARDING || BOOST_CONTAINER_DOXYGEN_INVOKED
#endif // !BOOST_CONTAINER_STATIC_VECTOR_DISABLE_EMPLACE
- //! <b>Effects</b>: Removes all elements from the container.
+ //! @brief Removes all elements from the container.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
void clear()
{
namespace sv = static_vector_detail;
@@ -922,270 +1051,327 @@
m_size = 0; // update end
}
- //! <b>Requires</b>: i < size().
+ //! @pre i < size().
//!
- //! <b>Effects</b>: Returns a reference to the i-th element
+ //! @return reference to the i-th element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: std::out_of_range exception by default.
+ //! @throws
+ //! std::out_of_range exception by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
reference at(size_type i)
{
errh::check_at(*this, i); // may throw
return *(this->begin() + i);
}
- //! <b>Requires</b>: i < size().
+ //! @pre i < size().
//!
- //! <b>Effects</b>: Returns a const reference to the i-th element
+ //! @return const reference to the i-th element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: std::out_of_range exception by default.
+ //! @throws
+ //! std::out_of_range exception by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reference at(size_type i) const
{
errh::check_at(*this, i); // may throw
return *(this->begin() + i);
}
- //! <b>Requires</b>: i < size().
+ //! @pre i < size().
//!
- //! <b>Effects</b>: Returns a reference to the i-th element
+ //! @return reference to the i-th element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
reference operator[](size_type i)
{
+ // TODO: Remove bounds check? std::vector and std::array operator[] don't check.
errh::check_operator_brackets(*this, i);
return *(this->begin() + i);
}
- //! <b>Requires</b>: i < size().
+ //! @pre i < size().
//!
- //! <b>Effects</b>: Returns a const reference to the i-th element
+ //! @return const reference to the i-th element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reference operator[](size_type i) const
{
errh::check_operator_brackets(*this, i);
return *(this->begin() + i);
}
- //! <b>Requires</b>: !empty().
+ //! @pre !empty().
//!
- //! <b>Effects</b>: Returns a reference to the first element
+ //! @return reference to the first element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
reference front()
{
errh::check_empty(*this);
return *(this->begin());
}
- //! <b>Requires</b>: !empty().
+ //! @pre !empty().
//!
- //! <b>Effects</b>: Returns a const reference to the first element
+ //! @return const reference to the first element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reference front() const
{
errh::check_empty(*this);
return *(this->begin());
}
- //! <b>Requires</b>: !empty().
+ //! @pre !empty().
//!
- //! <b>Effects</b>: Returns a reference to the last element
+ //! @return reference to the last element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
reference back()
{
errh::check_empty(*this);
return *(this->end() - 1);
}
- //! <b>Requires</b>: !empty().
+ //! @pre !empty().
//!
- //! <b>Effects</b>: Returns a const reference to the last element
+ //! @return const reference to the last element
//! from the beginning of the container.
//!
- //! <b>Throws</b>: Nothing by default.
+ //! @throws
+ //! Nothing by default.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reference back() const
{
errh::check_empty(*this);
return *(this->end() - 1);
}
- //! <b>Effects</b>: Pointer such that [data(), data() + size()) is a valid range.
+ //! @brief Pointer such that [data(), data() + size()) is a valid range.
//! For a non-empty vector, data() == &front().
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
Value * data()
{
return boost::addressof(*(this->ptr()));
}
- //! <b>Effects</b>: Const pointer such that [data(), data() + size()) is a valid range.
+ //! @brief Const pointer such that [data(), data() + size()) is a valid range.
//! For a non-empty vector, data() == &front().
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const Value * data() const
{
return boost::addressof(*(this->ptr()));
}
- //! <b>Effects</b>: Returns an iterator to the first element contained in the vector.
+ //! @returnn iterator to the first element contained in the vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
iterator begin() { return this->ptr(); }
- //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
+ //! @return const_iterator to the first element contained in the vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_iterator begin() const { return this->ptr(); }
- //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
+ //! @return const_iterator to the first element contained in the vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_iterator cbegin() const { return this->ptr(); }
- //! <b>Effects</b>: Returns an iterator pointing to the one after the last element contained in the vector.
+ //! @returnn iterator pointing to the one after the last element contained in the vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
iterator end() { return this->begin() + m_size; }
- //! <b>Effects</b>: Returns a const_iterator pointing to the one after the last element contained in the vector.
+ //! @return const_iterator pointing to the one after the last element contained in the vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_iterator end() const { return this->begin() + m_size; }
- //! <b>Effects</b>: Returns a const_iterator pointing to the one after the last element contained in the vector.
+ //! @return const_iterator pointing to the one after the last element contained in the vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_iterator cend() const { return this->cbegin() + m_size; }
- //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning
+ //! @return reverse_iterator pointing to the beginning
//! of the reversed static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
reverse_iterator rbegin() { return reverse_iterator(this->end()); }
- //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+ //! @return const_reverse_iterator pointing to the beginning
//! of the reversed static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reverse_iterator rbegin() const { return reverse_iterator(this->end()); }
- //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+ //! @return const_reverse_iterator pointing to the beginning
//! of the reversed static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reverse_iterator crbegin() const { return reverse_iterator(this->end()); }
- //! <b>Effects</b>: Returns a reverse_iterator pointing to the one after the last element
+ //! @return reverse_iterator pointing to the one after the last element
//! of the reversed static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
reverse_iterator rend() { return reverse_iterator(this->begin()); }
- //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the one after the last element
+ //! @return const_reverse_iterator pointing to the one after the last element
//! of the reversed static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reverse_iterator rend() const { return reverse_iterator(this->begin()); }
- //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the one after the last element
+ //! @return const_reverse_iterator pointing to the one after the last element
//! of the reversed static_vector.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
const_reverse_iterator crend() const { return reverse_iterator(this->begin()); }
- //! <b>Effects</b>: Returns container's capacity.
+ //! @return container's capacity.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
static size_type capacity() { return Capacity; }
- //! <b>Effects</b>: Returns container's capacity.
+ //! @return container's capacity.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
static size_type max_size() { return Capacity; }
- //! <b>Effects</b>: Returns the number of elements contained in the container.
+ //! @return Number of elements contained in the container.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
size_type size() const { return m_size; }
- //! <b>Effects</b>: Returns true if the number of elements contained in the
+ //! @return true if the number of elements contained in the
//! container is equal to 0.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
bool empty() const { return 0 == m_size; }
- //! <b>Effects</b>: The call has no effects.
+ //! @brief Capacity is fixed so this call has no effects.
//!
- //! <b>Throws</b>: Nothing.
+ //! @throws
+ //! Nothing.
//!
- //! <b>Complexity</b>: Constant.
+ //! @par Complexity
+ //! Constant O(1).
void shrink_to_fit() {}
private:
- // <b>Throws</b>: Nothing.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // Nothing.
+ // @par Complexity
+ // Linear O(N).
template <std::size_t C, typename S>
void move_ctor_dispatch(static_vector<value_type, C, S> & other, boost::true_type /*use_memop*/)
{
@@ -1194,9 +1380,11 @@
other.m_size = 0;
}
- // <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor throws
- // or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor throws.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor throws
+ // @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor throws.
+ // @par Complexity
+ // Linear O(N).
template <std::size_t C, typename S>
void move_ctor_dispatch(static_vector<value_type, C, S> & other, boost::false_type /*use_memop*/)
{
@@ -1207,8 +1395,10 @@
other.m_size = 0;
}
- // <b>Throws</b>: Nothing.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // Nothing.
+ // @par Complexity
+ // Linear O(N).
template <std::size_t C, typename S>
void move_assign_dispatch(static_vector<value_type, C, S> & other, boost::true_type /*use_memop*/)
{
@@ -1218,9 +1408,11 @@
boost::swap(m_size, other.m_size);
}
- // <b>Throws</b>: If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws
- // or if boost::has_nothrow_move<Value>::value is false and Value's copy constructor or move assignment throws.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // @li If boost::has_nothrow_move<Value>::value is true and Value's move constructor or move assignment throws
+ // @li If boost::has_nothrow_move<Value>::value is false and Value's copy constructor or move assignment throws.
+ // @par Complexity
+ // Linear O(N).
template <std::size_t C, typename S>
void move_assign_dispatch(static_vector<value_type, C, S> & other, boost::false_type /*use_memop*/)
{
@@ -1241,8 +1433,10 @@
other.clear();
}
- // <b>Throws</b>: Nothing.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // Nothing.
+ // @par Complexity
+ // Linear O(N).
template <std::size_t C, typename S>
void swap_dispatch(static_vector<value_type, C, S> & other, boost::true_type const& /*use_optimized_swap*/)
{
@@ -1264,9 +1458,11 @@
boost::swap(m_size, other.m_size);
}
- // <b>Throws</b>: If Value's move constructor or move assignment throws
+ // @throws
+ // If Value's move constructor or move assignment throws
// but only if use_memop_in_swap_and_move is false_type - default.
- // <b>Complexity</b>: Linear.
+ // @par Complexity
+ // Linear O(N).
template <std::size_t C, typename S>
void swap_dispatch(static_vector<value_type, C, S> & other, boost::false_type const& /*use_optimized_swap*/)
{
@@ -1284,8 +1480,10 @@
boost::swap(m_size, other.m_size);
}
- // <b>Throws</b>: Nothing.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // Nothing.
+ // @par Complexity
+ // Linear O(N).
void swap_dispatch_impl(iterator first_sm, iterator last_sm, iterator first_la, iterator last_la, boost::true_type const& /*use_memop*/)
{
//BOOST_ASSERT_MSG(std::distance(first_sm, last_sm) <= std::distance(first_la, last_la));
@@ -1307,8 +1505,10 @@
::memcpy(first_sm, first_la, sizeof(value_type) * std::distance(first_la, last_la));
}
- // <b>Throws</b>: If Value's move constructor or move assignment throws.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // If Value's move constructor or move assignment throws.
+ // @par Complexity
+ // Linear O(N).
void swap_dispatch_impl(iterator first_sm, iterator last_sm, iterator first_la, iterator last_la, boost::false_type const& /*use_memop*/)
{
//BOOST_ASSERT_MSG(std::distance(first_sm, last_sm) <= std::distance(first_la, last_la));
@@ -1327,9 +1527,11 @@
// insert
- // <b>Throws</b>: If Value's move constructor or move assignment throws
+ // @throws
+ // If Value's move constructor or move assignment throws
// or if Value's copy assignment throws.
- // <b>Complexity</b>: Linear.
+ // @par Complexity
+ // Linear O(N).
template <typename V>
iterator priv_insert(iterator position, V & value)
{
@@ -1360,9 +1562,11 @@
// insert
- // <b>Throws</b>: If Value's move constructor, move assignment throws
+ // @throws
+ // If Value's move constructor, move assignment throws
// or if Value's copy constructor or copy assignment throws.
- // <b>Complexity</b>: Linear.
+ // @par Complexity
+ // Linear O(N).
template <typename Iterator>
void insert_dispatch(iterator position, Iterator first, Iterator last, boost::random_access_traversal_tag const&)
{
@@ -1388,9 +1592,11 @@
}
}
- // <b>Throws</b>: If Value's move constructor, move assignment throws
+ // @throws
+ // If Value's move constructor, move assignment throws
// or if Value's copy constructor or copy assignment throws.
- // <b>Complexity</b>: Linear.
+ // @par Complexity
+ // Linear O(N).
template <typename Iterator, typename Traversal>
void insert_dispatch(iterator position, Iterator first, Iterator last, Traversal const& /*not_random_access*/)
{
@@ -1418,9 +1624,11 @@
}
}
- // <b>Throws</b>: If Value's move constructor, move assignment throws
+ // @throws
+ // If Value's move constructor, move assignment throws
// or if Value's copy constructor or copy assignment throws.
- // <b>Complexity</b>: Linear.
+ // @par Complexity
+ // Linear O(N).
template <typename Iterator>
void insert_in_the_middle(iterator position, Iterator first, Iterator last, difference_type count)
{
@@ -1452,8 +1660,10 @@
// assign
- // <b>Throws</b>: If Value's constructor or assignment taking dereferenced Iterator throws.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // If Value's constructor or assignment taking dereferenced Iterator throws.
+ // @par Complexity
+ // Linear O(N).
template <typename Iterator>
void assign_dispatch(Iterator first, Iterator last, boost::random_access_traversal_tag const& /*not_random_access*/)
{
@@ -1478,8 +1688,10 @@
m_size = s; // update end
}
- // <b>Throws</b>: If Value's constructor or assignment taking dereferenced Iterator throws.
- // <b>Complexity</b>: Linear.
+ // @throws
+ // If Value's constructor or assignment taking dereferenced Iterator throws.
+ // @par Complexity
+ // Linear O(N).
template <typename Iterator, typename Traversal>
void assign_dispatch(Iterator first, Iterator last, Traversal const& /*not_random_access*/)
{
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk