![]() |
XII Release 0.1.0
|
A hybrid array uses in-place storage to handle the first few elements without any allocation. It dynamically resizes when more elements are needed. More...
#include <HybridArray.h>
Classes | |
struct | alignas |
The fixed size array. More... | |
Public Member Functions | |
xiiHybridArray () | |
Creates an empty array. Does not allocate any data yet. | |
xiiHybridArray (xiiAllocatorBase *pAllocator) | |
Creates an empty array. Does not allocate any data yet. | |
xiiHybridArray (const xiiHybridArray< T, Size, AllocatorWrapper > &other) | |
Creates a copy of the given array. | |
xiiHybridArray (const xiiArrayPtr< const T > &other) | |
Creates a copy of the given array. | |
xiiHybridArray (xiiHybridArray< T, Size, AllocatorWrapper > &&other) noexcept | |
Moves the given array. | |
void | operator= (const xiiHybridArray< T, Size, AllocatorWrapper > &rhs) |
Copies the data from some other contiguous array into this one. | |
void | operator= (const xiiArrayPtr< const T > &rhs) |
Copies the data from some other contiguous array into this one. | |
void | operator= (xiiHybridArray< T, Size, AllocatorWrapper > &&rhs) noexcept |
Moves the data from some other contiguous array into this one. | |
![]() | |
XII_DECLARE_MEM_RELOCATABLE_TYPE () | |
xiiDynamicArray (xiiAllocatorBase *pAllocator) | |
xiiDynamicArray (const xiiDynamicArray< T, xiiDefaultAllocatorWrapper > &other) | |
xiiDynamicArray (const xiiDynamicArrayBase< T > &other) | |
xiiDynamicArray (const xiiArrayPtr< const T > &other) | |
xiiDynamicArray (xiiDynamicArray< T, xiiDefaultAllocatorWrapper > &&other) | |
xiiDynamicArray (xiiDynamicArrayBase< T > &&other) | |
void | operator= (const xiiDynamicArray< T, xiiDefaultAllocatorWrapper > &rhs) |
void | operator= (const xiiDynamicArrayBase< T > &rhs) |
void | operator= (const xiiArrayPtr< const T > &rhs) |
void | operator= (xiiDynamicArray< T, xiiDefaultAllocatorWrapper > &&rhs) noexcept |
void | operator= (xiiDynamicArrayBase< T > &&rhs) noexcept |
![]() | |
void | Reserve (xiiUInt32 uiCapacity) |
Expands the array so it can at least store the given capacity. | |
void | Compact () |
Tries to compact the array to avoid wasting memory. The resulting capacity is at least 'GetCount' (no elements get removed). Will deallocate all data, if the array is empty. | |
xiiAllocatorBase * | GetAllocator () const |
Returns the allocator that is used by this instance. | |
xiiUInt64 | GetHeapMemoryUsage () const |
Returns the amount of bytes that are currently allocated on the heap. | |
void | Swap (xiiDynamicArrayBase< T > &other) |
swaps the contents of this array with another one | |
![]() | |
xiiArrayBase () | |
Constructor. | |
~xiiArrayBase () | |
Destructor. | |
void | operator= (const xiiArrayPtr< const T > &rhs) |
Copies the data from some other contiguous array into this one. | |
operator xiiArrayPtr< const T > () const | |
Conversion to const xiiArrayPtr. | |
operator xiiArrayPtr< T > () | |
Conversion to xiiArrayPtr. | |
bool | operator== (const xiiArrayBase< T, xiiDynamicArrayBase< T > > &rhs) const |
Compares this array to another contiguous array type. | |
bool | operator< (const xiiArrayBase< T, xiiDynamicArrayBase< T > > &rhs) const |
Compares this array to another contiguous array type. | |
bool | operator< (const xiiArrayPtr< const T > &rhs) const |
Compares this array to another contiguous array type. | |
const T & | operator[] (xiiUInt32 uiIndex) const |
Returns the element at the given index. Does bounds checks in debug builds. | |
T & | operator[] (xiiUInt32 uiIndex) |
Returns the element at the given index. Does bounds checks in debug builds. | |
void | SetCount (xiiUInt32 uiCount) |
Resizes the array to have exactly uiCount elements. Default constructs extra elements if the array is grown. | |
void | SetCount (xiiUInt32 uiCount, const T &fillValue) |
Resizes the array to have exactly uiCount elements. Constructs all new elements by copying the FillValue. | |
void | SetCountUninitialized (xiiUInt32 uiCount) |
Resizes the array to have exactly uiCount elements. Extra elements might be uninitialized. | |
void | EnsureCount (xiiUInt32 uiCount) |
Ensures the container has at least uiCount elements. Ie. calls SetCount() if the container has fewer elements, does nothing otherwise. | |
xiiUInt32 | GetCount () const |
Returns the number of active elements in the array. | |
bool | IsEmpty () const |
Returns true, if the array does not contain any elements. | |
void | Clear () |
Clears the array. | |
bool | Contains (const T &value) const |
Checks whether the given value can be found in the array. O(n) complexity. | |
void | InsertAt (xiiUInt32 uiIndex, const T &value) |
Inserts value at index by shifting all following elements. | |
void | InsertAt (xiiUInt32 uiIndex, T &&value) |
Inserts value at index by shifting all following elements. | |
void | InsertRange (const xiiArrayPtr< const T > &range, xiiUInt32 uiIndex) |
Inserts all elements in the range starting at the given index, shifting the elements after the index. | |
bool | RemoveAndCopy (const T &value) |
Removes the first occurrence of value and fills the gap by shifting all following elements. | |
bool | RemoveAndSwap (const T &value) |
Removes the first occurrence of value and fills the gap by swapping in the last element. | |
void | RemoveAtAndCopy (xiiUInt32 uiIndex, xiiUInt32 uiNumElements=1) |
Removes the element at index and fills the gap by shifting all following elements. | |
void | RemoveAtAndSwap (xiiUInt32 uiIndex, xiiUInt32 uiNumElements=1) |
Removes the element at index and fills the gap by swapping in the last element. | |
xiiUInt32 | IndexOf (const T &value, xiiUInt32 uiStartIndex=0) const |
Searches for the first occurrence of the given value and returns its index or xiiInvalidIndex if not found. | |
xiiUInt32 | LastIndexOf (const T &value, xiiUInt32 uiStartIndex=xiiInvalidIndex) const |
Searches for the last occurrence of the given value and returns its index or xiiInvalidIndex if not found. | |
T & | ExpandAndGetRef () |
Grows the array by one element and returns a reference to the newly created element. | |
T * | ExpandBy (xiiUInt32 uiNumNewItems) |
Expands the array by N new items and returns a pointer to the first new one. | |
void | PushBack (const T &value) |
Pushes value at the end of the array. | |
void | PushBack (T &&value) |
Pushes value at the end of the array. | |
void | PushBackUnchecked (const T &value) |
Pushes value at the end of the array. Does NOT ensure capacity. | |
void | PushBackUnchecked (T &&value) |
Pushes value at the end of the array. Does NOT ensure capacity. | |
void | PushBackRange (const xiiArrayPtr< const T > &range) |
Pushes all elements in range at the end of the array. Increases the capacity if necessary. | |
void | PopBack (xiiUInt32 uiCountToRemove=1) |
Removes count elements from the end of the array. | |
T & | PeekBack () |
Returns the last element of the array. | |
const T & | PeekBack () const |
Returns the last element of the array. | |
void | Sort (const Comparer &comparer) |
Sort with explicit comparer. | |
void | Sort () |
Sort with default comparer. | |
T * | GetData () |
Returns a pointer to the array data, or nullptr if the array is empty. | |
const T * | GetData () const |
Returns a pointer to the array data, or nullptr if the array is empty. | |
xiiArrayPtr< T > | GetArrayPtr () |
Returns an array pointer to the array data, or an empty array pointer if the array is empty. | |
xiiArrayPtr< const T > | GetArrayPtr () const |
Returns an array pointer to the array data, or an empty array pointer if the array is empty. | |
xiiArrayPtr< typename xiiArrayPtr< T >::ByteType > | GetByteArrayPtr () |
Returns a byte array pointer to the array data, or an empty array pointer if the array is empty. | |
xiiArrayPtr< typename xiiArrayPtr< const T >::ByteType > | GetByteArrayPtr () const |
Returns a byte array pointer to the array data, or an empty array pointer if the array is empty. | |
xiiUInt32 | GetCapacity () const |
Returns the reserved number of elements that the array can hold without reallocating. | |
Protected Member Functions | |
XII_ALWAYS_INLINE T * | GetStaticArray () |
XII_ALWAYS_INLINE const T * | GetStaticArray () const |
![]() | |
xiiDynamicArray (T *pInplaceStorage, xiiUInt32 uiCapacity, xiiAllocatorBase *pAllocator) | |
![]() | |
xiiDynamicArrayBase (xiiAllocatorBase *pAllocator) | |
Creates an empty array. Does not allocate any data yet. | |
xiiDynamicArrayBase (T *pInplaceStorage, xiiUInt32 uiCapacity, xiiAllocatorBase *pAllocator) | |
xiiDynamicArrayBase (const xiiDynamicArrayBase< T > &other, xiiAllocatorBase *pAllocator) | |
Creates a copy of the given array. | |
xiiDynamicArrayBase (xiiDynamicArrayBase< T > &&other, xiiAllocatorBase *pAllocator) | |
Moves the given array into this one. | |
xiiDynamicArrayBase (const xiiArrayPtr< const T > &other, xiiAllocatorBase *pAllocator) | |
Creates a copy of the given array. | |
~xiiDynamicArrayBase () | |
Destructor. | |
void | operator= (const xiiDynamicArrayBase< T > &rhs) |
Copies the data from some other contiguous array into this one. | |
void | operator= (xiiDynamicArrayBase< T > &&rhs) noexcept |
Moves the data from some other contiguous array into this one. | |
T * | GetElementsPtr () |
const T * | GetElementsPtr () const |
![]() | |
void | DoSwap (xiiArrayBase< T, xiiDynamicArrayBase< T > > &other) |
Additional Inherited Members | |
![]() | |
using | const_iterator |
using | const_reverse_iterator |
using | iterator |
using | reverse_iterator |
![]() | |
T * | m_pElements |
Element-type access to m_Data. | |
xiiUInt32 | m_uiCount |
The number of elements used from the array. | |
xiiUInt32 | m_uiCapacity |
The number of elements which can be stored in the array without re-allocating. | |
A hybrid array uses in-place storage to handle the first few elements without any allocation. It dynamically resizes when more elements are needed.
It is often more efficient to use a hybrid array, rather than a dynamic array, when the number of needed elements is typically low or when the array is used only temporarily. In this case costly allocations can often be prevented entirely. However, if the number of elements is unpredictable or usually very large, prefer a dynamic array, to avoid wasting (stack) memory for a hybrid array that is rarely large enough to be used. The xiiHybridArray is derived from xiiDynamicArray and can therefore be passed to functions that expect a xiiDynamicArray, even for output.