sead
Loading...
Searching...
No Matches
seadTList.h
Go to the documentation of this file.
1#ifndef SEAD_TLIST_H_
2#define SEAD_TLIST_H_
3
4#include <container/seadListImpl.h>
5
6namespace sead {
7
8template <typename T>
9class TList;
10
11template <typename T>
12class TListNode : public ListNode
13{
14public:
16 : ListNode()
17 , mData()
18 , mList(nullptr)
19 {
20 }
21
22 TListNode(T data)
23 : ListNode()
24 , mData(data)
25 , mList(nullptr)
26 {
27 }
28
29 void insertBack(TListNode<T>* n);
31
32 void erase()
33 {
34 if (mList != nullptr)
35 mList->erase(this);
36 }
37
40
41 friend class TList<T>;
42};
43#ifdef cafe
44static_assert(sizeof(TListNode<int*>) == 0x10, "sead::TListNode<T> size mismatch");
45#endif // cafe
46
47template <typename T>
48class TList : public ListImpl
49{
50private:
51 using CompareCallback = s32 (*)(const T* a, const T* b);
52
53public:
55 : ListImpl()
56 {
57 }
58
59 void pushBack(TListNode<T>* obj)
60 {
61 if (obj->mList != nullptr)
62 obj->mList->erase(obj);
63
64 obj->mList = this;
66 }
67
68 void pushFront(TListNode<T>* obj);
71 void insertBefore(TListNode<T>* basis, TListNode<T>* obj);
72 void insertAfter(TListNode<T>* basis, TListNode<T>* obj);
73
74 void erase(TListNode<T>* obj)
75 {
76 if (obj->mList != nullptr)
77 {
78 obj->mList = nullptr;
80 }
81 }
82
83 TListNode<T>* front() const;
84 TListNode<T>* back() const;
85 TListNode<T>* prev(const TListNode<T>* obj) const;
86 TListNode<T>* next(const TListNode<T>* obj) const;
87
88 TListNode<T>* nth(s32 index) const
89 {
90 return static_cast<TListNode<T>*>(ListImpl::nth(index));
91 }
92
93 s32 indexOf(const TListNode<T>* obj) const;
94 bool isNodeLinked(const TListNode<T>* obj) const;
95 void swap(TListNode<T>* obj1, TListNode<T>* obj2);
96 void moveAfter(TListNode<T>* basis, TListNode<T>* obj);
97 void moveBefore(TListNode<T>* basis, TListNode<T>* obj);
98
99 void clear()
100 {
101 TListNode<T>* n = static_cast<TListNode<T>*>(mStartEnd.next());
102 while (n != &mStartEnd)
103 {
104 TListNode<T>* next = static_cast<TListNode<T>*>(n->next());
105 erase(n);
106 n = next;
107 }
108 }
109
111
112 void sort() { sort(&compareT); }
113
114 void sort(CompareCallback cmp)
115 {
116 ListImpl::sort(-static_cast<s32>(offsetof(TListNode<T>, mData)), reinterpret_cast<CompareCallbackImpl>(cmp));
117 }
118
119 void mergeSort() { mergeSort(&compareT); }
120
121 void mergeSort(CompareCallback cmp)
122 {
123 ListImpl::mergeSort(-static_cast<s32>(offsetof(TListNode<T>, mData)), reinterpret_cast<CompareCallbackImpl>(cmp));
124 }
125
126 TListNode<T>* find(const T* obj) const { return find(obj, &compareT); }
127
128 TListNode<T>* find(const T* obj, CompareCallback cmp) const
129 {
130 return static_cast<TListNode<T>*>(ListImpl::find(obj, -static_cast<s32>(offsetof(TListNode<T>, mData)), reinterpret_cast<CompareCallbackImpl>(cmp)));
131 }
132
133 void uniq() { uniq(&compareT); }
134
135 void uniq(CompareCallback cmp)
136 {
137 ListImpl::uniq(-static_cast<s32>(offsetof(TListNode<T>, mData)), reinterpret_cast<CompareCallbackImpl>(cmp));
138 }
139
140public:
142 {
143 public:
144 explicit iterator(TListNode<T>* ptr)
145 : mPtr(ptr)
146 {
147 }
148
150 {
151 mPtr = static_cast<TListNode<T>*>(mPtr->next());
152 return *this;
153 }
154
155 public:
156 T& operator*() const
157 {
158 return mPtr->mData;
159 }
160
161 T* operator->() const
162 {
163 return &mPtr->mData;
164 }
165
166 friend bool operator==(const iterator& it1, const iterator& it2)
167 {
168 return it1.mPtr == it2.mPtr;
169 }
170
171 friend bool operator!=(const iterator& it1, const iterator& it2)
172 {
173 return it1.mPtr != it2.mPtr;
174 }
175
176 protected:
178
179 friend class constIterator;
180 };
181
183 {
184 public:
185 explicit constIterator(const TListNode<T>* ptr)
186 : mPtr(ptr)
187 {
188 }
189
191 : mPtr(it.mPtr)
192 {
193 }
194
196 {
197 mPtr = static_cast<const TListNode<T>*>(mPtr->next());
198 return *this;
199 }
200
201 public:
202 const T& operator*() const
203 {
204 return mPtr->mData;
205 }
206
207 const T* operator->() const
208 {
209 return &mPtr->mData;
210 }
211
212 friend bool operator==(const constIterator& it1, const constIterator& it2)
213 {
214 return it1.mPtr == it2.mPtr;
215 }
216
217 friend bool operator!=(const constIterator& it1, const constIterator& it2)
218 {
219 return it1.mPtr != it2.mPtr;
220 }
221
222 protected:
223 const TListNode<T>* mPtr;
224 };
225
227 {
228 public:
229 explicit robustIterator(TListNode<T>* ptr)
230 : mPtr(ptr)
231 , mNext(static_cast<TListNode<T>*>(ptr->next()))
232 {
233 }
234
236 {
237 mPtr = mNext;
238 mNext = static_cast<TListNode<T>*>(mNext->next());
239 return *this;
240 }
241
242 public:
243 TListNode<T>& operator*() const
244 {
245 return *mPtr;
246 }
247
248 TListNode<T>* operator->() const
249 {
250 return mPtr;
251 }
252
253 friend bool operator==(const robustIterator& it1, const robustIterator& it2)
254 {
255 return it1.mPtr == it2.mPtr;
256 }
257
258 friend bool operator!=(const robustIterator& it1, const robustIterator& it2)
259 {
260 return it1.mPtr != it2.mPtr;
261 }
262
263 protected:
266 };
267
269 {
270 public:
271 explicit reverseIterator(TListNode<T>* ptr)
272 : mPtr(ptr)
273 {
274 }
275
277 {
278 mPtr = static_cast<TListNode<T>*>(mPtr->prev());
279 return *this;
280 }
281
282 T& operator*() const { return mPtr->mData; }
283 T* operator->() const { return &mPtr->mData; }
284
285 friend bool operator==(const reverseIterator& lhs, const reverseIterator& rhs) { return lhs.mPtr == rhs.mPtr; }
286 friend bool operator!=(const reverseIterator& lhs, const reverseIterator& rhs) { return lhs.mPtr != rhs.mPtr; }
287
288 protected:
290
291 friend class reverseConstIterator;
292 };
293
295 {
296 public:
297 explicit reverseConstIterator(const TListNode<T>* ptr)
298 : mPtr(ptr)
299 {
300 }
301
303 : mPtr(it.mPtr)
304 {
305 }
306
308 {
309 mPtr = static_cast<const TListNode<T>*>(mPtr->prev());
310 return *this;
311 }
312
313 const T& operator*() const { return mPtr->mData; }
314 const T* operator->() const { return &mPtr->mData; }
315
316 friend bool operator==(const reverseConstIterator& lhs, const reverseConstIterator& rhs) { return lhs.mPtr == rhs.mPtr; }
317 friend bool operator!=(const reverseConstIterator& lhs, const reverseConstIterator& rhs) { return lhs.mPtr != rhs.mPtr; }
318
319 protected:
320 const TListNode<T>* mPtr;
321 };
322
324 {
325 public:
327 : mPtr(ptr)
328 , mPrev(static_cast<TListNode<T>*>(ptr->prev()))
329 {
330 }
331
333 {
334 mPtr = mPrev;
335 mPrev = static_cast<TListNode<T>*>(mPrev->prev());
336 return *this;
337 }
338
339 TListNode<T>& operator*() const { return *mPtr; }
340 TListNode<T>* operator->() const { return mPtr; }
341
342 friend bool operator==(const reverseRobustIterator& lhs, const reverseRobustIterator& rhs) { return lhs.mPtr == rhs.mPtr; }
343 friend bool operator!=(const reverseRobustIterator& lhs, const reverseRobustIterator& rhs) { return lhs.mPtr != rhs.mPtr; }
344
345 protected:
348 };
349
350public:
351 iterator begin() const { return iterator(static_cast<TListNode<T>*>(mStartEnd.next())); }
352 iterator end() const { return iterator(static_cast<TListNode<T>*>(const_cast<ListNode*>(&mStartEnd))); }
353 iterator toIterator(TListNode<T>* obj) const { return iterator(obj); }
354
355 constIterator constBegin() const { return constIterator(static_cast<TListNode<T>*>(mStartEnd.next())); }
356 constIterator constEnd() const { return constIterator(static_cast<TListNode<T>*>(const_cast<ListNode*>(&mStartEnd))); }
357 constIterator toConstIterator(const TListNode<T>* obj) const { return constIterator(obj); }
358
360 robustIterator robustEnd() const { return robustIterator(static_cast<TListNode<T>*>(const_cast<ListNode*>(&mStartEnd))); }
362
364 reverseIterator reverseEnd() const { return reverseIterator(static_cast<TListNode<T>*>(const_cast<ListNode*>(&mStartEnd))); }
366
368 reverseConstIterator reverseConstEnd() const { return reverseConstIterator(static_cast<TListNode<T>*>(const_cast<ListNode*>(&mStartEnd))); }
370
372 reverseRobustIterator reverseRobustEnd() const { return reverseRobustIterator(static_cast<TListNode<T>*>(const_cast<ListNode*>(&mStartEnd))); }
374
375protected:
376 static s32 compareT(const T* a, const T* b)
377 {
378 if (*a < *b)
379 {
380 return -1;
381 }
382
383 if (*b < *a)
384 {
385 return 1;
386 }
387
388 return 0;
389 }
390};
391
392} // namespace sead
393
394#endif // SEAD_TLIST_H_
Definition seadListImpl.h:51
void pushBack(ListNode *n)
Definition seadListImpl.h:87
ListNode mStartEnd
Definition seadListImpl.h:146
void unsafeClear()
Definition seadListImpl.h:135
void erase(ListNode *n)
Definition seadListImpl.h:114
Definition seadListImpl.h:11
ListNode * prev() const
Definition seadListImpl.h:25
ListNode * next() const
Definition seadListImpl.h:24
Definition seadTList.h:13
void insertFront(TListNode< T > *n)
TListNode(T data)
Definition seadTList.h:22
TList< T > * mList
Definition seadTList.h:39
T mData
Definition seadTList.h:38
void insertBack(TListNode< T > *n)
TListNode()
Definition seadTList.h:15
void erase()
Definition seadTList.h:32
Definition seadTList.h:183
constIterator(const iterator &it)
Definition seadTList.h:190
const TListNode< T > * mPtr
Definition seadTList.h:223
friend bool operator!=(const constIterator &it1, const constIterator &it2)
Definition seadTList.h:217
friend bool operator==(const constIterator &it1, const constIterator &it2)
Definition seadTList.h:212
constIterator & operator++()
Definition seadTList.h:195
const T & operator*() const
Definition seadTList.h:202
const T * operator->() const
Definition seadTList.h:207
constIterator(const TListNode< T > *ptr)
Definition seadTList.h:185
Definition seadTList.h:142
iterator & operator++()
Definition seadTList.h:149
T & operator*() const
Definition seadTList.h:156
iterator(TListNode< T > *ptr)
Definition seadTList.h:144
friend bool operator!=(const iterator &it1, const iterator &it2)
Definition seadTList.h:171
T * operator->() const
Definition seadTList.h:161
friend bool operator==(const iterator &it1, const iterator &it2)
Definition seadTList.h:166
TListNode< T > * mPtr
Definition seadTList.h:177
Definition seadTList.h:295
const T * operator->() const
Definition seadTList.h:314
const TListNode< T > * mPtr
Definition seadTList.h:320
friend bool operator==(const reverseConstIterator &lhs, const reverseConstIterator &rhs)
Definition seadTList.h:316
friend bool operator!=(const reverseConstIterator &lhs, const reverseConstIterator &rhs)
Definition seadTList.h:317
reverseConstIterator(const TListNode< T > *ptr)
Definition seadTList.h:297
const T & operator*() const
Definition seadTList.h:313
reverseConstIterator(const reverseIterator &it)
Definition seadTList.h:302
reverseConstIterator & operator++()
Definition seadTList.h:307
Definition seadTList.h:269
TListNode< T > * mPtr
Definition seadTList.h:289
T & operator*() const
Definition seadTList.h:282
reverseIterator & operator++()
Definition seadTList.h:276
T * operator->() const
Definition seadTList.h:283
friend bool operator==(const reverseIterator &lhs, const reverseIterator &rhs)
Definition seadTList.h:285
friend bool operator!=(const reverseIterator &lhs, const reverseIterator &rhs)
Definition seadTList.h:286
reverseIterator(TListNode< T > *ptr)
Definition seadTList.h:271
Definition seadTList.h:324
reverseRobustIterator & operator++()
Definition seadTList.h:332
reverseRobustIterator(TListNode< T > *ptr)
Definition seadTList.h:326
TListNode< T > * operator->() const
Definition seadTList.h:340
friend bool operator==(const reverseRobustIterator &lhs, const reverseRobustIterator &rhs)
Definition seadTList.h:342
TListNode< T > * mPrev
Definition seadTList.h:347
TListNode< T > & operator*() const
Definition seadTList.h:339
TListNode< T > * mPtr
Definition seadTList.h:346
friend bool operator!=(const reverseRobustIterator &lhs, const reverseRobustIterator &rhs)
Definition seadTList.h:343
Definition seadTList.h:227
robustIterator & operator++()
Definition seadTList.h:235
friend bool operator==(const robustIterator &it1, const robustIterator &it2)
Definition seadTList.h:253
TListNode< T > * operator->() const
Definition seadTList.h:248
TListNode< T > * mPtr
Definition seadTList.h:264
friend bool operator!=(const robustIterator &it1, const robustIterator &it2)
Definition seadTList.h:258
TListNode< T > & operator*() const
Definition seadTList.h:243
TListNode< T > * mNext
Definition seadTList.h:265
robustIterator(TListNode< T > *ptr)
Definition seadTList.h:229
Definition seadTList.h:49
void pushBack(TListNode< T > *obj)
Definition seadTList.h:59
void uniq(CompareCallback cmp)
Definition seadTList.h:135
void sort(CompareCallback cmp)
Definition seadTList.h:114
iterator begin() const
Definition seadTList.h:351
void insertAfter(TListNode< T > *basis, TListNode< T > *obj)
reverseRobustIterator toReverseRobustIterator(TListNode< T > *obj) const
Definition seadTList.h:373
TListNode< T > * find(const T *obj, CompareCallback cmp) const
Definition seadTList.h:128
s32 indexOf(const TListNode< T > *obj) const
TListNode< T > * front() const
TListNode< T > * prev(const TListNode< T > *obj) const
reverseIterator reverseEnd() const
Definition seadTList.h:364
static s32 compareT(const T *a, const T *b)
Definition seadTList.h:376
robustIterator robustBegin() const
Definition seadTList.h:359
TListNode< T > * back() const
void uniq()
Definition seadTList.h:133
reverseRobustIterator reverseRobustBegin() const
Definition seadTList.h:371
TListNode< T > * popFront()
void moveBefore(TListNode< T > *basis, TListNode< T > *obj)
TListNode< T > * find(const T *obj) const
Definition seadTList.h:126
void insertBefore(TListNode< T > *basis, TListNode< T > *obj)
void unsafeClear()
Definition seadTList.h:110
void pushFront(TListNode< T > *obj)
reverseConstIterator reverseConstBegin() const
Definition seadTList.h:367
iterator toIterator(TListNode< T > *obj) const
Definition seadTList.h:353
robustIterator toRobustIterator(TListNode< T > *obj) const
Definition seadTList.h:361
TListNode< T > * next(const TListNode< T > *obj) const
reverseIterator reverseBegin() const
Definition seadTList.h:363
void mergeSort()
Definition seadTList.h:119
void swap(TListNode< T > *obj1, TListNode< T > *obj2)
constIterator constEnd() const
Definition seadTList.h:356
bool isNodeLinked(const TListNode< T > *obj) const
reverseIterator toReverseIterator(TListNode< T > *obj) const
Definition seadTList.h:365
iterator end() const
Definition seadTList.h:352
reverseConstIterator reverseConstEnd() const
Definition seadTList.h:368
TListNode< T > * popBack()
robustIterator robustEnd() const
Definition seadTList.h:360
void erase(TListNode< T > *obj)
Definition seadTList.h:74
reverseRobustIterator reverseRobustEnd() const
Definition seadTList.h:372
TList()
Definition seadTList.h:54
reverseConstIterator toReverseConstIterator(const TListNode< T > *obj) const
Definition seadTList.h:369
constIterator toConstIterator(const TListNode< T > *obj) const
Definition seadTList.h:357
void mergeSort(CompareCallback cmp)
Definition seadTList.h:121
constIterator constBegin() const
Definition seadTList.h:355
void clear()
Definition seadTList.h:99
TListNode< T > * nth(s32 index) const
Definition seadTList.h:88
void sort()
Definition seadTList.h:112
void moveAfter(TListNode< T > *basis, TListNode< T > *obj)
Definition seadAssert.h:44