Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
LinkList.h
Go to the documentation of this file.
1#ifndef NW4HBM_UT_LINK_LIST_H
2#define NW4HBM_UT_LINK_LIST_H
3
4#include <revolution/types.h>
5
6#include "inlines.h"
7
8#include "../db/assert.h"
9#include <stddef>
10
11namespace nw4hbm {
12 namespace ut {
13
14 namespace detail {
15 class LinkListImpl;
16 }
17
18 /******************************************************************************
19 *
20 * Linked list node
21 *
22 ******************************************************************************/
23 class LinkListNode : private NonCopyable {
25
26 public:
27 LinkListNode() : mNext(NULL), mPrev(NULL) {}
28
29 LinkListNode* GetNext() const { return mNext; }
30 LinkListNode* GetPrev() const { return mPrev; }
31
32 private:
33 /* 0x00 */ LinkListNode* mNext;
34 /* 0x04 */ LinkListNode* mPrev;
35 }; // size = 0x08
36
37 namespace detail {
38
39 /******************************************************************************
40 *
41 * Linked list implementation
42 *
43 ******************************************************************************/
44 class LinkListImpl : private NonCopyable {
45 public:
46 class ConstIterator;
47
48 /******************************************************************************
49 * Iterator implementation
50 ******************************************************************************/
51 class Iterator {
52 friend class LinkListImpl;
53 friend class ConstIterator;
54
55 public:
56 Iterator() : mPointer(NULL) {}
57 explicit Iterator(LinkListNode* pNode) : mPointer(pNode) {}
58
61 return *this;
62 }
63
66 return *this;
67 }
68
69 LinkListNode* operator->() const { return mPointer; }
70
72 return lhs.mPointer == rhs.mPointer;
73 }
74
75 private:
77 }; // size = 0x04
78
79 /******************************************************************************
80 * Iterator implementation (const-view)
81 ******************************************************************************/
83 friend class LinkListImpl;
84
85 public:
86 explicit ConstIterator(Iterator it) : mNode(it.mPointer) {}
87
89 mNode = mNode->GetNext();
90 return *this;
91 }
92
94 mNode = mNode->GetPrev();
95 return *this;
96 }
97
98 const LinkListNode* operator->() const { return mNode; }
99
102 return lhs.mNode == rhs.mNode;
103 }
104
105 private:
106 /* 0x00 */ LinkListNode* mNode;
107 }; // size = 0x04
108
109 protected:
111 return Iterator(pNode);
112 }
113
116
119
120 Iterator Insert(Iterator it, LinkListNode* pNode);
121
122 Iterator Erase(Iterator it);
123 Iterator Erase(LinkListNode* pNode);
124 Iterator Erase(Iterator begin, Iterator end);
125
126 public:
127 u32 GetSize() const { return mSize; }
128 bool IsEmpty() const { return mSize == 0; }
129
131 void PopBack() { Erase(--GetEndIter()); }
132
133 void Clear();
134 void SetPrev(LinkListNode* p, LinkListNode* pPrev);
135 void SetNext(LinkListNode* p, LinkListNode* pNext);
136
137 private:
138 void Initialize_() {
139 mSize = 0;
140 mNode.mNext = &mNode;
141 mNode.mPrev = &mNode;
142 }
143
144 private:
145 /* 0x00 */ u32 mSize;
146 /* 0x04 */ LinkListNode mNode;
147 }; // size = 0x0C
148
149 /******************************************************************************
150 *
151 * Reverse iterator
152 *
153 ******************************************************************************/
154 template <typename TIter>
156 public:
157 explicit ReverseIterator(TIter it) : mCurrent(it) {}
158
159 TIter GetBase() const { return mCurrent; }
160
162 --mCurrent;
163 return *this;
164 }
165
166 const typename TIter::TElem* operator->() const { return &this->operator*(); }
167
168 typename TIter::TElem& operator*() const {
169 TIter it = mCurrent;
170 return *--it;
171 }
172
173 friend bool operator==(const ReverseIterator& rLhs, const ReverseIterator& rRhs) {
174 return rLhs.mCurrent == rRhs.mCurrent;
175 }
176
177 friend bool operator!=(const ReverseIterator& rLhs, const ReverseIterator& rRhs) {
178 return !(rLhs.mCurrent == rRhs.mCurrent);
179 }
180
181 private:
182 /* 0x00 */ TIter mCurrent;
183 };
184
185 } // namespace detail
186
187 /******************************************************************************
188 *
189 * Templated linked list
190 *
191 ******************************************************************************/
192 template <typename T, int Ofs>
194 public:
195 class ConstIterator;
196
197 /******************************************************************************
198 * Templated iterator
199 ******************************************************************************/
200 class Iterator {
201 friend class LinkList;
202 friend class ConstIterator;
203
204 public:
205 // Element type must be visible to ReverseIterator
206 typedef T TElem;
207
208 public:
209 Iterator() : mIterator(NULL) {}
210 explicit Iterator(LinkListImpl::Iterator it) : mIterator(it) {}
211
213 ++mIterator;
214 return *this;
215 }
216
218 --mIterator;
219 return *this;
220 }
221
223 Iterator ret = *this;
224 ++*this;
225 return ret;
226 }
227
228 T* operator->() const { return GetPointerFromNode(mIterator.operator->()); }
229
230 T& operator*() const {
231 T* p = this->operator->();
232 NW4HBM_ASSERT_CHECK_NULL(403, p);
233 return *p;
234 }
235
236 friend bool operator==(Iterator lhs, Iterator rhs) {
237 return lhs.mIterator == rhs.mIterator;
238 }
239
240 friend bool operator!=(Iterator lhs, Iterator rhs) { return !(lhs == rhs); }
241
242 private:
243 /* 0x00 */ LinkListImpl::Iterator mIterator;
244 };
245
246 /******************************************************************************
247 * Templated iterator (const-view)
248 ******************************************************************************/
250 friend class LinkList;
251
252 public:
253 // Element type must be visible to ReverseIterator
254 typedef T TElem;
255
256 public:
257 explicit ConstIterator(LinkListImpl::Iterator it) : mIterator(it) {}
259
261 ++mIterator;
262 return *this;
263 }
264
266 --mIterator;
267 return *this;
268 }
269
271 ConstIterator ret = *this;
272 ++*this;
273 return ret;
274 }
275
276 const T* operator->() const { return GetPointerFromNode(mIterator.operator->()); }
277
278 const T& operator*() const {
279 const T* p = this->operator->();
280 NW4HBM_ASSERT_CHECK_NULL(447, p);
281 return *p;
282 }
283
284 friend bool operator==(ConstIterator lhs, ConstIterator rhs) {
285 return lhs.mIterator == rhs.mIterator;
286 }
287
288 friend bool operator!=(ConstIterator lhs, ConstIterator rhs) {
289 return !(lhs == rhs);
290 }
291
292 private:
293 /* 0x00 */ LinkListImpl::ConstIterator mIterator;
294 };
295
296 public:
297 // Shorthand names for reverse iterator types
300
301 public:
303
304 Iterator GetBeginIter() { return Iterator(LinkListImpl::GetBeginIter()); }
306 return ConstIterator(const_cast<LinkList*>(this)->GetBeginIter());
307 }
312
313 Iterator GetEndIter() { return Iterator(LinkListImpl::GetEndIter()); }
315 return ConstIterator(const_cast<LinkList*>(this)->GetEndIter());
316 }
319
320 Iterator Insert(Iterator it, T* pElem) {
321 return Iterator(LinkListImpl::Insert(it.mIterator, GetNodeFromPointer(pElem)));
322 }
323
324 Iterator Erase(T* pElem) {
325 return Iterator(LinkListImpl::Erase(GetNodeFromPointer(pElem)));
326 }
327 Iterator Erase(Iterator it) { return Iterator(LinkListImpl::Erase(it.mIterator)); }
328
329 void PushBack(T* pElem) { Insert(GetEndIter(), pElem); }
330
331 T& GetFront() {
332 NW4HBM_ASSERT(497, !IsEmpty());
333 return *GetBeginIter();
334 }
335
336 const T& GetFront() const {
337 NW4HBM_ASSERT(502, !IsEmpty());
338 return *GetBeginIter();
339 }
340
341 T& GetBack() {
342 NW4HBM_ASSERT(507, !IsEmpty());
343 return *--GetEndIter();
344 }
345
346 const T& GetBack() const {
347 NW4HBM_ASSERT(512, !IsEmpty()); // assumed line number
348 return *--GetEndIter();
349 }
350
353 }
354
356 return Iterator(LinkListImpl::GetIteratorFromPointer(pNode));
357 }
358
360 NW4HBM_ASSERT_CHECK_NULL(563, p);
361 return reinterpret_cast<LinkListNode*>(reinterpret_cast<char*>(p) + Ofs);
362 }
363
365 NW4HBM_ASSERT_CHECK_NULL(573, p);
366 return reinterpret_cast<T*>(reinterpret_cast<char*>(p) - Ofs);
367 }
368
369 static const T* GetPointerFromNode(const LinkListNode* p) {
370 NW4HBM_ASSERT_CHECK_NULL(578, p);
371 return reinterpret_cast<const T*>(reinterpret_cast<const char*>(p) - Ofs);
372 }
373 };
374
375 } // namespace ut
376} // namespace nw4hbm
377
378#endif
Definition LinkList.h:23
LinkListNode * mPrev
Definition LinkList.h:34
LinkListNode * GetPrev() const
Definition LinkList.h:30
LinkListNode * GetNext() const
Definition LinkList.h:29
LinkListNode()
Definition LinkList.h:27
LinkListNode * mNext
Definition LinkList.h:33
Definition inlines.h:9
ConstIterator & operator--()
Definition LinkList.h:93
friend bool operator==(LinkListImpl::ConstIterator lhs, LinkListImpl::ConstIterator rhs)
Definition LinkList.h:100
ConstIterator & operator++()
Definition LinkList.h:88
LinkListNode * mNode
Definition LinkList.h:106
ConstIterator(Iterator it)
Definition LinkList.h:86
const LinkListNode * operator->() const
Definition LinkList.h:98
LinkListNode * mPointer
Definition LinkList.h:76
LinkListNode * operator->() const
Definition LinkList.h:69
Iterator & operator--()
Definition LinkList.h:64
friend bool operator==(LinkListImpl::Iterator lhs, LinkListImpl::Iterator rhs)
Definition LinkList.h:71
Iterator(LinkListNode *pNode)
Definition LinkList.h:57
Iterator & operator++()
Definition LinkList.h:59
Definition LinkList.h:44
u32 GetSize() const
Definition LinkList.h:127
Iterator Erase(Iterator it)
Definition ut_LinkList.cpp:13
~LinkListImpl()
Definition ut_LinkList.cpp:9
void SetPrev(LinkListNode *p, LinkListNode *pPrev)
Definition ut_LinkList.cpp:84
bool IsEmpty() const
Definition LinkList.h:128
LinkListImpl()
Definition LinkList.h:114
static Iterator GetIteratorFromPointer(LinkListNode *pNode)
Definition LinkList.h:110
void Clear()
Definition ut_LinkList.cpp:37
void Initialize_()
Definition LinkList.h:138
Iterator Insert(Iterator it, LinkListNode *pNode)
Definition ut_LinkList.cpp:41
u32 mSize
Definition LinkList.h:145
void PopBack()
Definition LinkList.h:131
void SetNext(LinkListNode *p, LinkListNode *pNext)
Definition ut_LinkList.cpp:89
Iterator GetEndIter()
Definition LinkList.h:118
void PopFront()
Definition LinkList.h:130
LinkListNode mNode
Definition LinkList.h:146
Iterator GetBeginIter()
Definition LinkList.h:117
Definition LinkList.h:155
TIter mCurrent
Definition LinkList.h:182
friend bool operator!=(const ReverseIterator &rLhs, const ReverseIterator &rRhs)
Definition LinkList.h:177
ReverseIterator & operator++()
Definition LinkList.h:161
TIter GetBase() const
Definition LinkList.h:159
friend bool operator==(const ReverseIterator &rLhs, const ReverseIterator &rRhs)
Definition LinkList.h:173
const TIter::TElem * operator->() const
Definition LinkList.h:166
ReverseIterator(TIter it)
Definition LinkList.h:157
TIter::TElem & operator*() const
Definition LinkList.h:168
static void end(b_oh_class *i_this)
Definition d_a_b_oh.cpp:343
p
Definition e_acos.c:103
unsigned long u32
Definition types.h:12
Definition HBMAnmController.h:6