sead
Loading...
Searching...
No Matches
seadOffsetList.h
Go to the documentation of this file.
1#ifndef SEAD_OFFSET_LIST_H_
2#define SEAD_OFFSET_LIST_H_
3
4#include <container/seadListImpl.h>
5#include <prim/seadPtrUtil.h>
6
7namespace sead {
8
9template <typename T>
10class OffsetList : public ListImpl
11{
12private:
13 typedef s32 (*CompareCallback)(const T*, const T*);
14
15public:
17 : ListImpl(), mOffset(-1)
18 {
19 }
20
21 void initOffset(s32 offset) { mOffset = offset; }
22
23 void clear()
24 {
26 }
27
32
33 void pushBack(T* obj)
34 {
35 // SEAD_ASSRT(mOffset >= 0);
37 }
38
39 void pushFront(T* obj)
40 {
41 // SEAD_ASSRT(mOffset >= 0);
43 }
44
47
48 void insertBefore(const T* basis, T* obj)
49 {
51 }
52
53 void insertAfter(const T* basis, T* obj)
54 {
56 }
57
58 void erase(T* obj)
59 {
61 }
62
65
66 T* prev(const T* obj) const
67 {
68 ListNode* node = objToListNode(obj)->prev();
69 if (node == &mStartEnd)
70 return nullptr;
71
72 return listNodeToObj(node);
73 }
74
75 T* next(const T* obj) const
76 {
77 ListNode* node = objToListNode(obj)->next();
78 if (node == &mStartEnd)
79 return nullptr;
80
81 return listNodeToObj(node);
82 }
83
84 T* nth(s32 index) const;
85 s32 indexOf(const T* obj) const;
86 bool isNodeLinked(const T* obj) const;
87 void swap(T* obj1, T* obj2);
88 void moveAfter(T* basis, T* obj);
89 void moveBefore(T* basis, T* obj);
90 void sort();
92 void mergeSort();
94 T* find(const T* obj) const;
95 T* find(const T* obj, CompareCallback cmp) const;
96 void uniq();
98
99public:
101 {
102 public:
103 iterator(T* ptr, s32 offset)
104 : mPtr(ptr)
105 , mOffset(offset)
106 {
107 }
108
110 {
111 ListNode* next = reinterpret_cast<ListNode*>(PtrUtil::addOffset(mPtr, mOffset))->next();
112 mPtr = reinterpret_cast<T*>(PtrUtil::addOffset(next, -mOffset));
113 return *this;
114 }
115
116 public:
117 T& operator*() const
118 {
119 return *mPtr;
120 }
121
122 T* operator->() const
123 {
124 return mPtr;
125 }
126
127 friend bool operator==(const iterator& it1, const iterator& it2)
128 {
129 return it1.mPtr == it2.mPtr;
130 }
131
132 friend bool operator!=(const iterator& it1, const iterator& it2)
133 {
134 return it1.mPtr != it2.mPtr;
135 }
136
137 protected:
140
141 friend class constIterator;
142 };
143
145 {
146 public:
147 constIterator(const T* ptr, s32 offset)
148 : mPtr(ptr)
149 , mOffset(offset)
150 {
151 }
152
154 : mPtr(it.mPtr)
156 {
157 }
158
160 {
161 const ListNode* next = static_cast<const ListNode*>(PtrUtil::addOffset(mPtr, mOffset))->next();
162 mPtr = static_cast<const T*>(PtrUtil::addOffset(next, -mOffset));
163 return *this;
164 }
165
166 public:
167 const T& operator*() const
168 {
169 return *mPtr;
170 }
171
172 const T* operator->() const
173 {
174 return mPtr;
175 }
176
177 friend bool operator==(const constIterator& it1, const constIterator& it2)
178 {
179 return it1.mPtr == it2.mPtr;
180 }
181
182 friend bool operator!=(const constIterator& it1, const constIterator& it2)
183 {
184 return it1.mPtr != it2.mPtr;
185 }
186
187 protected:
188 const T* mPtr;
190 };
191
193 {
194 public:
195 robustIterator(T* ptr, s32 offset)
196 : mPtr(ptr)
197 , mNext(reinterpret_cast<ListNode*>(PtrUtil::addOffset(ptr, offset))->next())
198 , mOffset(offset)
199 {
200 }
201
203 {
204 mPtr = reinterpret_cast<T*>(PtrUtil::addOffset(mNext, -mOffset));
206 return *this;
207 }
208
209 public:
210 T& operator*() const
211 {
212 return *mPtr;
213 }
214
215 T* operator->() const
216 {
217 return mPtr;
218 }
219
220 friend bool operator==(const robustIterator& it1, const robustIterator& it2)
221 {
222 return it1.mPtr == it2.mPtr;
223 }
224
225 friend bool operator!=(const robustIterator& it1, const robustIterator& it2)
226 {
227 return it1.mPtr != it2.mPtr;
228 }
229
230 protected:
234 };
235
236 // TODO
238
239 // TODO
241
242 // TODO
244
245public:
247 {
248 return iterator(listNodeToObj(mStartEnd.next()), mOffset);
249 }
250
251 iterator end() const
252 {
253 return iterator(listNodeToObj(&mStartEnd), mOffset);
254 }
255
257
259 {
260 return constIterator(listNodeToObj(mStartEnd.next()), mOffset);
261 }
262
264 {
265 return constIterator(listNodeToObj(&mStartEnd), mOffset);
266 }
267
269
271 {
272 return robustIterator(listNodeToObj(mStartEnd.next()), mOffset);
273 }
274
276 {
277 return robustIterator(listNodeToObj(&mStartEnd), mOffset);
278 }
279
281
284
286
289
291
294
296
297protected:
298 static s32 compareT(const T*, const T*);
299
300 ListNode* objToListNode(const T* obj) const
301 {
302 return reinterpret_cast<ListNode*>(PtrUtil::addOffset(obj, mOffset));
303 }
304
305 T* listNodeToObj(const ListNode* node) const
306 {
307 return reinterpret_cast<T*>(PtrUtil::addOffset(node, -mOffset));
308 }
309
311 {
312 return node ? listNodeToObj(node) : nullptr;
313 }
314
315protected:
317};
318#ifdef cafe
319static_assert(sizeof(OffsetList<int>) == 0x10, "sead::OffsetList<T> size mismatch");
320#endif // cafe
321
322} // namespace sead
323
324#endif // SEAD_OFFSET_LIST_H_
Definition seadListImpl.h:51
void pushFront(ListNode *n)
Definition seadListImpl.h:93
void clear()
Definition seadListImpl.cpp:79
ListNode * popFront()
Definition seadListImpl.cpp:64
ListNode * back() const
Definition seadListImpl.h:121
void insertAfter(ListNode *basis, ListNode *n)
Definition seadListImpl.h:108
ListNode * popBack()
Definition seadListImpl.cpp:49
void insertBefore(ListNode *basis, ListNode *n)
Definition seadListImpl.h:102
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
ListNode * front() const
Definition seadListImpl.h:120
Definition seadListImpl.h:11
ListNode * next() const
Definition seadListImpl.h:24
Definition seadOffsetList.h:145
constIterator(const T *ptr, s32 offset)
Definition seadOffsetList.h:147
friend bool operator!=(const constIterator &it1, const constIterator &it2)
Definition seadOffsetList.h:182
s32 mOffset
Definition seadOffsetList.h:189
friend bool operator==(const constIterator &it1, const constIterator &it2)
Definition seadOffsetList.h:177
const T * mPtr
Definition seadOffsetList.h:188
const T * operator->() const
Definition seadOffsetList.h:172
const T & operator*() const
Definition seadOffsetList.h:167
constIterator(const iterator &it)
Definition seadOffsetList.h:153
constIterator & operator++()
Definition seadOffsetList.h:159
Definition seadOffsetList.h:101
iterator & operator++()
Definition seadOffsetList.h:109
T * mPtr
Definition seadOffsetList.h:138
T * operator->() const
Definition seadOffsetList.h:122
iterator(T *ptr, s32 offset)
Definition seadOffsetList.h:103
friend bool operator!=(const iterator &it1, const iterator &it2)
Definition seadOffsetList.h:132
T & operator*() const
Definition seadOffsetList.h:117
friend bool operator==(const iterator &it1, const iterator &it2)
Definition seadOffsetList.h:127
s32 mOffset
Definition seadOffsetList.h:139
Definition seadOffsetList.h:240
Definition seadOffsetList.h:237
Definition seadOffsetList.h:243
Definition seadOffsetList.h:193
friend bool operator==(const robustIterator &it1, const robustIterator &it2)
Definition seadOffsetList.h:220
T & operator*() const
Definition seadOffsetList.h:210
friend bool operator!=(const robustIterator &it1, const robustIterator &it2)
Definition seadOffsetList.h:225
ListNode * mNext
Definition seadOffsetList.h:232
s32 mOffset
Definition seadOffsetList.h:233
robustIterator & operator++()
Definition seadOffsetList.h:202
T * mPtr
Definition seadOffsetList.h:231
T * operator->() const
Definition seadOffsetList.h:215
robustIterator(T *ptr, s32 offset)
Definition seadOffsetList.h:195
Definition seadOffsetList.h:11
void uniq(CompareCallback cmp)
T * back() const
Definition seadOffsetList.h:64
T * nth(s32 index) const
reverseConstIterator reverseConstBegin() const
bool isNodeLinked(const T *obj) const
T * prev(const T *obj) const
Definition seadOffsetList.h:66
s32(* CompareCallback)(const T *, const T *)
Definition seadOffsetList.h:13
void mergeSort(CompareCallback cmp)
constIterator constBegin() const
Definition seadOffsetList.h:258
reverseConstIterator toReverseConstIterator(const T *) const
reverseRobustIterator reverseRobustEnd()
void moveAfter(T *basis, T *obj)
T * listNodeToObj(const ListNode *node) const
Definition seadOffsetList.h:305
robustIterator toRobustIterator(T *)
void clear()
Definition seadOffsetList.h:23
constIterator constEnd() const
Definition seadOffsetList.h:263
reverseRobustIterator reverseRobustBegin()
ListNode * objToListNode(const T *obj) const
Definition seadOffsetList.h:300
reverseIterator reverseEnd() const
iterator begin() const
Definition seadOffsetList.h:246
void sort(CompareCallback cmp)
s32 mOffset
Definition seadOffsetList.h:316
T * next(const T *obj) const
Definition seadOffsetList.h:75
s32 indexOf(const T *obj) const
void moveBefore(T *basis, T *obj)
reverseIterator toReverseIterator(T *) const
T * find(const T *obj, CompareCallback cmp) const
robustIterator robustEnd()
Definition seadOffsetList.h:275
static s32 compareT(const T *, const T *)
T * front() const
Definition seadOffsetList.h:63
reverseConstIterator reverseConstEnd() const
reverseIterator reverseBegin() const
robustIterator robustBegin()
Definition seadOffsetList.h:270
constIterator toConstIterator(const T *) const
void erase(T *obj)
Definition seadOffsetList.h:58
void initOffset(s32 offset)
Definition seadOffsetList.h:21
T * find(const T *obj) const
T * popFront()
Definition seadOffsetList.h:46
OffsetList()
Definition seadOffsetList.h:16
T * popBack()
Definition seadOffsetList.h:45
T * listNodeToObjWithNullCheck(const ListNode *node) const
Definition seadOffsetList.h:310
void pushBack(T *obj)
Definition seadOffsetList.h:33
void unsafeClear()
Definition seadOffsetList.h:28
void pushFront(T *obj)
Definition seadOffsetList.h:39
iterator end() const
Definition seadOffsetList.h:251
iterator toIterator(T *) const
void swap(T *obj1, T *obj2)
void insertAfter(const T *basis, T *obj)
Definition seadOffsetList.h:53
void insertBefore(const T *basis, T *obj)
Definition seadOffsetList.h:48
reverseRobustIterator toReverseRobustIterator(T *)
Definition seadAssert.h:44