diff options
author | Abseil Team <absl-team@google.com> | 2019-04-05T16·05-0700 |
---|---|---|
committer | Jon Cohen <cohenjon@google.com> | 2019-04-05T16·06-0400 |
commit | 6cc6ac44e065b9e8975fadfd6ccb99cbcf89aac4 (patch) | |
tree | 9ed2f64fd1802dde559528d259c1b9caaead4e28 /absl/container/internal | |
parent | 666fc1266bccfd8e6eaaa084e7b42580bb8eb199 (diff) |
Export of internal Abseil changes.
-- 4a7dc9bd72a50f493671ea3ae2a571462cb70fc4 by Jon Cohen <cohenjon@google.com>: Use -ignore instead of /ignore. CMake was interpreting /ignore as a path and changing it it \ignore in windows builds, expecting it to be some sort of file. Close #293 PiperOrigin-RevId: 242134552 -- 8de3e403667f677859584bb321ef8fce3253af18 by CJ Johnson <johnsoncj@google.com>: In InlinedVector: Migrates `Rep` to `Data` getting rid of the `Allocation` class. PiperOrigin-RevId: 242130255 GitOrigin-RevId: 4a7dc9bd72a50f493671ea3ae2a571462cb70fc4 Change-Id: Ic7ff4c572bba7a411155bf304b9cae10d68599db
Diffstat (limited to 'absl/container/internal')
-rw-r--r-- | absl/container/internal/inlined_vector.h | 95 |
1 files changed, 38 insertions, 57 deletions
diff --git a/absl/container/internal/inlined_vector.h b/absl/container/internal/inlined_vector.h index 7aa05b6a9974..168d5b4e1d34 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 |