2 #ifndef B3_RESIZABLE_POOL_H
3 #define B3_RESIZABLE_POOL_H
5 #include "Bullet3Common/b3AlignedObjectArray.h"
9 B3_POOL_HANDLE_TERMINAL_FREE = -1,
10 B3_POOL_HANDLE_TERMINAL_USED = -2
14 struct b3PoolBodyHandle : public U
16 B3_DECLARE_ALIGNED_ALLOCATOR();
19 void setNextFree(int next)
21 m_nextFreeHandle = next;
23 int getNextFree() const
25 return m_nextFreeHandle;
33 b3AlignedObjectArray<T> m_bodyHandles;
34 int m_numUsedHandles; // number of active handles
35 int m_firstFreeHandle; // free handles list
37 T* getHandleInternal(int handle)
39 return &m_bodyHandles[handle];
41 const T* getHandleInternal(int handle) const
43 return &m_bodyHandles[handle];
52 virtual ~b3ResizablePool()
58 int getNumHandles() const
60 return m_bodyHandles.size();
63 void getUsedHandles(b3AlignedObjectArray<int>& usedHandles) const
65 for (int i = 0; i < m_bodyHandles.size(); i++)
67 if (m_bodyHandles[i].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED)
69 usedHandles.push_back(i);
74 T* getHandle(int handle)
76 b3Assert(handle >= 0);
77 b3Assert(handle < m_bodyHandles.size());
78 if ((handle < 0) || (handle >= m_bodyHandles.size()))
83 if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED)
85 return &m_bodyHandles[handle];
89 const T* getHandle(int handle) const
91 b3Assert(handle >= 0);
92 b3Assert(handle < m_bodyHandles.size());
93 if ((handle < 0) || (handle >= m_bodyHandles.size()))
98 if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED)
100 return &m_bodyHandles[handle];
105 void increaseHandleCapacity(int extraCapacity)
107 int curCapacity = m_bodyHandles.size();
108 //b3Assert(curCapacity == m_numUsedHandles);
109 int newCapacity = curCapacity + extraCapacity;
110 m_bodyHandles.resize(newCapacity);
113 for (int i = curCapacity; i < newCapacity; i++)
114 m_bodyHandles[i].setNextFree(i + 1);
116 m_bodyHandles[newCapacity - 1].setNextFree(-1);
118 m_firstFreeHandle = curCapacity;
122 m_numUsedHandles = 0;
123 m_firstFreeHandle = -1;
125 increaseHandleCapacity(1);
130 m_bodyHandles.resize(0);
131 m_firstFreeHandle = -1;
132 m_numUsedHandles = 0;
137 b3Assert(m_firstFreeHandle >= 0);
139 int handle = m_firstFreeHandle;
140 m_firstFreeHandle = getHandleInternal(handle)->getNextFree();
143 if (m_firstFreeHandle < 0)
145 //int curCapacity = m_bodyHandles.size();
146 int additionalCapacity = m_bodyHandles.size();
147 increaseHandleCapacity(additionalCapacity);
149 getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
151 getHandleInternal(handle)->setNextFree(B3_POOL_HANDLE_TERMINAL_USED);
152 getHandleInternal(handle)->clear();
156 void freeHandle(int handle)
158 b3Assert(handle >= 0);
160 if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED)
162 getHandleInternal(handle)->clear();
163 getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
164 m_firstFreeHandle = handle;
169 ///end handle management
171 #endif //B3_RESIZABLE_POOL_H