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 ];
 }
Ejemplo n.º 10
0
 uiw Frames()
 {
     return _o_frames.Size();
 }