flat_buffer shrink_to_fit never throws

fixes #1831
closes #1835
This commit is contained in:
Richard Hodges
2020-02-04 12:35:31 +01:00
parent 7701bf8738
commit 8a90ec0e3b
3 changed files with 23 additions and 7 deletions

View File

@ -1,5 +1,6 @@
Version XXX:
* flat_buffer shrink_to_fit is noexcept
* moved-from dynamic buffers do not clear if different allocator
* fix erase field

View File

@ -358,17 +358,17 @@ public:
void
reserve(std::size_t n);
/** Reallocate the buffer to fit the readable bytes exactly.
/** Request the removal of unused capacity.
Buffer sequences previously obtained using @ref data or
@ref prepare become invalid.
This function attempts to reduce @ref capacity()
to @ref size(), which may not succeed.
@esafe
Strong guarantee.
No-throw guarantee.
*/
void
shrink_to_fit();
shrink_to_fit() noexcept;
/** Set the size of the readable and writable bytes to zero.

View File

@ -260,17 +260,32 @@ reserve(std::size_t n)
template<class Allocator>
void
basic_flat_buffer<Allocator>::
shrink_to_fit()
shrink_to_fit() noexcept
{
auto const len = size();
if(len == capacity())
return;
char* p;
if(len > 0)
{
BOOST_ASSERT(begin_);
BOOST_ASSERT(in_);
p = alloc(len);
#ifndef BOOST_NO_EXCEPTIONS
try
{
#endif
p = alloc(len);
#ifndef BOOST_NO_EXCEPTIONS
}
catch(std::exception const&)
{
// request could not be fulfilled,
// squelch the exception
return;
}
#endif
std::memcpy(p, in_, len);
}
else