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