sead
Loading...
Searching...
No Matches
seadPtrArray.h
Go to the documentation of this file.
1#ifndef SEAD_PTR_ARRAY_H_
2#define SEAD_PTR_ARRAY_H_
3
4#include <basis/seadAssert.h>
5#include <basis/seadTypes.h>
6
7namespace sead {
8
9class Heap;
10class Random;
11
13{
14protected:
15 typedef s32 (*CompareCallbackImpl)(const void*, const void*);
16
17public:
19 : mPtrNum(0)
20 , mPtrNumMax(0)
21 , mPtrs(nullptr)
22 {
23 }
24
25 void setBuffer(s32 ptrNumMax, void* buf);
26 void allocBuffer(s32 ptrNumMax, Heap* heap, s32 alignment = 4);
27 bool tryAllocBuffer(s32 ptrNumMax, Heap* heap, s32 alignment = 4);
28 void freeBuffer();
29 bool isBufferReady() const { return mPtrs != nullptr; }
30 bool isEmpty() const { return mPtrNum == 0; }
31 bool isFull() const { return mPtrNum >= mPtrNumMax; }
32 s32 size() const { return mPtrNum; }
33 s32 maxSize() const { return mPtrNumMax; }
34 void erase(s32 pos) { return erase(pos, 1); }
35 void erase(s32 pos, s32 num);
36 void clear() { mPtrNum = 0; }
37 void resize(s32);
39 void swap(s32 pos1, s32 pos2);
40 void reverse();
42 void shuffle();
43 void shuffle(Random* random);
44
45protected:
46 void* at(s32 n) const
47 {
48 if (u32(mPtrNum) <= u32(n))
49 {
50 SEAD_ASSERT_MSG(false, "index exceeded [%d/%d]", n, mPtrNum);
51 return nullptr;
52 }
53 return mPtrs[n];
54 }
55
56 void* unsafeAt(s32 n) const { return mPtrs[n]; }
57 void* front() const { return mPtrs[0]; }
58 void* back() const { return mPtrs[mPtrNum - 1]; }
59
60 void pushBack(void* ptr)
61 {
62 if (isFull())
63 {
64 SEAD_ASSERT_MSG(false, "list is full.");
65 return;
66 }
67
68 mPtrs[mPtrNum] = ptr;
69 ++mPtrNum;
70 }
71
72 void pushFront(void* ptr) { insert(0, ptr); }
73 void* popBack();
74 void* popFront();
75 void replace(s32 pos, void* ptr);
76 void* find(const void* ptr, CompareCallbackImpl cmp) const;
77 s32 search(const void* ptr, CompareCallbackImpl cmp) const;
78 bool equal(const PtrArrayImpl& o, CompareCallbackImpl cmp) const;
79
80 s32 indexOf(const void* ptr) const
81 {
82 for (s32 i = 0; i < mPtrNum; ++i)
83 {
84 if (mPtrs[i] == ptr)
85 return i;
86 }
87 return -1;
88 }
89
90 void createVacancy(s32 pos, s32 num);
91 void insert(s32 pos, void* ptr);
92 void insertArray(s32 pos, void* array, s32 array_length, s32 elem_size);
93 bool checkInsert(s32 pos, s32 num);
94 void sort(CompareCallbackImpl cmp);
98 s32 binarySearch(const void* ptr, CompareCallbackImpl cmp) const;
99
100protected:
103 void** mPtrs;
104};
105#ifdef cafe
106static_assert(sizeof(PtrArrayImpl) == 0xC, "sead::PtrArrayImpl size mismatch");
107#endif // cafe
108
109template <typename T>
110class PtrArray : public PtrArrayImpl
111{
112private:
113 typedef s32 (*CompareCallback)(const T*, const T*);
114
115public:
117 : PtrArrayImpl()
118 {
119 }
120
121 T* at(s32 n) const { return static_cast<T*>(PtrArrayImpl::at(n)); }
122 T* unsafeAt(s32 n) const { return static_cast<T*>(PtrArrayImpl::unsafeAt(n)); }
123 T* operator[](s32 n) const { return at(n); }
124 T* front() const { return static_cast<T*>(PtrArrayImpl::front()); }
125 T* back() const { return static_cast<T*>(PtrArrayImpl::back()); }
126 void pushBack(T* ptr) { PtrArrayImpl::pushBack((void*)ptr); }
127 void pushFront(T* ptr) { PtrArrayImpl::pushFront((void*)ptr); }
128 T* popBack() { return static_cast<T*>(PtrArrayImpl::popBack()); }
129 T* popFront() { return static_cast<T*>(PtrArrayImpl::popFront()); }
130 void insert(s32 pos, T* ptr) { PtrArrayImpl::insert(pos, (void*)ptr); }
131 void insert(s32 pos, T* array, s32 array_length) { PtrArrayImpl::insertArray(pos, (void*)array, array_length, sizeof(T)); }
132 void replace(s32 pos, T* ptr) { PtrArrayImpl::replace(pos, (void*)ptr); }
133 s32 indexOf(const T* ptr) const { return PtrArrayImpl::indexOf(ptr); }
134 void* getWork() const { return mPtrs; }
135 void sort() { sort(compareT); }
137 void heapSort() { heapSort(compareT); }
139 bool equal(const PtrArray<T>* o, CompareCallback cmp) const { return PtrArrayImpl::equal(*o, (CompareCallbackImpl)cmp); }
140 s32 compare(const PtrArray<T>* o, CompareCallback cmp) const { return PtrArrayImpl::compare(*o, (CompareCallbackImpl)cmp); }
141 T* find(const T* ptr) const;
142 T* find(const T* ptr, CompareCallback cmp) const;
143 s32 search(const T* ptr) const;
144 s32 search(const T* ptr, CompareCallback cmp) const;
145 s32 binarySearch(const T* ptr) const;
146 s32 binarySearch(const T* ptr, CompareCallback cmp) const;
147 bool operator==(const PtrArray<T>&) const;
148 bool operator!=(const PtrArray<T>&) const;
149 bool operator<(const PtrArray<T>&) const;
150 bool operator<=(const PtrArray<T>&) const;
151 bool operator>(const PtrArray<T>&) const;
152 bool operator>=(const PtrArray<T>&) const;
153 void uniq();
155
156public:
158 {
159 public:
160 iterator(T* const* pptr)
161 : mPPtr(pptr)
162 {
163 }
164
165 public:
167 {
168 ++mPPtr;
169 return *this;
170 }
171
172 T& operator*() const
173 {
174 return **mPPtr;
175 }
176
177 T* operator->() const
178 {
179 return *mPPtr;
180 }
181
182 friend bool operator==(const iterator& it1, const iterator& it2)
183 {
184 return it1.mPPtr == it2.mPPtr;
185 }
186
187 friend bool operator!=(const iterator& it1, const iterator& it2)
188 {
189 return !(it1 == it2);
190 }
191
192 T* getPtr() const
193 {
194 return *mPPtr;
195 }
196
197 protected:
198 T* const* mPPtr;
199 };
200
202 {
203 public:
204 constIterator(const T* const* pptr)
205 : mPPtr(pptr)
206 {
207 }
208
209 public:
211 {
212 ++mPPtr;
213 return *this;
214 }
215
216 const T& operator*() const
217 {
218 return **mPPtr;
219 }
220
221 const T* operator->() const
222 {
223 return *mPPtr;
224 }
225
226 friend bool operator==(const constIterator& it1, const constIterator& it2)
227 {
228 return it1.mPPtr == it2.mPPtr;
229 }
230
231 friend bool operator!=(const constIterator& it1, const constIterator& it2)
232 {
233 return !(it1 == it2);
234 }
235
236 const T* getPtr() const
237 {
238 return *mPPtr;
239 }
240
241 private:
242 const T* const* mPPtr;
243 };
244
245 // TODO
247
248 // TODO
250
251public:
253 {
254 return iterator(reinterpret_cast<T**>(mPtrs));
255 }
256
257 iterator end() const
258 {
259 return iterator(reinterpret_cast<T**>(mPtrs) + mPtrNum);
260 }
261
263
265 {
266 return constIterator(reinterpret_cast<T**>(mPtrs));
267 }
269 {
270 return constIterator(reinterpret_cast<T**>(mPtrs) + mPtrNum);
271 }
272
274
277
279
282
284
285protected:
286 static s32 compareT(const T*, const T*);
287};
288
289template <typename T, s32 N>
290class FixedPtrArray : public PtrArray<T>
291{
292public:
294 : PtrArray<T>()
295 {
296 PtrArray<T>::setBuffer(N, mWork);
297 }
298
299protected:
300 void setBuffer(s32 ptrNumMax, void* buf);
301 void allocBuffer(s32 ptrNumMax, Heap* heap, s32 alignment = 4);
302 bool tryAllocBuffer(s32 ptrNumMax, Heap* heap, s32 alignment = 4);
304
305protected:
306 u8 mWork[N*sizeof(void*)];
307};
308
309} // namespace sead
310
311#endif // SEAD_PTR_ARRAY_H_
Definition seadPtrArray.h:291
u8 mWork[N *sizeof(void *)]
Definition seadPtrArray.h:306
void allocBuffer(s32 ptrNumMax, Heap *heap, s32 alignment=4)
bool tryAllocBuffer(s32 ptrNumMax, Heap *heap, s32 alignment=4)
void setBuffer(s32 ptrNumMax, void *buf)
FixedPtrArray()
Definition seadPtrArray.h:293
Definition seadHeap.h:23
Definition seadPtrArray.h:13
void swap(s32 pos1, s32 pos2)
void uniq(CompareCallbackImpl cmp)
void allocBuffer(s32 ptrNumMax, Heap *heap, s32 alignment=4)
Definition seadPtrArray.cpp:24
s32(* CompareCallbackImpl)(const void *, const void *)
Definition seadPtrArray.h:15
void clear()
Definition seadPtrArray.h:36
void insert(s32 pos, void *ptr)
void insertArray(s32 pos, void *array, s32 array_length, s32 elem_size)
void replace(s32 pos, void *ptr)
bool tryAllocBuffer(s32 ptrNumMax, Heap *heap, s32 alignment=4)
PtrArrayImpl & operator=(const PtrArrayImpl &)
s32 indexOf(const void *ptr) const
Definition seadPtrArray.h:80
bool isBufferReady() const
Definition seadPtrArray.h:29
void * unsafeAt(s32 n) const
Definition seadPtrArray.h:56
s32 mPtrNumMax
Definition seadPtrArray.h:102
void erase(s32 pos, s32 num)
void createVacancy(s32 pos, s32 num)
s32 mPtrNum
Definition seadPtrArray.h:101
s32 maxSize() const
Definition seadPtrArray.h:33
void setBuffer(s32 ptrNumMax, void *buf)
Definition seadPtrArray.cpp:7
s32 size() const
Definition seadPtrArray.h:32
s32 binarySearch(const void *ptr, CompareCallbackImpl cmp) const
void heapSort(CompareCallbackImpl cmp)
void * at(s32 n) const
Definition seadPtrArray.h:46
bool equal(const PtrArrayImpl &o, CompareCallbackImpl cmp) const
void ** mPtrs
Definition seadPtrArray.h:103
bool isEmpty() const
Definition seadPtrArray.h:30
s32 search(const void *ptr, CompareCallbackImpl cmp) const
void unsafeResize(s32)
void pushBack(void *ptr)
Definition seadPtrArray.h:60
PtrArrayImpl()
Definition seadPtrArray.h:18
s32 compare(const PtrArrayImpl &o, CompareCallbackImpl cmp) const
bool isFull() const
Definition seadPtrArray.h:31
void erase(s32 pos)
Definition seadPtrArray.h:34
void sort(CompareCallbackImpl cmp)
Definition seadPtrArray.cpp:44
void * back() const
Definition seadPtrArray.h:58
void * find(const void *ptr, CompareCallbackImpl cmp) const
void freeBuffer()
Definition seadPtrArray.cpp:33
void * front() const
Definition seadPtrArray.h:57
void pushFront(void *ptr)
Definition seadPtrArray.h:72
void shuffle(Random *random)
bool checkInsert(s32 pos, s32 num)
Definition seadPtrArray.h:202
friend bool operator!=(const constIterator &it1, const constIterator &it2)
Definition seadPtrArray.h:231
const T * operator->() const
Definition seadPtrArray.h:221
friend bool operator==(const constIterator &it1, const constIterator &it2)
Definition seadPtrArray.h:226
const T & operator*() const
Definition seadPtrArray.h:216
const T * getPtr() const
Definition seadPtrArray.h:236
constIterator & operator++()
Definition seadPtrArray.h:210
const T *const * mPPtr
Definition seadPtrArray.h:242
constIterator(const T *const *pptr)
Definition seadPtrArray.h:204
Definition seadPtrArray.h:158
T & operator*() const
Definition seadPtrArray.h:172
T * operator->() const
Definition seadPtrArray.h:177
friend bool operator!=(const iterator &it1, const iterator &it2)
Definition seadPtrArray.h:187
T * getPtr() const
Definition seadPtrArray.h:192
iterator & operator++()
Definition seadPtrArray.h:166
friend bool operator==(const iterator &it1, const iterator &it2)
Definition seadPtrArray.h:182
iterator(T *const *pptr)
Definition seadPtrArray.h:160
T *const * mPPtr
Definition seadPtrArray.h:198
Definition seadPtrArray.h:249
Definition seadPtrArray.h:246
Definition seadPtrArray.h:111
void * getWork() const
Definition seadPtrArray.h:134
PtrArray()
Definition seadPtrArray.h:116
s32 indexOf(const T *ptr) const
Definition seadPtrArray.h:133
void insert(s32 pos, T *array, s32 array_length)
Definition seadPtrArray.h:131
T * operator[](s32 n) const
Definition seadPtrArray.h:123
bool operator>(const PtrArray< T > &) const
constIterator toConstIterator(s32) const
void heapSort()
Definition seadPtrArray.h:137
constIterator constEnd() const
Definition seadPtrArray.h:268
T * popFront()
Definition seadPtrArray.h:129
T * find(const T *ptr, CompareCallback cmp) const
bool operator==(const PtrArray< T > &) const
void uniq(CompareCallback cmp)
reverseIterator toReverseIterator(s32) const
T * find(const T *ptr) const
s32 binarySearch(const T *ptr) const
s32 compare(const PtrArray< T > *o, CompareCallback cmp) const
Definition seadPtrArray.h:140
void pushFront(T *ptr)
Definition seadPtrArray.h:127
iterator toIterator(s32) const
iterator end() const
Definition seadPtrArray.h:257
constIterator constBegin() const
Definition seadPtrArray.h:264
reverseIterator reverseEnd() const
T * popBack()
Definition seadPtrArray.h:128
s32 binarySearch(const T *ptr, CompareCallback cmp) const
bool operator<(const PtrArray< T > &) const
void sort(CompareCallback cmp)
Definition seadPtrArray.h:136
void pushBack(T *ptr)
Definition seadPtrArray.h:126
void insert(s32 pos, T *ptr)
Definition seadPtrArray.h:130
s32 search(const T *ptr, CompareCallback cmp) const
reverseConstIterator reverseConstEnd() const
T * back() const
Definition seadPtrArray.h:125
void sort()
Definition seadPtrArray.h:135
s32(* CompareCallback)(const T *, const T *)
Definition seadPtrArray.h:113
T * at(s32 n) const
Definition seadPtrArray.h:121
bool equal(const PtrArray< T > *o, CompareCallback cmp) const
Definition seadPtrArray.h:139
reverseConstIterator toReverseConstIterator(s32) const
bool operator<=(const PtrArray< T > &) const
T * unsafeAt(s32 n) const
Definition seadPtrArray.h:122
s32 search(const T *ptr) const
reverseConstIterator reverseConstBegin() const
iterator begin() const
Definition seadPtrArray.h:252
reverseIterator reverseBegin() const
bool operator!=(const PtrArray< T > &) const
static s32 compareT(const T *, const T *)
T * front() const
Definition seadPtrArray.h:124
void heapSort(CompareCallback cmp)
Definition seadPtrArray.h:138
void replace(s32 pos, T *ptr)
Definition seadPtrArray.h:132
bool operator>=(const PtrArray< T > &) const
Definition seadRandom.h:9
Definition seadAssert.h:44
#define SEAD_ASSERT_MSG(condition, format,...)
Definition seadAssert.h:33