3#include <basis/seadNew.h>
4#include <container/seadFreeList.h>
5#include <container/seadListImpl.h>
6#include <prim/seadPtrUtil.h>
43 setBuffer(limitNum, buf);
46 void allocBuffer(s32 limitNum, s32 alignment = cDefaultAlignment)
48 if (!tryAllocBuffer(limitNum, alignment))
56 if (!tryAllocBuffer(limitNum, heap, alignment))
68 SEAD_ASSERT_MSG(
false,
"limitNum[%d] must be larger than zero", limitNum);
72 void* buf =
new(
nullptr, alignment) u8[limitNum *
sizeof(Node)];
78 setBuffer(limitNum, buf);
88 SEAD_ASSERT_MSG(
false,
"limitNum[%d] must be larger than zero", limitNum);
92 void* buf =
new(heap, alignment) u8[limitNum *
sizeof(Node)];
98 setBuffer(limitNum, buf);
119 SEAD_ASSERT_MSG(
false,
"limitNum[%d] must be larger than zero", limitNum);
130 mLimitNum = limitNum;
134 bool isFull()
const {
return mCount >= mLimitNum; }
298 T*
nth(s32 index)
const {
return listNodeToObjWithNullCheck(ListImpl::nth(index)); }
299 s32 indexOf(
const T* obj)
const {
return ListImpl::indexOf(objToListNode(obj)); }
310 ListImpl::sort(offsetof(Node, link),
reinterpret_cast<CompareCallbackImpl>(cmp));
316 ListImpl::mergeSort(offsetof(Node, link),
reinterpret_cast<CompareCallbackImpl>(cmp));
320 T*
find(
const T* obj, CompareCallback cmp)
const
322 return listNodeToObjWithNullCheck(ListImpl::find(obj, offsetof(Node, link),
reinterpret_cast<CompareCallbackImpl>(cmp)));
363 ListNode* next =
static_cast<ListNode*>(PtrUtil::addOffset(mPtr, offsetof(Node, link)))->next();
364 mPtr =
static_cast<T*>(PtrUtil::addOffset(next, -
static_cast<intptr_t>(offsetof(Node, link))));
377 friend class constIterator;
395 const ListNode* next =
static_cast<
const ListNode*>(PtrUtil::addOffset(mPtr, offsetof(Node, link)))->next();
396 mPtr =
static_cast<
const T*>(PtrUtil::addOffset(next, -
static_cast<intptr_t>(offsetof(Node, link))));
421 mPtr =
static_cast<T*>(PtrUtil::addOffset(mNext, -
static_cast<intptr_t>(offsetof(Node, link))));
447 ListNode* prev =
static_cast<ListNode*>(PtrUtil::addOffset(mPtr, offsetof(Node, link)))->prev();
448 mPtr =
static_cast<T*>(PtrUtil::addOffset(prev, -
static_cast<intptr_t>(offsetof(Node, link))));
461 friend class reverseConstIterator;
479 const ListNode* prev =
static_cast<
const ListNode*>(PtrUtil::addOffset(mPtr, offsetof(Node, link)))->prev();
480 mPtr =
static_cast<
const T*>(PtrUtil::addOffset(prev, -
static_cast<intptr_t>(offsetof(Node, link))));
505 mPtr =
static_cast<T*>(PtrUtil::addOffset(mPrev, -
static_cast<intptr_t>(offsetof(Node, link))));
562 return static_cast<ListNode*>(PtrUtil::addOffset(obj, offsetof(Node, link)));
567 return static_cast<T*>(PtrUtil::addOffset(node, -
static_cast<intptr_t>(offsetof(Node, link))));
580template <
typename T, s32 N>
587 ObjList<T>::setBuffer(N, mInternalWork);
590 void allocBuffer(s32 limitNum, s32 alignment = cDefaultAlignment) =
delete;
591 void allocBuffer(s32 limitNum,
Heap* heap, s32 alignment = cDefaultAlignment) =
delete;
Definition seadObjList.h:582
void setBuffer(s32 limitNum, void *buf)=delete
u8 mInternalWork[N *sizeof(typename ObjList< T >::Node)]
Definition seadObjList.h:598
bool tryAllocBuffer(s32 limitNum, s32 alignment=cDefaultAlignment)=delete
FixedObjList()
Definition seadObjList.h:584
void allocBuffer(s32 limitNum, s32 alignment=cDefaultAlignment)=delete
bool tryAllocBuffer(s32 limitNum, Heap *heap, s32 alignment=cDefaultAlignment)=delete
void allocBuffer(s32 limitNum, Heap *heap, s32 alignment=cDefaultAlignment)=delete
Definition seadFreeList.h:10
void put(void *ptr)
Definition seadFreeList.h:54
FreeList()
Definition seadFreeList.h:12
void * work() const
Definition seadFreeList.h:52
void * get()
Definition seadFreeList.h:36
void cleanup()
Definition seadFreeList.h:46
Definition seadListImpl.h:51
void moveBefore(ListNode *basis, ListNode *n)
void swap(ListNode *n1, ListNode *n2)
void pushFront(ListNode *n)
Definition seadListImpl.h:93
ListNode * back() const
Definition seadListImpl.h:121
void insertAfter(ListNode *basis, ListNode *n)
Definition seadListImpl.h:108
void insertBefore(ListNode *basis, ListNode *n)
Definition seadListImpl.h:102
void pushBack(ListNode *n)
Definition seadListImpl.h:87
void moveAfter(ListNode *basis, ListNode *n)
ListNode mStartEnd
Definition seadListImpl.h:146
void erase(ListNode *n)
Definition seadListImpl.h:114
ListNode * front() const
Definition seadListImpl.h:120
Definition seadListImpl.h:11
ListNode * prev() const
Definition seadListImpl.h:25
ListNode * next() const
Definition seadListImpl.h:24
ListNode()
Definition seadListImpl.h:13
Definition seadObjList.h:381
constIterator(const iterator &it)
Definition seadObjList.h:388
const T * mPtr
Definition seadObjList.h:407
constIterator(const T *ptr)
Definition seadObjList.h:383
friend bool operator!=(const constIterator &lhs, const constIterator &rhs)
Definition seadObjList.h:404
const T * operator->() const
Definition seadObjList.h:401
constIterator & operator++()
Definition seadObjList.h:393
const T & operator*() const
Definition seadObjList.h:400
friend bool operator==(const constIterator &lhs, const constIterator &rhs)
Definition seadObjList.h:403
Definition seadObjList.h:354
T * mPtr
Definition seadObjList.h:375
friend bool operator==(const iterator &lhs, const iterator &rhs)
Definition seadObjList.h:371
iterator(T *ptr)
Definition seadObjList.h:356
T * operator->() const
Definition seadObjList.h:369
iterator & operator++()
Definition seadObjList.h:361
friend bool operator!=(const iterator &lhs, const iterator &rhs)
Definition seadObjList.h:372
T & operator*() const
Definition seadObjList.h:368
Definition seadObjList.h:465
const T * operator->() const
Definition seadObjList.h:485
reverseConstIterator & operator++()
Definition seadObjList.h:477
friend bool operator==(const reverseConstIterator &lhs, const reverseConstIterator &rhs)
Definition seadObjList.h:487
friend bool operator!=(const reverseConstIterator &lhs, const reverseConstIterator &rhs)
Definition seadObjList.h:488
reverseConstIterator(const T *ptr)
Definition seadObjList.h:467
const T & operator*() const
Definition seadObjList.h:484
const T * mPtr
Definition seadObjList.h:491
reverseConstIterator(const reverseIterator &it)
Definition seadObjList.h:472
Definition seadObjList.h:438
T * mPtr
Definition seadObjList.h:459
T & operator*() const
Definition seadObjList.h:452
reverseIterator(T *ptr)
Definition seadObjList.h:440
friend bool operator==(const reverseIterator &lhs, const reverseIterator &rhs)
Definition seadObjList.h:455
T * operator->() const
Definition seadObjList.h:453
reverseIterator & operator++()
Definition seadObjList.h:445
friend bool operator!=(const reverseIterator &lhs, const reverseIterator &rhs)
Definition seadObjList.h:456
Definition seadObjList.h:495
reverseRobustIterator(T *ptr)
Definition seadObjList.h:497
ListNode * mPrev
Definition seadObjList.h:518
T * mPtr
Definition seadObjList.h:517
T * operator->() const
Definition seadObjList.h:511
friend bool operator==(const reverseRobustIterator &lhs, const reverseRobustIterator &rhs)
Definition seadObjList.h:513
T & operator*() const
Definition seadObjList.h:510
reverseRobustIterator & operator++()
Definition seadObjList.h:503
friend bool operator!=(const reverseRobustIterator &lhs, const reverseRobustIterator &rhs)
Definition seadObjList.h:514
Definition seadObjList.h:411
T * mPtr
Definition seadObjList.h:433
T * operator->() const
Definition seadObjList.h:427
robustIterator(T *ptr)
Definition seadObjList.h:413
friend bool operator!=(const robustIterator &lhs, const robustIterator &rhs)
Definition seadObjList.h:430
T & operator*() const
Definition seadObjList.h:426
ListNode * mNext
Definition seadObjList.h:434
robustIterator & operator++()
Definition seadObjList.h:419
friend bool operator==(const robustIterator &lhs, const robustIterator &rhs)
Definition seadObjList.h:429
Definition seadObjList.h:12
void setBuffer(s32 limitNum, void *buf)
Definition seadObjList.h:115
reverseConstIterator reverseBegin() const
Definition seadObjList.h:534
iterator begin()
Definition seadObjList.h:522
void moveAfter(T *basis, T *obj)
Definition seadObjList.h:304
void allocBuffer(s32 limitNum, s32 alignment=cDefaultAlignment)
Definition seadObjList.h:46
iterator end()
Definition seadObjList.h:524
bool isFull() const
Definition seadObjList.h:134
void mergeSort(CompareCallback cmp)
Definition seadObjList.h:314
T * next(const T *obj) const
Definition seadObjList.h:287
bool tryAllocBuffer(s32 limitNum, Heap *heap, s32 alignment=cDefaultAlignment)
Definition seadObjList.h:82
T * find(const T *obj) const
Definition seadObjList.h:319
T * birthFront()
Definition seadObjList.h:185
void sort()
Definition seadObjList.h:307
s32 maxSize() const
Definition seadObjList.h:136
constIterator constEnd() const
Definition seadObjList.h:528
reverseIterator reverseBegin()
Definition seadObjList.h:533
void uniq()
Definition seadObjList.h:325
T * listNodeToObj(const ListNode *node) const
Definition seadObjList.h:565
bool tryAllocBuffer(s32 limitNum, s32 alignment=cDefaultAlignment)
Definition seadObjList.h:62
s32 mLimitNum
Definition seadObjList.h:577
void moveBefore(T *basis, T *obj)
Definition seadObjList.h:305
reverseConstIterator reverseConstBegin() const
Definition seadObjList.h:538
T * birthAfter(const T *basis)
Definition seadObjList.h:239
void mergeSort()
Definition seadObjList.h:313
ObjList()
Definition seadObjList.h:31
T * tryBirthBack()
Definition seadObjList.h:172
static s32 compareT(const T *a, const T *b)
Definition seadObjList.h:545
constIterator end() const
Definition seadObjList.h:525
bool isNodeLinked(const T *obj) const
Definition seadObjList.h:301
void uniq(CompareCallback cmp)
Definition seadObjList.h:326
T * birthBack()
Definition seadObjList.h:158
constIterator constBegin() const
Definition seadObjList.h:527
FreeList mFreeList
Definition seadObjList.h:576
void allocBuffer(s32 limitNum, Heap *heap, s32 alignment=cDefaultAlignment)
Definition seadObjList.h:54
void freeBuffer()
Definition seadObjList.h:102
T * listNodeToObjWithNullCheck(const ListNode *node) const
Definition seadObjList.h:570
robustIterator robustEnd()
Definition seadObjList.h:531
reverseRobustIterator reverseRobustEnd()
Definition seadObjList.h:542
T * birthBefore(const T *basis)
Definition seadObjList.h:212
T * nth(s32 index) const
Definition seadObjList.h:298
ListNode * objToListNode(const T *obj) const
Definition seadObjList.h:560
ObjList(s32 limitNum, void *buf)
Definition seadObjList.h:38
T * back() const
Definition seadObjList.h:274
T * find(const T *obj, CompareCallback cmp) const
Definition seadObjList.h:320
reverseIterator reverseEnd()
Definition seadObjList.h:535
T * tryBirthBefore(const T *basis)
Definition seadObjList.h:226
reverseConstIterator reverseEnd() const
Definition seadObjList.h:536
robustIterator robustBegin()
Definition seadObjList.h:530
reverseConstIterator reverseConstEnd() const
Definition seadObjList.h:539
void erase(T *obj)
Definition seadObjList.h:266
void sort(CompareCallback cmp)
Definition seadObjList.h:308
T * front() const
Definition seadObjList.h:273
bool isBufferReady() const
Definition seadObjList.h:133
void swap(T *obj1, T *obj2)
Definition seadObjList.h:303
reverseRobustIterator reverseRobustBegin()
Definition seadObjList.h:541
void clear()
Definition seadObjList.h:138
T * tryBirthFront()
Definition seadObjList.h:199
constIterator begin() const
Definition seadObjList.h:523
s32 indexOf(const T *obj) const
Definition seadObjList.h:299
T * prev(const T *obj) const
Definition seadObjList.h:276
T * tryBirthAfter(const T *basis)
Definition seadObjList.h:253
Definition seadAssert.h:44
#define SEAD_ASSERT(condition)
Definition seadAssert.h:24
#define SEAD_ASSERT_MSG(condition, format,...)
Definition seadAssert.h:33
Definition seadObjList.h:15
Node()
Definition seadObjList.h:18
ListNode link
Definition seadObjList.h:25
T item
Definition seadObjList.h:24