(svn r1763) -Add: pool.c / pool.h: generalized routines for dynamic arrays (MemoryPools)

This commit is contained in:
truelight
2005-02-01 18:30:11 +00:00
parent 45beed1c99
commit 567224e940
5 changed files with 147 additions and 0 deletions

53
pool.h Normal file
View File

@@ -0,0 +1,53 @@
#ifndef POOL_H
#define POOL_H
typedef struct MemoryPool MemoryPool;
/* The function that is called after a new block is added
start_item is the first item of the new made block */
typedef void MemoryPoolNewBlock(uint start_item);
/**
* Stuff for dynamic vehicles. Use the wrappers to access the MemoryPool
* please try to avoid manual calls!
*/
struct MemoryPool {
const char name[10]; //! Name of the pool (just for debugging)
const uint max_blocks; //! The max amount of blocks this pool can have
const uint block_size_bits; //! The size of each block in bits
const uint item_size; //! How many bytes one block is
MemoryPoolNewBlock *new_block_proc;
//!< Pointer to a function that is called after a new block is added
uint current_blocks; //! How many blocks we have in our pool
uint total_items; //! How many items we now have in this pool
byte **blocks; //! An array of blocks (one block hold all the items)
};
/**
* Those are the wrappers:
* CleanPool cleans the pool up, but you can use AddBlockToPool directly again
* (no need to call CreatePool!)
* AddBlockToPool adds 1 more block to the pool. Returns false if there is no
* more room
*/
void CleanPool(MemoryPool *array);
bool AddBlockToPool(MemoryPool *array);
/**
* Adds blocks to the pool if needed (and possible) till index fits inside the pool
*
* @return Returns false if adding failed
*/
bool AddBlockIfNeeded(MemoryPool *array, uint index);
static inline byte *GetItemFromPool(MemoryPool *pool, uint index)
{
assert(index < pool->total_items);
return (pool->blocks[index >> pool->block_size_bits] + (index & ((1 << pool->block_size_bits) - 1)) * pool->item_size);
}
#endif /* POOL_H */