//----------------------------------------------------------------- void* StackMemoryManager::growObject( size_t amount ) { size_t currentSize = getTopObjectSize(); size_t newSize = currentSize + amount; size_t oldCurrentPos = mFrames[ mActiveFrame ].mCurrentPosition; size_t newDataSizePos = (mFrames[ mActiveFrame ].mCurrentPosition + amount) - sizeof(newSize); size_t newCurrentPos = newDataSizePos + sizeof(newSize); if ( newCurrentPos > mFrames[ mActiveFrame ].mMaxMemoryBlob ) { size_t numOfAllocs = 0; while ( newCurrentPos > mFrames[ mActiveFrame ].mMaxMemoryBlob ) { if (!allocateMoreMemory()) return 0; newDataSizePos = mFrames[ mActiveFrame ].mCurrentPosition + newSize; newCurrentPos = newDataSizePos + sizeof(newSize); numOfAllocs++; } void* source = mFrames[ mActiveFrame-numOfAllocs ].mMemoryBlob + oldCurrentPos - currentSize - sizeof(currentSize); memcpy(mFrames[ mActiveFrame ].mMemoryBlob, source, currentSize); // delete last object in last frame mFrames[ mActiveFrame-numOfAllocs ].mCurrentPosition -= ( currentSize + sizeof(mFrames[ mActiveFrame-numOfAllocs ].mCurrentPosition) ); } mFrames[ mActiveFrame ].mCurrentPosition = newCurrentPos; writeNewObjectSize(newDataSizePos, newSize); return top(); }
//----------------------------------------------------------------- void StackMemoryManager::growObject( size_t amount ) { size_t currentSize = getTopObjectSize(); size_t newSize = currentSize + amount; size_t newDataSizePos = mCurrentPosition + newSize; mCurrentPosition = newDataSizePos + sizeof(newSize); // TODO check if new size exceeds allocated memory !!! writeNewObjectSize(newDataSizePos, newSize); }
//-------------------------------------------------------------------- void StackMemoryManager::deleteObject() { mFrames[ mActiveFrame ].mCurrentPosition -= ( getTopObjectSize() + sizeof(mFrames[ mActiveFrame ].mCurrentPosition) ); while ( mFrames[ mActiveFrame ].mCurrentPosition == 0 && mActiveFrame != 0 ) { delete[] mFrames[ mActiveFrame ].mMemoryBlob; mFrames[ mActiveFrame-- ].mMemoryBlob = 0; } }
//-------------------------------------------------------------------- void StackMemoryManager::deleteObject() { //mCurrentPosition -= ( (*((size_t*)mMemoryBlob[mCurrentPosition - 1])) + sizeof(mCurrentPosition)); //mCurrentPosition -= ( (*((size_t*)(mMemoryBlob + mCurrentPosition - sizeof(mCurrentPosition)) )) + sizeof(mCurrentPosition)); mCurrentPosition -= ( getTopObjectSize() + sizeof(mCurrentPosition) ); }
//----------------------------------------------------------------- void* StackMemoryManager::top() { return mFrames[ mActiveFrame ].mCurrentPosition != 0 ? (void*)(mFrames[ mActiveFrame ].mMemoryBlob + mFrames[ mActiveFrame ].mCurrentPosition - getTopObjectSize() - sizeof(mFrames[ mActiveFrame ].mCurrentPosition)) : 0; }