IndexPool.kl¶
Types¶
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 ) |