Fixes #204 ("Inconsistent noexcept-ness of static_vector::reserve").

This commit is contained in:
Ion Gaztañaga
2022-01-07 11:15:27 +01:00
parent cf3d6d3c51
commit 2e583241c1
2 changed files with 72 additions and 44 deletions

View File

@@ -750,7 +750,7 @@ the last template parameter and defined using the utility class
* [classref boost::container::throw_on_overflow throw_on_overflow]: A boolean that specifies if the * [classref boost::container::throw_on_overflow throw_on_overflow]: A boolean that specifies if the
container should throw an exception when the compile-time capacity is not enough to hold the requesteed number container should throw an exception when the compile-time capacity is not enough to hold the requesteed number
of objects. When "false", if the capacit is overflowd, the implementation calls to BOOST_ASSERT and if that assertion of objects. When "false", if the capacit is overflowed, the implementation calls to BOOST_ASSERT and if that assertion
does not throw or abort, undefined behavior is triggered. does not throw or abort, undefined behavior is triggered.
See the following example to see how [classref boost::container::static_vector_options static_vector_options] can be See the following example to see how [classref boost::container::static_vector_options static_vector_options] can be
@@ -1343,6 +1343,7 @@ use [*Boost.Container]? There are several reasons for that:
* The library now compiles without warnings with GCC's -Wcast-align=strict * The library now compiles without warnings with GCC's -Wcast-align=strict
* Fixed bugs/issues: * Fixed bugs/issues:
* [@https://github.com/boostorg/container/issues/199 GitHub #199: ['"Apply LWG issue 3471 to memory_resource"]]. * [@https://github.com/boostorg/container/issues/199 GitHub #199: ['"Apply LWG issue 3471 to memory_resource"]].
* [@https://github.com/boostorg/container/issues/204 GitHub #204: ['"Inconsistent noexcept-ness of static_vector::reserve"]].
* [@https://github.com/boostorg/container/issues/206 GitHub #206: ['"operator-> on static_vector::iterator causes cast alignment warning"]]. * [@https://github.com/boostorg/container/issues/206 GitHub #206: ['"operator-> on static_vector::iterator causes cast alignment warning"]].
[endsect] [endsect]

View File

@@ -145,7 +145,8 @@ struct get_static_vector_allocator
//! //!
//!@tparam T The type of element that will be stored. //!@tparam T The type of element that will be stored.
//!@tparam Capacity The maximum number of elements static_vector can store, fixed at compile time. //!@tparam Capacity The maximum number of elements static_vector can store, fixed at compile time.
//!@tparam Options A type produced from \c boost::container::static_vector_options. //!@tparam Options A type produced from \c boost::container::static_vector_options. If no option
//! is specified, by default throw_on_overflow<true> option is set.
template <typename T, std::size_t Capacity, class Options BOOST_CONTAINER_DOCONLY(= void) > template <typename T, std::size_t Capacity, class Options BOOST_CONTAINER_DOCONLY(= void) >
class static_vector class static_vector
: public vector<T, typename dtl::get_static_vector_allocator< T, Capacity, Options>::type> : public vector<T, typename dtl::get_static_vector_allocator< T, Capacity, Options>::type>
@@ -208,7 +209,8 @@ public:
//! @param count The number of values which will be contained in the container. //! @param count The number of values which will be contained in the container.
//! //!
//! @par Throws //! @par Throws
//! If T's value initialization throws. //! @li If T's value initialization throws
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -223,7 +225,8 @@ public:
//! @param count The number of values which will be contained in the container. //! @param count The number of values which will be contained in the container.
//! //!
//! @par Throws //! @par Throws
//! If T's default initialization throws. //! @li If T's default initialization throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -242,7 +245,8 @@ public:
//! @param value The value which will be used to copy construct values. //! @param value The value which will be used to copy construct values.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor throws. //! @li If T's copy constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -260,7 +264,8 @@ public:
//! @param last The iterator to the one after the last element in range. //! @param last The iterator to the one after the last element in range.
//! //!
//! @par Throws //! @par Throws
//! If T's constructor taking a dereferenced Iterator throws. //! @li If T's constructor taking a dereferenced Iterator throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -278,7 +283,8 @@ public:
//! @param il std::initializer_list with values to initialize vector. //! @param il std::initializer_list with values to initialize vector.
//! //!
//! @par Throws //! @par Throws
//! If T's constructor taking a dereferenced std::initializer_list throws. //! @li If T's constructor taking a dereferenced std::initializer_list throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -320,7 +326,8 @@ public:
//! @param other The static_vector which content will be copied to this one. //! @param other The static_vector which content will be copied to this one.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor throws. //! @li If T's copy constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -353,6 +360,7 @@ public:
//! @par Throws //! @par Throws
//! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor throws. //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor throws.
//! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor throws. //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -381,7 +389,8 @@ public:
//! @param il The std::initializer_list which content will be copied to this one. //! @param il The std::initializer_list which content will be copied to this one.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor or copy assignment throws. //! @li If T's copy constructor or copy assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -396,7 +405,8 @@ public:
//! @param other The static_vector which content will be copied to this one. //! @param other The static_vector which content will be copied to this one.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor or copy assignment throws. //! @li If T's copy constructor or copy assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -432,6 +442,7 @@ public:
//! @par Throws //! @par Throws
//! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws. //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws.
//! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws. //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -474,6 +485,7 @@ public:
//! @par Throws //! @par Throws
//! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws, //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws,
//! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws, //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws,
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -488,7 +500,8 @@ public:
//! @param count The number of elements which will be stored in the container. //! @param count The number of elements which will be stored in the container.
//! //!
//! @par Throws //! @par Throws
//! If T's value initialization throws. //! @li If T's value initialization throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -502,7 +515,8 @@ public:
//! @param count The number of elements which will be stored in the container. //! @param count The number of elements which will be stored in the container.
//! //!
//! @par Throws //! @par Throws
//! If T's default initialization throws. //! @li If T's default initialization throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -520,7 +534,8 @@ public:
//! @param value The value used to copy construct the new element. //! @param value The value used to copy construct the new element.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor throws. //! @li If T's copy constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -533,11 +548,11 @@ public:
//! @param count The number of elements which the container should be able to contain. //! @param count The number of elements which the container should be able to contain.
//! //!
//! @par Throws //! @par Throws
//! Nothing. //! If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
void reserve(size_type count) BOOST_NOEXCEPT_OR_NOTHROW; void reserve(size_type count);
//! @pre <tt>size() < capacity()</tt> //! @pre <tt>size() < capacity()</tt>
//! //!
@@ -546,7 +561,8 @@ public:
//! @param value The value used to copy construct the new element. //! @param value The value used to copy construct the new element.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor throws. //! @li If T's copy constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
@@ -559,7 +575,8 @@ public:
//! @param value The value to move construct the new element. //! @param value The value to move construct the new element.
//! //!
//! @par Throws //! @par Throws
//! If T's move constructor throws. //! @li If T's move constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
@@ -570,11 +587,11 @@ public:
//! @brief Destroys last value and decreases the size. //! @brief Destroys last value and decreases the size.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
void pop_back(); void pop_back() BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre //! @pre
//! @li \c p 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>.
@@ -588,6 +605,7 @@ public:
//! @par Throws //! @par Throws
//! @li If T's copy constructor or copy assignment throws //! @li If T's copy constructor or copy assignment throws
//! @li If T's move constructor or move assignment throws. //! @li If T's move constructor or move assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant or linear. //! Constant or linear.
@@ -603,7 +621,8 @@ public:
//! @param value The value used to move construct the new element. //! @param value The value used to move construct the new element.
//! //!
//! @par Throws //! @par Throws
//! If T's move constructor or move assignment throws. //! @li If T's move constructor or move assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant or linear. //! Constant or linear.
@@ -622,6 +641,7 @@ public:
//! @par Throws //! @par Throws
//! @li If T's copy constructor or copy assignment throws. //! @li If T's copy constructor or copy assignment throws.
//! @li If T's move constructor or move assignment throws. //! @li If T's move constructor or move assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -641,6 +661,7 @@ public:
//! @par Throws //! @par Throws
//! @li If T's constructor and assignment taking a dereferenced \c Iterator. //! @li If T's constructor and assignment taking a dereferenced \c Iterator.
//! @li If T's move constructor or move assignment throws. //! @li If T's move constructor or move assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -658,6 +679,7 @@ public:
//! //!
//! @par Throws //! @par Throws
//! @li If T's constructor and assignment taking a dereferenced std::initializer_list iterator. //! @li If T's constructor and assignment taking a dereferenced std::initializer_list iterator.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -700,7 +722,8 @@ public:
//! @param last The iterator to the one after the last element of a range used to construct new content of this container. //! @param last The iterator to the one after the last element of a range used to construct new content of this container.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor or copy assignment throws, //! @li If T's copy constructor or copy assignment throws,
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -714,7 +737,8 @@ public:
//! @param il std::initializer_list with values used to construct new content of this container. //! @param il std::initializer_list with values used to construct new content of this container.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor or copy assignment throws, //! @li If T's copy constructor or copy assignment throws,
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -728,7 +752,8 @@ public:
//! @param value The value which will be used to copy construct the new content. //! @param value The value which will be used to copy construct the new content.
//! //!
//! @par Throws //! @par Throws
//! If T's copy constructor or copy assignment throws. //! @li If T's copy constructor or copy assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Linear O(N). //! Linear O(N).
@@ -744,7 +769,8 @@ public:
//! @param args The arguments of the constructor of the new element which will be created at the end of the container. //! @param args The arguments of the constructor of the new element which will be created at the end of the container.
//! //!
//! @par Throws //! @par Throws
//! If in-place constructor throws or T's move constructor throws. //! @li If in-place constructor throws or T's move constructor throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
@@ -762,7 +788,8 @@ public:
//! @param args The arguments of the constructor of the new element. //! @param args The arguments of the constructor of the new element.
//! //!
//! @par Throws //! @par Throws
//! If in-place constructor throws or if T's move constructor or move assignment throws. //! @li If in-place constructor throws or if T's move constructor or move assignment throws.
//! @li If \c throw_on_overflow<true> option is set and the container runs out of capacity.
//! //!
//! @par Complexity //! @par Complexity
//! Constant or linear. //! Constant or linear.
@@ -820,11 +847,11 @@ public:
//! from the beginning of the container. //! from the beginning of the container.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
reference operator[](size_type i); reference operator[](size_type i) BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre <tt>i < size()</tt> //! @pre <tt>i < size()</tt>
//! //!
@@ -836,11 +863,11 @@ public:
//! from the beginning of the container. //! from the beginning of the container.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
const_reference operator[](size_type i) const; const_reference operator[](size_type i) const BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre <tt>i =< size()</tt> //! @pre <tt>i =< size()</tt>
//! //!
@@ -851,11 +878,11 @@ public:
//! @return a iterator to the i-th element. //! @return a iterator to the i-th element.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
iterator nth(size_type i); iterator nth(size_type i) BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre <tt>i =< size()</tt> //! @pre <tt>i =< size()</tt>
//! //!
@@ -870,7 +897,7 @@ public:
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
const_iterator nth(size_type i) const; const_iterator nth(size_type i) const BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre <tt>begin() <= p <= end()</tt> //! @pre <tt>begin() <= p <= end()</tt>
//! //!
@@ -881,11 +908,11 @@ public:
//! @return The index of the element pointed by p. //! @return The index of the element pointed by p.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
size_type index_of(iterator p); size_type index_of(iterator p) BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre <tt>begin() <= p <= end()</tt> //! @pre <tt>begin() <= p <= end()</tt>
//! //!
@@ -896,11 +923,11 @@ public:
//! @return a const_iterator to the i-th element. //! @return a const_iterator to the i-th element.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
size_type index_of(const_iterator p) const; size_type index_of(const_iterator p) const BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre \c !empty() //! @pre \c !empty()
//! //!
@@ -910,11 +937,11 @@ public:
//! from the beginning of the container. //! from the beginning of the container.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
reference front(); reference front() BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre \c !empty() //! @pre \c !empty()
//! //!
@@ -924,11 +951,11 @@ public:
//! from the beginning of the container. //! from the beginning of the container.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
const_reference front() const; const_reference front() const BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre \c !empty() //! @pre \c !empty()
//! //!
@@ -938,11 +965,11 @@ public:
//! from the beginning of the container. //! from the beginning of the container.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
reference back(); reference back() BOOST_NOEXCEPT_OR_NOTHROW;
//! @pre \c !empty() //! @pre \c !empty()
//! //!
@@ -952,11 +979,11 @@ public:
//! from the beginning of the container. //! from the beginning of the container.
//! //!
//! @par Throws //! @par Throws
//! Nothing by default. //! Nothing.
//! //!
//! @par Complexity //! @par Complexity
//! Constant O(1). //! Constant O(1).
const_reference back() const; const_reference back() const BOOST_NOEXCEPT_OR_NOTHROW;
//! @brief Pointer such that <tt>[data(), data() + size())</tt> is a valid range. //! @brief Pointer such that <tt>[data(), data() + size())</tt> is a valid range.
//! For a non-empty vector <tt>data() == &front()</tt>. //! For a non-empty vector <tt>data() == &front()</tt>.