OpenTTD/pool.h

54 lines
1.7 KiB
C

#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 */