summaryrefslogtreecommitdiff
path: root/absl/container/internal
diff options
context:
space:
mode:
Diffstat (limited to 'absl/container/internal')
-rw-r--r--absl/container/internal/inlined_vector.h95
1 files changed, 38 insertions, 57 deletions
diff --git a/absl/container/internal/inlined_vector.h b/absl/container/internal/inlined_vector.h
index 7aa05b6a..168d5b4e 100644
--- a/absl/container/internal/inlined_vector.h
+++ b/absl/container/internal/inlined_vector.h
@@ -33,8 +33,6 @@ template <template <typename, size_t, typename> class InlinedVector, typename T,
size_t N, typename A>
class Storage<InlinedVector<T, N, A>> {
public:
- class Allocation; // TODO(johnsoncj): Remove after migration
-
using allocator_type = A;
using value_type = typename allocator_type::value_type;
using pointer = typename allocator_type::pointer;
@@ -48,6 +46,7 @@ class Storage<InlinedVector<T, N, A>> {
using const_iterator = const_pointer;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+ using AllocatorTraits = std::allocator_traits<allocator_type>;
explicit Storage(const allocator_type& alloc)
: metadata_(alloc, /* empty and inlined */ 0) {}
@@ -56,30 +55,25 @@ class Storage<InlinedVector<T, N, A>> {
bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; }
- Allocation& GetAllocation() {
- return reinterpret_cast<Allocation&>(rep_.allocation_storage.allocation);
- }
-
- const Allocation& GetAllocation() const {
- return reinterpret_cast<const Allocation&>(
- rep_.allocation_storage.allocation);
- }
-
pointer GetInlinedData() {
return reinterpret_cast<pointer>(
- std::addressof(rep_.inlined_storage.inlined[0]));
+ std::addressof(data_.inlined.inlined_data[0]));
}
const_pointer GetInlinedData() const {
return reinterpret_cast<const_pointer>(
- std::addressof(rep_.inlined_storage.inlined[0]));
+ std::addressof(data_.inlined.inlined_data[0]));
}
- pointer GetAllocatedData() { return GetAllocation().buffer(); }
+ pointer GetAllocatedData() { return data_.allocated.allocated_data; }
- const_pointer GetAllocatedData() const { return GetAllocation().buffer(); }
+ const_pointer GetAllocatedData() const {
+ return data_.allocated.allocated_data;
+ }
- size_type GetAllocatedCapacity() const { return GetAllocation().capacity(); }
+ size_type GetAllocatedCapacity() const {
+ return data_.allocated.allocated_capacity;
+ }
allocator_type& GetAllocator() { return metadata_.template get<0>(); }
@@ -95,34 +89,23 @@ class Storage<InlinedVector<T, N, A>> {
void AddSize(size_type count) { GetSizeAndIsAllocated() += count << 1; }
- void InitAllocation(const Allocation& allocation) {
- new (static_cast<void*>(std::addressof(rep_.allocation_storage.allocation)))
- Allocation(allocation);
+ void SetAllocatedData(pointer data) {
+ data_.allocated.allocated_data = data;
+ }
+
+ void SetAllocatedCapacity(size_type capacity) {
+ data_.allocated.allocated_capacity = capacity;
}
- void SwapSizeAndIsAllocated(Storage& other) {
+ void SwapSizeAndIsAllocated(Storage* other) {
using std::swap;
- swap(GetSizeAndIsAllocated(), other.GetSizeAndIsAllocated());
+ swap(GetSizeAndIsAllocated(), other->GetSizeAndIsAllocated());
}
- // TODO(johnsoncj): Make the below types private after migration
- class Allocation {
- size_type capacity_;
- pointer buffer_;
-
- public:
- Allocation(allocator_type& a, size_type capacity)
- : capacity_(capacity), buffer_(Create(a, capacity)) {}
- void Dealloc(allocator_type& a) {
- std::allocator_traits<allocator_type>::deallocate(a, buffer_, capacity_);
- }
- size_type capacity() const { return capacity_; }
- const_pointer buffer() const { return buffer_; }
- pointer buffer() { return buffer_; }
- static pointer Create(allocator_type& a, size_type n) {
- return std::allocator_traits<allocator_type>::allocate(a, n);
- }
- };
+ void SwapAllocatedSizeAndCapacity(Storage* other) {
+ using std::swap;
+ swap(data_.allocated, other->data_.allocated);
+ }
private:
size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
@@ -131,29 +114,27 @@ class Storage<InlinedVector<T, N, A>> {
return metadata_.template get<1>();
}
- // Stores either the inlined or allocated representation
- union Rep {
- using ValueTypeBuffer =
- absl::aligned_storage_t<sizeof(value_type), alignof(value_type)>;
- using AllocationBuffer =
- absl::aligned_storage_t<sizeof(Allocation), alignof(Allocation)>;
+ using Metadata =
+ container_internal::CompressedTuple<allocator_type, size_type>;
- // Structs wrap the buffers to perform indirection that solves a bizarre
- // compilation error on Visual Studio (all known versions).
- struct InlinedRep {
- ValueTypeBuffer inlined[N];
- };
+ struct Allocated {
+ pointer allocated_data;
+ size_type allocated_capacity;
+ };
- struct AllocatedRep {
- AllocationBuffer allocation;
- };
+ struct Inlined {
+ using InlinedDataElement =
+ absl::aligned_storage_t<sizeof(value_type), alignof(value_type)>;
+ InlinedDataElement inlined_data[N];
+ };
- InlinedRep inlined_storage;
- AllocatedRep allocation_storage;
+ union Data {
+ Allocated allocated;
+ Inlined inlined;
};
- container_internal::CompressedTuple<allocator_type, size_type> metadata_;
- Rep rep_;
+ Metadata metadata_;
+ Data data_;
};
} // namespace inlined_vector_internal