Commit 0f718c56 by Abseil Team Committed by Copybara-Service

Add support for stateful allocators to absl::FixedArray.

PiperOrigin-RevId: 535534819
Change-Id: Iccf8da3e0b084131e4c0dba205f3e190d3a66f4e
parent 88cc63ef
...@@ -117,14 +117,20 @@ class FixedArray { ...@@ -117,14 +117,20 @@ class FixedArray {
(N == kFixedArrayUseDefault ? kInlineBytesDefault / sizeof(value_type) (N == kFixedArrayUseDefault ? kInlineBytesDefault / sizeof(value_type)
: static_cast<size_type>(N)); : static_cast<size_type>(N));
FixedArray( FixedArray(const FixedArray& other) noexcept(NoexceptCopyable())
const FixedArray& other, : FixedArray(other,
const allocator_type& a = allocator_type()) noexcept(NoexceptCopyable()) AllocatorTraits::select_on_container_copy_construction(
other.storage_.alloc())) {}
FixedArray(const FixedArray& other,
const allocator_type& a) noexcept(NoexceptCopyable())
: FixedArray(other.begin(), other.end(), a) {} : FixedArray(other.begin(), other.end(), a) {}
FixedArray( FixedArray(FixedArray&& other) noexcept(NoexceptMovable())
FixedArray&& other, : FixedArray(std::move(other), other.storage_.alloc()) {}
const allocator_type& a = allocator_type()) noexcept(NoexceptMovable())
FixedArray(FixedArray&& other,
const allocator_type& a) noexcept(NoexceptMovable())
: FixedArray(std::make_move_iterator(other.begin()), : FixedArray(std::make_move_iterator(other.begin()),
std::make_move_iterator(other.end()), a) {} std::make_move_iterator(other.end()), a) {}
...@@ -480,6 +486,9 @@ class FixedArray { ...@@ -480,6 +486,9 @@ class FixedArray {
StorageElement* begin() const { return data_; } StorageElement* begin() const { return data_; }
StorageElement* end() const { return begin() + size(); } StorageElement* end() const { return begin() + size(); }
allocator_type& alloc() { return size_alloc_.template get<1>(); } allocator_type& alloc() { return size_alloc_.template get<1>(); }
const allocator_type& alloc() const {
return size_alloc_.template get<1>();
}
private: private:
static bool UsingInlinedStorage(size_type n) { static bool UsingInlinedStorage(size_type n) {
......
...@@ -768,6 +768,22 @@ TEST(AllocatorSupportTest, SizeValAllocConstructor) { ...@@ -768,6 +768,22 @@ TEST(AllocatorSupportTest, SizeValAllocConstructor) {
} }
} }
TEST(AllocatorSupportTest, PropagatesStatefulAllocator) {
constexpr size_t inlined_size = 4;
using Alloc = absl::container_internal::CountingAllocator<int>;
using AllocFxdArr = absl::FixedArray<int, inlined_size, Alloc>;
auto len = inlined_size * 2;
auto val = 0;
int64_t allocated = 0;
AllocFxdArr arr(len, val, Alloc(&allocated));
EXPECT_EQ(allocated, len * sizeof(int));
AllocFxdArr copy = arr;
EXPECT_EQ(allocated, len * sizeof(int) * 2);
}
#ifdef ABSL_HAVE_ADDRESS_SANITIZER #ifdef ABSL_HAVE_ADDRESS_SANITIZER
TEST(FixedArrayTest, AddressSanitizerAnnotations1) { TEST(FixedArrayTest, AddressSanitizerAnnotations1) {
absl::FixedArray<int, 32> a(10); absl::FixedArray<int, 32> a(10);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment