@@ -19,57 +19,36 @@ template <typename PoolObjT>
1919class CDynamicPoolPart
2020{
2121public:
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
6748private:
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
7554template <std::size_t InitialSize>
0 commit comments