Skip to content

Commit 749c4c9

Browse files
committed
use free indexes stack
1 parent fc7eaf2 commit 749c4c9

File tree

1 file changed

+11
-32
lines changed

1 file changed

+11
-32
lines changed

Client/game_sa/CDynamicPool.h

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,57 +19,36 @@ template <typename PoolObjT>
1919
class CDynamicPoolPart
2020
{
2121
public:
22-
explicit CDynamicPoolPart(std::size_t size) : m_size{size}, m_usedSize{0}, m_lastFreeSlot{0}
22+
explicit CDynamicPoolPart(std::size_t size) : m_size{size}
2323
{
2424
m_items = std::make_unique<PoolObjT[]>(size);
25-
m_usedSlots = std::make_unique<bool[]>(size);
25+
m_unusedIndexes.reserve(size);
26+
for (std::size_t i = 0; i < size; i++)
27+
m_unusedIndexes.push_back(i);
2628
}
2729

2830
PoolObjT* AllocateItem()
2931
{
30-
bool flipped = false;
31-
while (true)
32-
{
33-
if (m_usedSlots[m_lastFreeSlot])
34-
{
35-
m_lastFreeSlot++;
36-
if (m_lastFreeSlot >= m_size)
37-
{
38-
if (flipped)
39-
return nullptr;
40-
m_lastFreeSlot = 0;
41-
flipped = true;
42-
}
43-
}
44-
else
45-
{
46-
m_usedSlots[m_lastFreeSlot] = true;
47-
m_usedSize++;
48-
return &m_items[m_lastFreeSlot];
49-
}
50-
}
32+
std::size_t index = m_unusedIndexes.back();
33+
m_unusedIndexes.pop_back();
34+
return &m_items[index];
5135
}
5236

5337
void RemoveItem(PoolObjT* item)
5438
{
5539
auto pos = item - m_items.get();
56-
assert(m_usedSlots[pos], "Invalid item for CDynamicPoolPart::RemoveItem");
57-
58-
m_usedSlots[pos] = false;
59-
m_usedSize--;
40+
m_unusedIndexes.push_back(pos);
6041
}
6142

6243
bool OwnsItem(PoolObjT* item) const noexcept { return item >= m_items.get() && item < m_items.get() + m_size; }
63-
bool HasFreeSize() const noexcept { return m_size != m_usedSize; }
44+
bool HasFreeSize() const noexcept { return m_unusedIndexes.size() != 0; }
6445
std::size_t GetCapacity() const noexcept { return m_size; }
65-
std::size_t GetUsedSize() const noexcept { return m_usedSize; }
46+
std::size_t GetUsedSize() const noexcept { return m_size - m_unusedIndexes.size(); }
6647

6748
private:
6849
std::unique_ptr<PoolObjT[]> m_items;
69-
std::unique_ptr<bool[]> m_usedSlots;
50+
std::vector<std::size_t> m_unusedIndexes;
7051
const std::size_t m_size;
71-
std::size_t m_usedSize;
72-
std::size_t m_lastFreeSlot;
7352
};
7453

7554
template <std::size_t InitialSize>

0 commit comments

Comments
 (0)