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 LINKLIST_H
2#define LINKLIST_H
3
7#include <iterator>
8
9
10namespace JGadget {
13 pNext_ = NULL;
14 pPrev_ = NULL;
15 }
16
18#if DEBUG
19 JGADGET_ASSERTWARN(77, pNext_==NULL);
20 JGADGET_ASSERTWARN(78, pPrev_==NULL);
21#endif
22 }
23
24 TLinkListNode* getNext() const { return pNext_; }
25 TLinkListNode* getPrev() const { return pPrev_; }
26 void clear_() { pNext_ = NULL; pPrev_ = NULL; }
27
28public:
31}; // Size: 0x8
32
34 struct iterator : public std::iterator<std::bidirectional_iterator_tag, TLinkListNode, s32, TLinkListNode*, TLinkListNode&> {
35 iterator() { p_ = NULL; }
36 explicit iterator(TLinkListNode* pNode) { p_ = pNode; }
37 iterator& operator=(const iterator& other) { p_ = other.p_; return *this; }
38
39 iterator& operator++() { p_ = p_->getNext(); return *this; }
40 iterator& operator--() { p_ = p_->getPrev(); return *this; }
41 iterator operator++(int) { const iterator old(*this); (void)++*this; return old; }
42 iterator operator--(int) { const iterator old(*this); (void)--*this; return old; }
43 friend bool operator==(iterator a, iterator b) { return a.p_ == b.p_; }
44 friend bool operator!=(iterator a, iterator b) { return !(a == b); }
45
46 TLinkListNode* operator->() const { return p_; }
48 JUT_ASSERT(196, p_!=NULL);
49 return *p_;
50 }
51
52 public:
53 /* 0x00 */ TLinkListNode* p_;
54 };
55
57 explicit const_iterator(const TLinkListNode* pNode) { p_ = pNode; }
58 explicit const_iterator(const iterator it) { p_ = it.p_; }
59
60 const_iterator& operator++() { p_ = p_->getNext(); return *this; }
61 const_iterator& operator--() { p_ = p_->getPrev(); return *this; }
62 const_iterator operator++(int) { const const_iterator old(*this); (void)++*this; return old; }
63 const_iterator operator--(int) { const const_iterator old(*this); (void)--*this; return old; }
64 friend bool operator==(const_iterator a, const_iterator b) { return a.p_ == b.p_; }
65 friend bool operator!=(const_iterator a, const_iterator b) { return !(a == b); }
66
67 friend bool operator==(const_iterator a, iterator b) { return a.p_ == b.p_; }
68 friend bool operator!=(const_iterator a, iterator b) { return !(a == b); }
69
70 const TLinkListNode* operator->() const { return p_; }
71 const TLinkListNode& operator*() const { return *p_; }
72
73 public:
74 /* 0x00 */ const TLinkListNode* p_;
75 };
76
79
80 void Initialize_() {
81 count = 0;
84 }
85
88 iterator end() { return iterator(&oNode_); }
90 u32 size() const { return count; }
91 bool empty() const { return size() == 0; }
92 iterator pop_front() { return erase(begin()); }
93 void clear() { erase(begin(), end()); }
94
95 iterator erase(iterator, iterator);
96 iterator erase(iterator);
97 void splice(iterator, TNodeLinkList&);
98 void splice(iterator, TNodeLinkList&, iterator);
99 void splice(iterator, TNodeLinkList&, iterator, iterator);
100 iterator Find(const TLinkListNode*);
101 iterator Insert(iterator, TLinkListNode*);
102 iterator Erase(TLinkListNode*);
103 void Remove(TLinkListNode*);
104 bool Confirm() const;
105 bool Confirm_iterator(const_iterator) const;
106
107 bool Iterator_isEnd_(const_iterator it) const { return it.p_ == &oNode_; }
108 template <typename Predicate>
109 void Remove_if(Predicate predicate, TNodeLinkList& tList) {
110 iterator it = begin();
111
112 while (!Iterator_isEnd_(const_iterator(it))) {
113 if (predicate(*it)) {
114 iterator itPrev = it;
115 ++it;
116 tList.splice(tList.end(), *this, itPrev);
117 } else {
118 ++it;
119 }
120 }
121 }
122
123 template <typename Predicate>
124 void remove_if(Predicate predicate) {
125 TNodeLinkList list;
126 Remove_if(predicate, list);
127 }
128
129public:
130 /* 0x00 */ u32 count;
132}; // Size: 0xC
133
134template <typename T, int I>
137
141
143 //TODO: Probably fakematch? Not sure what's going on here exactly
146 this->p_ = rhs.p_;
147 return *this;
148 }
149
152 return *this;
153 }
156 return *this;
157 }
159 const iterator old(*this);
160 ++*this;
161 return old;
162 }
164 const iterator old(*this);
165 --*this;
166 return old;
167 }
168 friend bool operator==(iterator a, iterator b) {
170 }
171 friend bool operator!=(iterator a, iterator b) { return !(a == b); }
172
173 T* operator->() const { return Element_toValue(TNodeLinkList::iterator::operator->()); }
174 T& operator*() const {
175 T* p = operator->();
176 JUT_ASSERT(541, p!=NULL);
177 return *p;
178 }
179
181 typedef T value_type;
182 typedef T* pointer;
183 typedef T& reference;
184 typedef std::bidirectional_iterator_tag iterator_category;
185 };
186
192
202 const const_iterator old(*this);
203 ++*this;
204 return old;
205 }
207 const const_iterator old(*this);
208 --*this;
209 return old;
210 }
214 friend bool operator!=(const_iterator a, const_iterator b) { return !(a == b); }
215
216 const T* operator->() const { return Element_toValue(TNodeLinkList::const_iterator::operator->()); }
217 const T& operator*() const {
218 const T* p = &*operator->();
219 JUT_ASSERT(0x24a, p!=NULL);
220 return *p;
221 }
222 };
223
225 JUT_ASSERT(0x2F1, p!=NULL);
226 return reinterpret_cast<TLinkListNode*>(reinterpret_cast<char*>(p) - I);
227 }
228 static const TLinkListNode* Element_toNode(const T* p) {
229 JUT_ASSERT(0x2F6, p!=NULL);
230 return reinterpret_cast<const TLinkListNode*>(reinterpret_cast<const char*>(p) - I);
231 }
233 JUT_ASSERT(0x2FB, p!=NULL);
234 return reinterpret_cast<T*>(reinterpret_cast<char*>(p) + I);
235 }
236 static const T* Element_toValue(const TLinkListNode* p) {
237 JUT_ASSERT(0x300, p!=NULL);
238 return reinterpret_cast<const T*>(reinterpret_cast<const char*>(p) + I);
239 }
240
241 iterator Insert(iterator iter, T* element) {
243 }
244 iterator Erase(T* element) { return iterator(TNodeLinkList::Erase(Element_toNode(element))); }
245
247 const_iterator begin() const { return const_iterator(const_cast<TLinkList*>(this)->begin()); }
249 const_iterator end() const { return const_iterator(const_cast<TLinkList*>(this)->end()); }
250 T& front() {
251 JUT_ASSERT(642, !empty());
252 return *begin();
253 }
254 T& back() { JUT_ASSERT(652, !empty()); return *--end(); }
256 void Push_front(T* element) { Insert(begin(), element); }
257 void Push_back(T* element) { Insert(end(), element); }
258 iterator Find(const T* element) {
260 }
261 void Remove(T* element) { TNodeLinkList::Remove(Element_toNode(element)); }
262
263 typedef T value_type;
264};
265
266template <typename T, int I>
267struct TLinkList_factory : public TLinkList<T, I> {
268 inline virtual ~TLinkList_factory() = 0;
269 virtual T* Do_create() = 0;
270 virtual void Do_destroy(T*) = 0;
271
273 while (!this->empty()) {
274 T* item = &this->front();
275 this->pop_front();
276 Do_destroy(item);
277 }
278 }
279
281 typename TLinkList<T, I>::iterator spC(this->Erase(param_0));
282 Do_destroy(param_0);
283 return spC;
284 }
285};
286
287template <typename T, int I>
289#ifdef __MWERKS__
290 JGADGET_ASSERTWARN(934, empty());
291#else
292 JGADGET_ASSERTWARN(934, this->empty());
293#endif
294}
295
296template <typename T>
298 inline TEnumerator(T _current, T _end)
299 : current(_current), end(_end) {}
300
301 bool isEnd() const { return current != end; }
302 operator bool() const { return isEnd(); }
304 T rv = current;
305 ++current;
306 return rv;
307 }
308
311};
312
313// TEnumerator2 should be the same but there are two issues:
314// 1. How to derive the iterator return type for operator* (the debug makes it seem like operator* is called
315// so the return value should be what the iterator points to)
316// 2. Calling the * operator seems to make functions using TEnumerator<T*> not work. See
317// JStudio::TAdaptor::adaptor_setVariableValue_n
318// Perhaps template specialization?
319template <typename Iterator, typename T>
321 inline TEnumerator2(Iterator _current, Iterator _end)
322 : current(_current), end(_end) {}
323
324 bool isEnd() const { return current != end; }
325 operator bool() const { return isEnd(); }
327 T& rv = *current;
328 ++current;
329 return rv;
330 }
331
332 Iterator current;
333 Iterator end;
334};
335
336template <typename T>
337struct TContainerEnumerator : public TEnumerator2<typename T::iterator, typename T::value_type> {
338 inline TContainerEnumerator(T& param_0)
339 : TEnumerator2<typename T::iterator, typename T::value_type>(param_0.begin(), param_0.end()) {}
340};
341
342
343template <typename T, int I>
344struct TContainerEnumerator_const : public TEnumerator2<typename TLinkList<T, I>::const_iterator, const T> {
346 : TEnumerator2<typename TLinkList<T, I>::const_iterator, const T>(param_0->begin(), param_0->end()) {}
347};
348
349}; // namespace JGadget
350
351#endif /* LINKLIST_H */
p
Definition e_acos.c:103
unsigned long u32
Definition types.h:12
signed long s32
Definition types.h:11
a
Definition k_cos.c:89
Definition linklist.cpp:6
Definition linklist.h:344
TContainerEnumerator_const(const TLinkList< T, I > *param_0)
Definition linklist.h:345
Definition linklist.h:337
TContainerEnumerator(T &param_0)
Definition linklist.h:338
Definition linklist.h:320
TEnumerator2(Iterator _current, Iterator _end)
Definition linklist.h:321
Iterator end
Definition linklist.h:333
bool isEnd() const
Definition linklist.h:324
T & operator*()
Definition linklist.h:326
Iterator current
Definition linklist.h:332
Definition linklist.h:297
TEnumerator(T _current, T _end)
Definition linklist.h:298
T operator*()
Definition linklist.h:303
T end
Definition linklist.h:310
bool isEnd() const
Definition linklist.h:301
T current
Definition linklist.h:309
Definition search.h:69
Definition linklist.h:11
TLinkListNode * getPrev() const
Definition linklist.h:25
TLinkListNode * pNext_
Definition linklist.h:29
~TLinkListNode()
Definition linklist.h:17
void clear_()
Definition linklist.h:26
TLinkListNode * getNext() const
Definition linklist.h:24
TLinkListNode()
Definition linklist.h:12
TLinkListNode * pPrev_
Definition linklist.h:30