void RemoveUnusedFrames() // frames count will not go below t_initialFrames { for( uiw frame = 0; frame < _o_frames.Size() && _o_frames.Size() >= t_initialFrames; ++frame ) { if( _o_frames[ frame ].used == 0 ) { _o_frames.Erase( frame, 1 ); --frame; } } }
X &Enumerate( uiw *p_frame, uiw *p_index ) { ASSUME( p_frame && p_index ); for( ; ; ) { uiw frame = *p_frame; uiw index = *p_index; ++*p_index; if( *p_index == t_frameSize ) { *p_index = 0; ++*p_frame; } if( frame == _o_frames.Size() ) { *p_frame = uiw_max; return _o_frames[ 0 ].p_mem[ 0 ]; } if( !_IsFree( &_o_frames[ frame ].p_mem[ index ] ) ) { return _o_frames[ frame ].p_mem[ index ]; } } }
void RemoveByFrameIndex( uiw frame, uiw index ) { ASSUME( frame < _o_frames.Size() && index < t_frameSize ); ASSUME( !_IsFree( &_o_frames[ frame ].p_mem[ index ] ) ); _o_frames[ frame ].p_mem[ index ].~X(); _SetFree( &_o_frames[ frame ].p_mem[ index ] ); --_o_frames[ frame ].used; }
uiw Size() { uiw size = 0; for( uiw frame = 0; frame < _o_frames.Size(); ++frame ) { size += _o_frames[ frame ].used; } return size; }
X *AddUninit() { for( uiw frame = 0; frame < _o_frames.Size(); ++frame ) { if( _o_frames[ frame ].used < t_frameSize ) { for( uiw index = 0; ; ++index ) { ASSUME( index < t_frameSize ); if( _IsFree( _o_frames[ frame ].p_mem + index ) ) { ++_o_frames[ frame ].used; return &_o_frames[ frame ].p_mem[ index ]; } } } } _o_frames.Resize( _o_frames.Size() + 1 ); ++_o_frames.Back().used; return &_o_frames.Back().p_mem[ 0 ]; }
void Remove( X *p_val ) { for( uiw frame = 0; ; ++frame ) { ASSUME( frame < _o_frames.Size() ); if( p_val >= _o_frames[ frame ].p_mem && p_val <= _o_frames[ frame ].p_mem + t_frameSize - 1 ) { ASSUME( !_IsFree( p_val ) ); p_val->~X(); _SetFree( p_val ); --_o_frames[ frame ].used; break; } } }
void Clear() { for( uiw frame = 0; frame < _o_frames.Size(); ++frame ) { for( uiw index = 0; index < t_frameSize; ++index ) { if( !_IsFree( &_o_frames[ frame ].p_mem[ index ] ) ) { _o_frames[ frame ].p_mem[ index ].~X(); _SetFree( &_o_frames[ frame ].p_mem[ index ] ); } } _o_frames[ frame ].used = 0; } }
bln GetFrameIndexByAddr( const void *cp_addr, uiw *p_frame, uiw *p_index ) { ASSUME( p_frame && p_index ); const byte *cp_byteAddr = (byte *)cp_addr; for( uiw frame = 0; frame < _o_frames.Size(); ++frame ) { if( cp_byteAddr >= (byte *)_o_frames[ frame ].p_mem && (X *)cp_byteAddr < _o_frames[ frame ].p_mem + t_frameSize ) { *p_frame = frame; cp_byteAddr -= (uiw)_o_frames[ frame ].p_mem; *p_index = (uiw)cp_byteAddr / sizeof(X); return true; } } return false; }
X &Get( uiw frame, uiw index ) { ASSUME( frame < _o_frames.Size() && index < t_frameSize ); return _o_frames[ frame ].p_mem[ index ]; }
uiw Frames() { return _o_frames.Size(); }