21 template<
class T,
class I,
class R = DtNullRemoval>
47 std::pair<int, int>
remove(
const R& removalPredicate);
56 size_t size(
void)
const;
65 void reserve(
size_t reserveSize);
68 const T*
data(
void)
const;
92 template<
class T,
class I,
class R>
97 template<
class T,
class I,
class R>
103 template<
class T,
class I,
class R>
107 for (
typename ListFreeBlocks::iterator it = myListFreeBlocks.begin(); it != myListFreeBlocks.end(); ++it)
110 if (sizeRequired <= block.
size)
113 if (block.
size == sizeRequired)
115 myListFreeBlocks.erase(it);
120 block.
size = block.
size - sizeRequired;
127 if (startIndex == -1)
130 myInitializerForT(info);
132 startIndex = myVectorOfTs.size();
133 myVectorOfTs.resize(myVectorOfTs.size() + sizeRequired, info);
139 template<
class T,
class I,
class R>
142 std::cout <<
"free blocks: start" << std::endl;
143 for (
typename ListFreeBlocks::iterator it = myListFreeBlocks.begin(); it != myListFreeBlocks.end(); ++it)
145 std::cout <<
"block: start: " << it->startIndex <<
" size: " << it->size << std::endl;
147 std::cout <<
"free blocks: end" << std::endl << std::endl;
150 template<
class T,
class I,
class R>
153 return myVectorOfTs.size();
156 template<
class T,
class I,
class R>
159 return myVectorOfTs[index];
162 template<
class T,
class I,
class R>
165 return myVectorOfTs[index];
168 template<
class T,
class I,
class R>
174 bool removalStarted =
false;
175 for (
typename VectorOfTs::iterator it = myVectorOfTs.begin(); it != myVectorOfTs.end(); ++it, ++index)
178 if (removalPredicate(info))
180 if (removalStarted ==
false)
182 removalStarted =
true;
189 myInitializerForT(info);
194 if(!(startIndex < (
int)myVectorOfTs.size()))
196 std::cout <<
"start index not valid!!"<<std::endl;
200 if(!(endIndex < (
int)myVectorOfTs.size()))
202 std::cout <<
"end index not valid!!" << std::endl;
205 updateFreeBlocks(startIndex, endIndex);
207 std::pair<int, int> startAndEnd;
208 startAndEnd.first = startIndex;
209 startAndEnd.second = endIndex;
214 template<
class T,
class I,
class R>
215 void DtReusableMemoryVector<T, I, R>::DtReusableMemoryVector::removeIndices(
int startIndex,
int endIndex)
218 if (!(startIndex < (
int)myVectorOfTs.size()))
220 std::cout <<
"start index not valid!!" << std::endl;
224 if (!(endIndex < (
int)myVectorOfTs.size()))
226 std::cout <<
"end index not valid!!" << std::endl;
229 for(
int currIndex = startIndex; currIndex<=endIndex; ++currIndex)
231 T& info = myVectorOfTs[currIndex];
232 myInitializerForT(info);
235 updateFreeBlocks(startIndex, endIndex);
238 template<
class T,
class I,
class R>
241 myVectorOfTs.reserve(reserveSize);
244 template<
class T,
class I,
class R>
247 return myVectorOfTs.data();
250 template<
class T,
class I,
class R>
255 block.
size = endIndex - startIndex + 1;
258 for (
auto freeBlockItr = myListFreeBlocks.begin(); freeBlockItr != myListFreeBlocks.end();)
260 auto nextItr = freeBlockItr;
262 Block& freeBlock = *freeBlockItr;
267 myListFreeBlocks.erase(freeBlockItr);
274 myListFreeBlocks.erase(freeBlockItr);
276 freeBlockItr = nextItr;
279 myListFreeBlocks.insert(myListFreeBlocks.end(), block);
std::vector< T > VectorOfTs
Definition: DtReusableMemoryVector.h:87
std::list< Block > ListFreeBlocks
Definition: DtReusableMemoryVector.h:81
size_t size
Definition: DtReusableMemoryVector.h:78
DtReusableMemoryVector()
constructor
Definition: DtReusableMemoryVector.h:93
~DtReusableMemoryVector()
destructor
Definition: DtReusableMemoryVector.h:98
void printFreeBlocks(void)
debug printout of the free blocks that are available
Definition: DtReusableMemoryVector.h:140
VectorOfTs myVectorOfTs
Definition: DtReusableMemoryVector.h:88
ListFreeBlocks myListFreeBlocks
Definition: DtReusableMemoryVector.h:83
void removeIndices(int startIndex, int endIndex)
remove a range of indices, inclusive
size_t size(void) const
current size of the vector
Definition: DtReusableMemoryVector.h:151
int startIndex
Definition: DtReusableMemoryVector.h:77
void reserve(size_t reserveSize)
reserve a block of memory for this vector of a specific size
Definition: DtReusableMemoryVector.h:239
int findFreeBlock(const size_t sizeRequired)
get an available free block or add one to the end of the vector if one is not available ...
Definition: DtReusableMemoryVector.h:104
const T & operator[](int index) const
access an element in the vector via index
Definition: DtReusableMemoryVector.h:157
Definition: DtReusableMemoryVector.h:31
block of free data in the vector
Definition: DtReusableMemoryVector.h:75
#define ASSERT_PREDICATE(p)
Definition: DtAssert.h:28
I myInitializerForT
Definition: DtReusableMemoryVector.h:85
const T * data(void) const
get the pointer to the raw data in the vector
Definition: DtReusableMemoryVector.h:245
Definition: DtReusableMemoryVector.h:19
void updateFreeBlocks(int startIndex, int endIndex)
add a new free block or combine it with free blocks already in the list
Definition: DtReusableMemoryVector.h:251