IndexPool (struct)¶
The IndexPool is an helper class for the management of array data, where free indices can be reused (re-allocated). For performance applications, using contiguous (array) storage of multiple elements improves speed by both minimizing heap allocation calls and by making a better use of CPU memory cache. This class helps to write such custom allocators.
注釈
IndexPool only helps to allocate/reuse data cells (indices), however it doesn’t hold the stored data per say (would need C++ -like templates to do that).
/*
** Example: IndexPool
*/
require Math, Containers;
struct Mat44Allocator {
Mat44 matrices[];
IndexPool indexPool;
};
inline UInt32 Mat44Allocator.allocate!() {
UInt32 index;
if( this.indexPool.getFreeIndex(index) )
this.matrices.resize( this.indexPool.getIndexEnd() );
return index;
}
inline Mat44Allocator.free!( UInt32 index ) {
this.indexPool.unusedIndex(index);
}
operator entry(){
Mat44Allocator mat44s;
UInt32 first = mat44s.allocate();
mat44s.matrices[first].setTranslation( Vec3(1,0,0) );
UInt32 second = mat44s.allocate();
mat44s.matrices[second].setTranslation( Vec3(2,0,0) );
//Free the 1st allocated one, we no longer need it
mat44s.free(first);
report( mat44s.indexPool.getNumUsed() + " used out of " + mat44s.indexPool.getIndexEnd() );
//Allocate a 3rd one, which should reuse the free 1st entry
UInt32 third = mat44s.allocate();
mat44s.matrices[third].setTranslation( Vec3(3,0,0) );
report( mat44s.indexPool.getNumUsed() + " used out of " + mat44s.indexPool.getIndexEnd() );
}
/*
** Output:
1 used out of 2
2 used out of 2
*/
Methods¶
IndexPool ( in IndexPool other ) | |
IndexPool () | |
Boolean | allAllocated ? () |
Boolean | allFree ? () |
IndexPool | clone ? () |
Boolean | getFreeIndex ! ( out UInt32 index ) |
UInt32 | getIndexEnd ? () |
Size | getNumUsed ? () |
reset ! () | |
setAllAsUnused ! ( in Boolean entry0IsReserved ) | |
unusedIndex ! ( in UInt32 index ) |
Methods in detail¶
IndexPool ( in IndexPool other )
copy constructor
IndexPool ()
default constructor
Boolean IndexPool.allAllocated? ()
returns true if all indices are in use
Boolean IndexPool.allFree? ()
returns true if no indices are in use
clone method
Boolean IndexPool.getFreeIndex! ( out UInt32 index )
UInt32 IndexPool.getIndexEnd? ()
returns the last index
Size IndexPool.getNumUsed? ()
returns the number of used indices
IndexPool.reset! ()
resets the contents of the IndexPool
IndexPool.setAllAsUnused! ( in Boolean entry0IsReserved )
frees all indices, but optionally keeps the first one
IndexPool.unusedIndex! ( in UInt32 index )
pushes an unused index on the stack