diff --git a/include/boost/container/detail/utilities.hpp b/include/boost/container/detail/utilities.hpp index c42087c..8aa020a 100644 --- a/include/boost/container/detail/utilities.hpp +++ b/include/boost/container/detail/utilities.hpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -115,18 +116,21 @@ SizeType ,const SizeType capacity ,const SizeType n) { -// if (n > max_size - capacity) -// throw std::length_error("get_next_capacity"); + const SizeType remaining = max_size - capacity; + if ( remaining < n ) + boost::container::throw_length_error("get_next_capacity, allocator's max_size reached"); + const SizeType additional = max_value(n, capacity); + return ( remaining < additional ) ? max_size : ( capacity + additional ); + #if 0 //Alternative for 50% grow + const SizeType m3 = max_size/3; - const SizeType m3 = max_size/3; + if (capacity < m3) + return capacity + max_value(3*(capacity+1)/5, n); - if (capacity < m3) - return capacity + max_value(3*(capacity+1)/5, n); - - if (capacity < m3*2) - return capacity + max_value((capacity+1)/2, n); - - return max_size; + if (capacity < m3*2) + return capacity + max_value((capacity+1)/2, n); + return max_size; + #endif } template