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