6#include "Stroika/Foundation/Math/Common.h"
8namespace Stroika::Foundation::Containers::Support::ReserveTweaks {
15 constexpr inline size_t GetScaledUpCapacity (
size_t targetSize, [[maybe_unused]]
size_t eltSizeInBytes,
size_t minChunk)
17 Require (minChunk > 0u);
35 size_t capacity{targetSize};
37 if (capacity <= 2 * minChunk) [[likely]] {
40 else if (capacity <= 5 * minChunk) {
45 capacity = (capacity * 6) / 5;
48 capacity = Math::RoundUpTo (capacity, minChunk);
49 Ensure (capacity >= targetSize);
58 template <
typename CONTAINER>
59 constexpr inline optional<size_t> GetScaledUpCapacity4AddN (
const CONTAINER& c,
size_t addN,
size_t minChunk)
61 size_t targetSize{c.size () + addN};
62 size_t capacity{c.capacity ()};
63 if (targetSize >= capacity) [[unlikely]] {
64 return GetScaledUpCapacity (targetSize,
sizeof (
typename CONTAINER::value_type), minChunk);
74 template <
typename CONTAINER>
75 inline void Reserve4AddN (CONTAINER& c,
size_t n,
size_t minChunk)
77 if (
auto newCapacity = GetScaledUpCapacity4AddN (c, n, minChunk)) [[unlikely]] {
78 c.reserve (*newCapacity);
87 template <
typename CONTAINER>
88 inline void Reserve4Add1 (CONTAINER& c,
size_t minChunk)
90 Reserve4AddN (c, 1, minChunk);