Plasma Engine  2.0
Loading...
Searching...
No Matches
DynamicArray.h
1#pragma once
2
3#include <Foundation/Containers/ArrayBase.h>
4#include <Foundation/Memory/AllocatorWrapper.h>
5#include <Foundation/Types/PointerWithFlags.h>
6
12template <typename T>
13class plDynamicArrayBase : public plArrayBase<T, plDynamicArrayBase<T>>
14{
15protected:
17 explicit plDynamicArrayBase(plAllocator* pAllocator); // [tested]
18
19 plDynamicArrayBase(T* pInplaceStorage, plUInt32 uiCapacity, plAllocator* pAllocator); // [tested]
20
22 plDynamicArrayBase(const plDynamicArrayBase<T>& other, plAllocator* pAllocator); // [tested]
23
25 plDynamicArrayBase(plDynamicArrayBase<T>&& other, plAllocator* pAllocator); // [tested]
26
28 plDynamicArrayBase(const plArrayPtr<const T>& other, plAllocator* pAllocator); // [tested]
29
31 ~plDynamicArrayBase(); // [tested]
32
34 void operator=(const plDynamicArrayBase<T>& rhs); // [tested]
35
37 void operator=(plDynamicArrayBase<T>&& rhs) noexcept; // [tested]
38
39 T* GetElementsPtr();
40 const T* GetElementsPtr() const;
41
42 friend class plArrayBase<T, plDynamicArrayBase<T>>;
43
44public:
46 void Reserve(plUInt32 uiCapacity); // [tested]
47
50 void Compact(); // [tested]
51
53 plAllocator* GetAllocator() const { return const_cast<plAllocator*>(m_pAllocator.GetPtr()); }
54
56 plUInt64 GetHeapMemoryUsage() const; // [tested]
57
59 void Swap(plDynamicArrayBase<T>& other); // [tested]
60
61private:
62 enum Storage
63 {
64 Owned = 0,
65 External = 1
66 };
67
69
70 enum
71 {
72 CAPACITY_ALIGNMENT = 16
73 };
74
75 void SetCapacity(plUInt32 uiCapacity);
76};
77
79template <typename T, typename AllocatorWrapper = plDefaultAllocatorWrapper>
81{
82public:
83 PL_DECLARE_MEM_RELOCATABLE_TYPE();
84
85
87 explicit plDynamicArray(plAllocator* pAllocator);
88
91 explicit plDynamicArray(const plArrayPtr<const T>& other);
92
95
96 void operator=(const plDynamicArray<T, AllocatorWrapper>& rhs);
97 void operator=(const plDynamicArrayBase<T>& rhs);
98 void operator=(const plArrayPtr<const T>& rhs);
99
100 void operator=(plDynamicArray<T, AllocatorWrapper>&& rhs) noexcept;
101 void operator=(plDynamicArrayBase<T>&& rhs) noexcept;
102
103protected:
104 plDynamicArray(T* pInplaceStorage, plUInt32 uiCapacity, plAllocator* pAllocator)
105 : plDynamicArrayBase<T>(pInplaceStorage, uiCapacity, pAllocator)
106 {
107 }
108};
109
111template <typename T, typename AllocatorWrapper>
113
115template <typename T, typename AllocatorWrapper>
116plArrayPtr<const T> plMakeArrayPtr(const plDynamicArray<T, AllocatorWrapper>& dynArray);
117
119template <typename T, typename AllocatorWrapper>
120plArrayPtr<T> plMakeArrayPtr(plDynamicArray<T, AllocatorWrapper>& in_dynArray);
121
122
123static_assert(plGetTypeClass<plDynamicArray<int>>::value == 2, "dynamic array is not memory relocatable");
124
125#include <Foundation/Containers/Implementation/DynamicArray_inl.h>
Base class for all memory allocators.
Definition Allocator.h:23
Base class for all array containers. Implements all the basic functionality that only requires a poin...
Definition ArrayBase.h:19
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
Implementation of a dynamically growing array.
Definition DynamicArray.h:14
~plDynamicArrayBase()
Destructor.
Definition DynamicArray_inl.h:39
plAllocator * GetAllocator() const
Returns the allocator that is used by this instance.
Definition DynamicArray.h:53
void Swap(plDynamicArrayBase< T > &other)
swaps the contents of this array with another one
Definition DynamicArray_inl.h:100
plUInt64 GetHeapMemoryUsage() const
Returns the amount of bytes that are currently allocated on the heap.
Definition DynamicArray_inl.h:234
plDynamicArrayBase(plAllocator *pAllocator)
Creates an empty array. Does not allocate any data yet.
Definition DynamicArray_inl.h:3
void Compact()
Tries to compact the array to avoid wasting memory. The resulting capacity is at least 'GetCount' (no...
Definition DynamicArray_inl.h:202
void Reserve(plUInt32 uiCapacity)
Expands the array so it can at least store the given capacity.
Definition DynamicArray_inl.h:179
void operator=(const plDynamicArrayBase< T > &rhs)
Copies the data from some other contiguous array into this one.
Definition DynamicArray_inl.h:54
Definition DynamicArray.h:81
A wrapper around a raw pointer that allows to use the lower N bits for flags.
Definition PointerWithFlags.h:12
const PtrType * GetPtr() const
Returns the masked off pointer value.
Definition PointerWithFlags.h:41
If there is an % operator which takes a plTypeIsMemRelocatable and returns a CompileTimeTrueType T is...
Definition TypeTraits.h:67