-----------------------------------------------------------------------------------
| 256 | } |
| 257 | //----------------------------------------------------------------------------------- |
| 258 | void ArrayMemoryManager::defragment() |
| 259 | { |
| 260 | // Sort, last values first. This may improve performance in some |
| 261 | // scenarios by reducing the amount of data to be shifted |
| 262 | std::sort( mAvailableSlots.begin(), mAvailableSlots.end(), std::greater<size_t>() ); |
| 263 | SlotsVec::const_iterator itor = mAvailableSlots.begin(); |
| 264 | SlotsVec::const_iterator endt = mAvailableSlots.end(); |
| 265 | |
| 266 | while( itor != endt ) |
| 267 | { |
| 268 | // First see if we have a continuous range of unused slots |
| 269 | size_t lastRange = 1; |
| 270 | SlotsVec::const_iterator it = itor + 1; |
| 271 | while( it != endt && ( *itor - lastRange ) == *it ) |
| 272 | { |
| 273 | ++lastRange; |
| 274 | ++it; |
| 275 | } |
| 276 | |
| 277 | size_t i = 0; |
| 278 | const size_t newEnd = *itor + 1; |
| 279 | MemoryPoolVec::iterator itPools = mMemoryPools.begin(); |
| 280 | MemoryPoolVec::iterator enPools = mMemoryPools.end(); |
| 281 | |
| 282 | // Shift everything N slots (N = lastRange) |
| 283 | while( itPools != enPools ) |
| 284 | { |
| 285 | char *dstPtr = *itPools + ( newEnd - lastRange ) * mElementsMemSizes[i]; |
| 286 | size_t indexDst = ( newEnd - lastRange ) % ARRAY_PACKED_REALS; |
| 287 | char *srcPtr = *itPools + newEnd * mElementsMemSizes[i]; |
| 288 | size_t indexSrc = newEnd % ARRAY_PACKED_REALS; |
| 289 | size_t numSlots = ( mUsedMemory - newEnd ); |
| 290 | size_t numFreeSlots = lastRange; |
| 291 | mCleanupRoutines[i]( dstPtr, indexDst, srcPtr, indexSrc, numSlots, numFreeSlots, |
| 292 | mElementsMemSizes[i] ); |
| 293 | ++i; |
| 294 | ++itPools; |
| 295 | } |
| 296 | |
| 297 | mUsedMemory -= lastRange; |
| 298 | initializeEmptySlots( mUsedMemory ); |
| 299 | |
| 300 | mRebaseListener->performCleanup( mLevel, mMemoryPools, mElementsMemSizes, |
| 301 | ( newEnd - lastRange ), lastRange ); |
| 302 | |
| 303 | itor += static_cast<ptrdiff_t>( lastRange ); |
| 304 | } |
| 305 | |
| 306 | mAvailableSlots.clear(); |
| 307 | } |
| 308 | //----------------------------------------------------------------------------------- |
| 309 | void ArrayMemoryManager::shrinkToFit() |
| 310 | { |
nothing calls this directly
no test coverage detected