]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/container/include/boost/container/detail/next_capacity.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / container / include / boost / container / detail / next_capacity.hpp
CommitLineData
7c673cae
FG
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
26namespace boost {
27namespace container {
28namespace container_detail {
29
30enum NextCapacityOption { NextCapacityDouble, NextCapacity60Percent };
31
32template<class SizeType, NextCapacityOption Option>
33struct next_capacity_calculator;
34
35template<class SizeType>
36struct next_capacity_calculator<SizeType, NextCapacityDouble>
37{
38 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
50template<class SizeType>
51struct next_capacity_calculator<SizeType, NextCapacity60Percent>
52{
53 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