1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost 4 // Software License, Version 1.0. (See accompanying file 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // See http://www.boost.org/libs/container for documentation. 8 // 9 ////////////////////////////////////////////////////////////////////////////// 10 #ifndef BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP 11 #define BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP 12 13 #ifndef BOOST_CONFIG_HPP 14 # include <boost/config.hpp> 15 #endif 16 17 #if defined(BOOST_HAS_PRAGMA_ONCE) 18 # pragma once 19 #endif 20 21 // container 22 #include <boost/container/throw_exception.hpp> 23 // container/detail 24 #include <boost/container/detail/min_max.hpp> 25 26 namespace boost { 27 namespace container { 28 namespace container_detail { 29 30 enum NextCapacityOption { NextCapacityDouble, NextCapacity60Percent }; 31 32 template<class SizeType, NextCapacityOption Option> 33 struct next_capacity_calculator; 34 35 template<class SizeType> 36 struct next_capacity_calculator<SizeType, NextCapacityDouble> 37 { getboost::container::container_detail::next_capacity_calculator38 static SizeType get(const SizeType max_size 39 ,const SizeType capacity 40 ,const SizeType n) 41 { 42 const SizeType remaining = max_size - capacity; 43 if ( remaining < n ) 44 boost::container::throw_length_error("get_next_capacity, allocator's max_size reached"); 45 const SizeType additional = max_value(n, capacity); 46 return ( remaining < additional ) ? max_size : ( capacity + additional ); 47 } 48 }; 49 50 template<class SizeType> 51 struct next_capacity_calculator<SizeType, NextCapacity60Percent> 52 { getboost::container::container_detail::next_capacity_calculator53 static SizeType get(const SizeType max_size 54 ,const SizeType capacity 55 ,const SizeType n) 56 { 57 const SizeType remaining = max_size - capacity; 58 if ( remaining < n ) 59 boost::container::throw_length_error("get_next_capacity, allocator's max_size reached"); 60 const SizeType m3 = max_size/3; 61 62 if (capacity < m3) 63 return capacity + max_value(3*(capacity+1)/5, n); 64 65 if (capacity < m3*2) 66 return capacity + max_value((capacity+1)/2, n); 67 return max_size; 68 } 69 }; 70 71 } //namespace container_detail { 72 } //namespace container { 73 } //namespace boost { 74 75 #endif //#ifndef BOOST_CONTAINER_DETAIL_NEXT_CAPACITY_HPP 76