3#define TARRAY_FOREACH( vecName, iteratorName ) \
4 for ( auto iteratorName = vecName.Begin(); !iteratorName.IsOver(); iteratorName++ )
6#define TARRAY_FOREACH_BACK( vecName, iteratorName ) \
7 for ( auto iteratorName = vecName.Tail(); !iteratorName.IsOver(); iteratorName-- )
30 m_poArray = other.m_poArray;
37 m_poArray = &a_poArray;
43 m_poArray = &a_poArray;
51 void Push(
const T& element )
54 m_poArray->Push( element );
61 TASSERT( m_iIndex < m_poArray->m_iNumElements );
62 return &m_poArray->m_pData[ m_iIndex ];
69 TASSERT( m_iIndex < m_poArray->m_iNumElements );
70 return m_poArray->m_pData[ m_iIndex ];
75 return ( m_iIndex >= m_poArray->Size() || m_iIndex == -1 );
82 TASSERT( m_iIndex < m_poArray->m_iNumElements );
83 return m_poArray->m_pData[ m_iIndex ];
88 return ( m_iIndex == a_rIt.m_iIndex ) && ( m_poArray == a_rIt.m_poArray );
119 return Iterator( m_iIndex + a_iValue, m_poArray );
124 return Iterator( m_iIndex - a_iValue, m_poArray );
135 m_iGrowSize = a_iGrowSize;
136 m_iNumAllocElements = a_iSize;
139 if ( m_iNumAllocElements > 0 )
160 if ( a_iNewSize != 0 )
163 size_t uiCopySize =
TMath::Min( m_iNumElements, a_iNewSize );
167 m_iNumAllocElements = a_iNewSize;
168 TASSERT( m_iNumElements <= m_iNumAllocElements );
170 if ( m_pData )
TFree( m_pData );
171 m_pData = pNewBuffer;
175 if ( m_pData )
TFree( m_pData );
177 m_iNumAllocElements = 0;
184 if ( m_iNumAllocElements < 0 )
192 m_iNumAllocElements = 0;
200 return Iterator( ( m_iNumElements == 0 ) ? -1 : 0, *
this );
205 return Iterator( ( m_iNumElements == 0 ) ? -1 : m_iNumElements - 1, *
this );
215 return m_iNumElements;
220 m_iNumElements = a_iSize;
225 return m_iNumAllocElements;
235 m_iGrowSize = a_iGrowSize;
238 T*
Push(
const T& element = T() )
241 return TConstruct( &m_pData[ m_iNumElements++ ], element );
244 template <
class... Args>
248 return TConstruct( &m_pData[ m_iNumElements++ ], std::forward<Args>( args )... );
253 TASSERT( m_iNumElements >= 1 );
254 return m_pData[ --m_iNumElements ];
260 TASSERT( a_iIndex < m_iNumElements );
261 return m_pData[ a_iIndex ];
267 TASSERT( a_iIndex < m_iNumElements );
268 return m_pData[ a_iIndex ];
272 void GrowBy(
TINT a_iGrowBy )
274 if ( m_iNumAllocElements < m_iNumElements + a_iGrowBy )
278 auto iNewSize =
TMath::Max( m_iNumAllocElements + m_iGrowSize, m_iNumElements + a_iGrowBy );
286 TINT m_iNumAllocElements;
void * TMemalign(TSIZE a_uiAlignment, TSIZE a_uiSize, Toshi::TMemory::MemBlock *a_pMemBlock)
Allocates aligned memory from a specific memory block.
void TFree(void *a_pMem)
Frees previously allocated memory.
TFORCEINLINE T * TConstruct(T *a_pMemory, Args &&... args)
Constructs an object in place.
#define TSTATICCAST(POINTERTYPE, VALUE)
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
TFORCEINLINE const T & Max(const T &a, const T &b)
TFORCEINLINE const T & Min(const T &a, const T &b)
void SetGrowSize(TINT a_iGrowSize)
T * EmplaceBack(Args &&... args)
void Resize(TINT a_iNewSize)
T * Push(const T &element=T())
TINT SizeAllocated() const
T & operator[](TINT a_iIndex)
const T & operator[](TINT a_iIndex) const
TGenericArray(TINT a_iGrowSize, TINT a_iSize)
void SetSize(TINT a_iSize)
Iterator(Storage &a_poArray)
void Push(const T &element)
Iterator operator++(TINT)
Iterator(const Iterator &other)
TBOOL operator==(const Iterator &a_rIt) const
Iterator(TINT a_iIndex, Storage &a_poArray)
Iterator operator+(TINT a_iValue) const
Iterator operator--(TINT)
Iterator operator-(TINT a_iValue) const
TArray(TINT a_iGrowSize=10, TINT a_iSize=0)
static void * MemCopy(void *dst, const void *src, TSIZE size)