5#include <basis/seadAssert.h>
6#include <math/seadMathCalcCommon.h>
8#include <utility/Bitfield.h>
19
20
21
22
23
24
25 template <PoolObject T, u32 N>
27 static_assert(N > 0,
"FixedObjectPool requires N > 0");
33 for (u32 i = 0; i < N; i++) {
34 mFreeIndices[i] = (N-1) - i;
39 if (mFreeCount == 0) {
43 u32 i = mFreeIndices[--mFreeCount];
50 if (obj ==
nullptr) [[unlikely]]
53 SEAD_ASSERT(contains(obj));
55 SEAD_ASSERT(isUsed(i));
59 mFreeIndices[mFreeCount++] = i;
63 return N - mFreeCount;
71 return mUsed.isOnBit(i);
75 return obj >= mWork && obj < mWork + N;
79 void forEach(F fn,
bool ignoreActivity =
false) {
80 forEach_(
this, fn, ignoreActivity);
84 void forEach(F fn,
bool ignoreActivity =
false)
const {
85 forEach_(
this, fn, ignoreActivity);
89 template <
typename F,
typename U>
90 static void forEach_(U* self, F fn,
bool ignoreActivity =
false) {
91 for (u32 i = 0; i < N; i++) {
92 if (ignoreActivity || self->isUsed(i)) {
93 if constexpr (std::is_void_v<std::invoke_result_t<F&, T&>>) {
96 const bool shouldContinue = fn(self->mWork[i]);
97 if (!shouldContinue) {
107 Bitfield<sead::Mathi::roundUpN(N, 32)> mUsed;
A fixed-capacity, allocation-free container holding a pool of objects which get reused on acquire/rel...
Definition ObjectPool.h:26
void release(T *obj)
Definition ObjectPool.h:49
void forEach(F fn, bool ignoreActivity=false)
Definition ObjectPool.h:79
T * acquire()
Definition ObjectPool.h:38
u32 capacity() const
Definition ObjectPool.h:66
FixedObjectPool()
Definition ObjectPool.h:30
u32 size() const
Definition ObjectPool.h:62
bool isUsed(u32 i) const
Definition ObjectPool.h:70
void forEach(F fn, bool ignoreActivity=false) const
Definition ObjectPool.h:84
bool contains(const T *obj) const
Definition ObjectPool.h:74
Definition ObjectPool.h:13
Definition ActorDonutBlock.h:5