//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef TEST_SUPPORT_INCREASING_ALLOCATOR_H #define TEST_SUPPORT_INCREASING_ALLOCATOR_H #include #include #include "test_macros.h" // The increasing_allocator is a custom allocator that enforces an increasing minimum allocation size, // ensuring that it allocates an increasing amount of memory, possibly exceeding the requested amount. // This unique behavior is particularly useful for testing the shrink_to_fit functionality in std::vector, // vector, and std::basic_string, ensuring that shrink_to_fit does not increase the capacity of // the allocated memory. template struct increasing_allocator { using value_type = T; std::size_t min_elements = 1000; increasing_allocator() = default; template TEST_CONSTEXPR_CXX20 increasing_allocator(const increasing_allocator& other) TEST_NOEXCEPT : min_elements(other.min_elements) {} #if TEST_STD_VER >= 23 TEST_CONSTEXPR_CXX23 std::allocation_result allocate_at_least(std::size_t n) { if (n < min_elements) n = min_elements; min_elements += 1000; return std::allocator{}.allocate_at_least(n); } #endif // TEST_STD_VER >= 23 TEST_CONSTEXPR_CXX20 T* allocate(std::size_t n) { return std::allocator().allocate(n); } TEST_CONSTEXPR_CXX20 void deallocate(T* p, std::size_t n) TEST_NOEXCEPT { std::allocator().deallocate(p, n); } }; template TEST_CONSTEXPR_CXX20 bool operator==(increasing_allocator, increasing_allocator) TEST_NOEXCEPT { return true; } #endif // TEST_SUPPORT_INCREASING_ALLOCATOR_H