OpenBarnyard
 
Loading...
Searching...
No Matches
TArray.h
Go to the documentation of this file.
1#pragma once
2
3#define TARRAY_FOREACH( vecName, iteratorName ) \
4 for ( auto iteratorName = vecName.Begin(); !iteratorName.IsOver(); iteratorName++ )
5
6#define TARRAY_FOREACH_BACK( vecName, iteratorName ) \
7 for ( auto iteratorName = vecName.Tail(); !iteratorName.IsOver(); iteratorName-- )
8
10
11template <class T>
13{
14public:
16 {
17 public:
20
21 public:
23 {
24 m_iIndex = 0;
25 m_poArray = TNULL;
26 }
27
28 Iterator( const Iterator& other )
29 {
30 m_poArray = other.m_poArray;
31 m_iIndex = 0;
32 }
33
34 Iterator( Storage& a_poArray )
35 {
36 m_iIndex = 0;
37 m_poArray = &a_poArray;
38 }
39
40 Iterator( TINT a_iIndex, Storage& a_poArray )
41 {
42 m_iIndex = a_iIndex;
43 m_poArray = &a_poArray;
44 }
45
46 TINT Index() const
47 {
48 return m_iIndex;
49 }
50
51 void Push( const T& element )
52 {
53 TASSERT( m_poArray );
54 m_poArray->Push( element );
55 }
56
57 T* operator->() const
58 {
59 TASSERT( m_iIndex >= 0 );
60 TASSERT( m_poArray );
61 TASSERT( m_iIndex < m_poArray->m_iNumElements );
62 return &m_poArray->m_pData[ m_iIndex ];
63 }
64
65 T& Get()
66 {
67 TASSERT( m_iIndex >= 0 );
68 TASSERT( m_poArray );
69 TASSERT( m_iIndex < m_poArray->m_iNumElements );
70 return m_poArray->m_pData[ m_iIndex ];
71 }
72
73 bool IsOver() const
74 {
75 return ( m_iIndex >= m_poArray->Size() || m_iIndex == -1 );
76 }
77
78 const T& Get() const
79 {
80 TASSERT( m_iIndex >= 0 );
81 TASSERT( m_poArray );
82 TASSERT( m_iIndex < m_poArray->m_iNumElements );
83 return m_poArray->m_pData[ m_iIndex ];
84 }
85
86 TBOOL operator==( const Iterator& a_rIt ) const
87 {
88 return ( m_iIndex == a_rIt.m_iIndex ) && ( m_poArray == a_rIt.m_poArray );
89 }
90
92 {
93 m_iIndex++;
94 return *this;
95 }
96
98 {
99 Iterator temp = *this;
100 m_iIndex++;
101 return temp;
102 }
103
105 {
106 m_iIndex--;
107 return *this;
108 }
109
111 {
112 Iterator temp = *this;
113 m_iIndex--;
114 return temp;
115 }
116
117 Iterator operator+( TINT a_iValue ) const
118 {
119 return Iterator( m_iIndex + a_iValue, m_poArray );
120 }
121
122 Iterator operator-( TINT a_iValue ) const
123 {
124 return Iterator( m_iIndex - a_iValue, m_poArray );
125 }
126
127 private:
128 TINT m_iIndex; // 0x0
129 Storage* m_poArray; // 0x4
130 };
131
132public:
133 TGenericArray( TINT a_iGrowSize, TINT a_iSize )
134 {
135 m_iGrowSize = a_iGrowSize;
136 m_iNumAllocElements = a_iSize;
137 m_iNumElements = 0;
138
139 if ( m_iNumAllocElements > 0 )
140 {
141 m_pData = TSTATICCAST( T, TMemalign( m_iNumAllocElements * sizeof( T ), alignof( T ) ) );
142 }
143 else
144 {
145 TASSERT( m_iGrowSize != 0 );
146 m_pData = TNULL;
147 }
148 }
149
151 {
152 if ( m_pData )
153 {
154 TFree( m_pData );
155 }
156 }
157
158 void Resize( TINT a_iNewSize )
159 {
160 if ( a_iNewSize != 0 )
161 {
162 T* pNewBuffer = TSTATICCAST( T, TMemalign( a_iNewSize * sizeof( T ), alignof( T ) ) );
163 size_t uiCopySize = TMath::Min( m_iNumElements, a_iNewSize );
164
165 TUtil::MemCopy( pNewBuffer, m_pData, sizeof( T ) * uiCopySize );
166
167 m_iNumAllocElements = a_iNewSize;
168 TASSERT( m_iNumElements <= m_iNumAllocElements );
169
170 if ( m_pData ) TFree( m_pData );
171 m_pData = pNewBuffer;
172 }
173 else
174 {
175 if ( m_pData ) TFree( m_pData );
176 m_pData = TNULL;
177 m_iNumAllocElements = 0;
178 m_iNumElements = 0;
179 }
180 }
181
182 void Clear()
183 {
184 if ( m_iNumAllocElements < 0 )
185 {
186 if ( m_pData )
187 {
188 TFree( m_pData );
189 m_pData = TNULL;
190 }
191
192 m_iNumAllocElements = 0;
193 }
194
195 m_iNumElements = 0;
196 }
197
199 {
200 return Iterator( ( m_iNumElements == 0 ) ? -1 : 0, *this );
201 }
202
204 {
205 return Iterator( ( m_iNumElements == 0 ) ? -1 : m_iNumElements - 1, *this );
206 }
207
209 {
210 return Iterator( -1, *this );
211 }
212
213 TINT Size() const
214 {
215 return m_iNumElements;
216 }
217
218 void SetSize( TINT a_iSize )
219 {
220 m_iNumElements = a_iSize;
221 }
222
224 {
225 return m_iNumAllocElements;
226 }
227
229 {
230 return m_iGrowSize;
231 }
232
233 void SetGrowSize( TINT a_iGrowSize )
234 {
235 m_iGrowSize = a_iGrowSize;
236 }
237
238 T* Push( const T& element = T() )
239 {
240 GrowBy( 1 );
241 return TConstruct( &m_pData[ m_iNumElements++ ], element );
242 }
243
244 template <class... Args>
245 T* EmplaceBack( Args&&... args )
246 {
247 GrowBy( 1 );
248 return TConstruct( &m_pData[ m_iNumElements++ ], std::forward<Args>( args )... );
249 }
250
251 T& Pop()
252 {
253 TASSERT( m_iNumElements >= 1 );
254 return m_pData[ --m_iNumElements ];
255 }
256
257 T& operator[]( TINT a_iIndex )
258 {
259 TASSERT( a_iIndex >= 0 );
260 TASSERT( a_iIndex < m_iNumElements );
261 return m_pData[ a_iIndex ];
262 }
263
264 const T& operator[]( TINT a_iIndex ) const
265 {
266 TASSERT( a_iIndex >= 0 );
267 TASSERT( a_iIndex < m_iNumElements );
268 return m_pData[ a_iIndex ];
269 }
270
271private:
272 void GrowBy( TINT a_iGrowBy )
273 {
274 if ( m_iNumAllocElements < m_iNumElements + a_iGrowBy )
275 {
276 TASSERT( m_iGrowSize != 0 );
277
278 auto iNewSize = TMath::Max( m_iNumAllocElements + m_iGrowSize, m_iNumElements + a_iGrowBy );
279 Resize( iNewSize );
280 }
281 }
282
283private:
284 TINT m_iGrowSize; // 0x0
285 TINT m_iNumElements; // 0x4
286 TINT m_iNumAllocElements; // 0x8
287 T* m_pData; // 0xC
288};
289
290template <class T>
291class TArray : public TGenericArray<T>
292{
293public:
294 TArray( TINT a_iGrowSize = 10, TINT a_iSize = 0 )
295 : TGenericArray<T>( a_iGrowSize, a_iSize )
296 {
297 }
298};
299
void * TMemalign(TSIZE a_uiAlignment, TSIZE a_uiSize, Toshi::TMemory::MemBlock *a_pMemBlock)
Allocates aligned memory from a specific memory block.
Definition TMemory.cpp:1020
void TFree(void *a_pMem)
Frees previously allocated memory.
Definition TMemory.cpp:1054
TFORCEINLINE T * TConstruct(T *a_pMemory, Args &&... args)
Constructs an object in place.
Definition TMemory.h:431
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
bool TBOOL
Definition Typedefs.h:6
TFORCEINLINE const T & Max(const T &a, const T &b)
TFORCEINLINE const T & Min(const T &a, const T &b)
TINT Size() const
Definition TArray.h:213
TINT GetGrowSize() const
Definition TArray.h:228
void SetGrowSize(TINT a_iGrowSize)
Definition TArray.h:233
T * EmplaceBack(Args &&... args)
Definition TArray.h:245
Iterator End()
Definition TArray.h:208
void Resize(TINT a_iNewSize)
Definition TArray.h:158
T * Push(const T &element=T())
Definition TArray.h:238
TINT SizeAllocated() const
Definition TArray.h:223
Iterator Begin()
Definition TArray.h:198
T & operator[](TINT a_iIndex)
Definition TArray.h:257
T & Pop()
Definition TArray.h:251
Iterator Tail()
Definition TArray.h:203
const T & operator[](TINT a_iIndex) const
Definition TArray.h:264
TGenericArray(TINT a_iGrowSize, TINT a_iSize)
Definition TArray.h:133
void Clear()
Definition TArray.h:182
void SetSize(TINT a_iSize)
Definition TArray.h:218
Iterator(Storage &a_poArray)
Definition TArray.h:34
void Push(const T &element)
Definition TArray.h:51
Iterator operator++(TINT)
Definition TArray.h:97
TGenericArray Storage
Definition TArray.h:19
T * operator->() const
Definition TArray.h:57
Iterator & operator--()
Definition TArray.h:104
const T & Get() const
Definition TArray.h:78
Iterator(const Iterator &other)
Definition TArray.h:28
bool IsOver() const
Definition TArray.h:73
TBOOL operator==(const Iterator &a_rIt) const
Definition TArray.h:86
Iterator(TINT a_iIndex, Storage &a_poArray)
Definition TArray.h:40
TINT Index() const
Definition TArray.h:46
Iterator operator+(TINT a_iValue) const
Definition TArray.h:117
Iterator operator--(TINT)
Definition TArray.h:110
Iterator & operator++()
Definition TArray.h:91
Iterator operator-(TINT a_iValue) const
Definition TArray.h:122
TArray(TINT a_iGrowSize=10, TINT a_iSize=0)
Definition TArray.h:294
static void * MemCopy(void *dst, const void *src, TSIZE size)
Definition TUtil.h:90