2 #ifndef _OBJECTPOOL_HXX_
3 #define _OBJECTPOOL_HXX_
9 template <class X> class ObjectPool
13 std::vector<X*> _chunkList;
14 std::vector<bool> _freeList;
21 for (int i=_nextFree; i< _maxAvail; i++)
22 if (_freeList[i] == true)
30 void checkDelete(int chunkId)
32 int i0 = _chunkSize*chunkId;
33 int i1 =_chunkSize*(chunkId+1);
34 for (int i=i0; i < i1; i++)
35 if (_freeList[i] == false)
37 std::cerr << "a chunk to delete" << std::endl;
38 // compactage des vecteurs un peu lourd, pas necessaire
39 //X* chunk = _chunkList[chunkId];
55 for (int i=0; i<_chunkList.size(); i++)
56 delete [] _chunkList[i];
62 _nextFree = getNextFree();
63 if (_nextFree == _maxAvail)
65 X* newChunk = new X[_chunkSize];
66 _chunkList.push_back(newChunk);
67 _freeList.insert(_freeList.end(), _chunkSize, true);
68 _maxAvail += _chunkSize;
69 _freeList[_nextFree] = false;
70 obj = newChunk; // &newChunk[0];
74 int chunkId = _nextFree/_chunkSize;
75 int rank = _nextFree - chunkId*_chunkSize;
76 _freeList[_nextFree] = false;
77 obj = _chunkList[chunkId] + rank; // &_chunkList[chunkId][rank];
85 long adrobj = (long)(obj);
86 for (int i=0; i< _chunkList.size(); i++)
88 X* chunk = _chunkList[i];
89 long adrmin = (long)(chunk);
90 if (adrobj < adrmin) continue;
91 long adrmax = (long)(chunk + _chunkSize);
92 if (adrobj >= adrmax) continue;
93 int rank = (adrobj -adrmin)/sizeof(X);
94 int toFree = i*_chunkSize + rank;
95 _freeList[toFree] = true;
96 if (toFree < _nextFree) _nextFree = toFree;
98 //checkDelete(i); compactage non fait