#ifndef __SCRATCH_ARRAY_H__ #define __SCRATCH_ARRAY_H__ #include #include // // Designed for quick alloc/dealloc // template class SubArray { public: SubArray() { Invalidate(); } SubArray( T* ipData, int iSize ) { mpData = ipData; mSize = iSize; } ~SubArray() { if( IsValid() ) { rAssert(false); Invalidate(); } } T& operator[]( int iIndex ) { rAssert( IsValid() ); rAssert( (iIndex < mSize) && (iIndex > -1) ); return mpData[iIndex]; } void SetAll( T& irDefaultValue ) { rAssert( IsValid() ); for(int i=0; i& orSplitArray, int iSplitSize ) { rAssert( IsValid() ); rAssert( iSplitSize <= mSize ); orSplitArray.mSize = iSplitSize; orSplitArray.mpData = mpData + (mSize-iSplitSize); if( mSize == iSplitSize ) Invalidate(); } void AbsorbR( SubArray& orAdjArray ) { rAssert(IsValid()); rAssert(CanAbsorbR( orAdjArray )); mSize += orAdjArray.mSize; orAdjArray.Invalidate(); } void Init( int iSize, T* ipData ) { rAssert(!IsValid()); mSize = iSize; mpData = ipData; } bool CanAbsorbR( SubArray& irAdjArray ) { if( mpData+mSize == orSplitArray.mpData ) return true; else return false; } bool IsValid() { return (mpData!=NULL)&&(mSize!=SRR_ERR_INDEX); } void Invalidate() { mSize = SRR_ERR_INDEX; mpData = NULL; } T* mpData; int mSize; protected: }; /* template class ScratchArray : protected FixedArray { public: ScratchArray(){} ~ScratchArray(){} ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void Init( int iSize ) { Allocate( iSize ); CleanFreeSlots(); } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void SetAll( T& irDefaultValue ) { for(int i=0; i& orSubArray, int iSize ) { int FSIndex = IsThereSpace(iSize); //get free frag slot index if( FSIndex != SRR_ERR_INDEX ) { Alloc( orSubArray, iSize, FSIndex ); } else { opSubArray = NULL; } } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void Release( SubArray& opSubArray ) { all of this work is to set up a set of scratchpad allocators to do bin counts to better divide the data based on good spreads it will run faster... yay. } protected: ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void Alloc( SubArray& orSubArray, int iSize, int iHoleIndex ) { mAllocCount++; mFreeHoles[iHoleIndex].SplitOffEnd( orSubArray, iSize ); } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void Free( SubArray& orSubArray ) { int AdjLIndex; FindAdjLHole( AdjLIndex, orSubArray ); if( AdjLIndex != SRR_ERR_INDEX ) { mFreeHoles[AdjLIndex].AbsorbR(orSubArray); } else { AddFreeHole( orSubArray, InvalidFreeHole() ); } } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void FindAdjLHole( int& i, SubArray& orSubArray ) { rAssert((orSubArray.mpData >= mpData) && (orSubArray.mpData < (mpData+mSize))); for( i=0; i& orSubArray, int& i ) { rAssert( i!=SRR_ERR_INDEX ); } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// void CleanFreeHoles() { for( int i=0; i= iSize) && (mFreeHoles[i].mSize <= mFreeHoles[svfi].mSize) ) svfi = i; } } if( mAllocCount < msMaxFreeHoles-1 ) { return svfi; } else { return SRR_ERR_INDEX; } } static const int msMaxFreeHoles = 10; int mAllocCount; SubArray mFreeHoles[msMaxFreeHoles]; }; */ #endif