Changeset - r11969:3526c3cc75dc
[Not reviewed]
master
1 20 1
smatz - 15 years ago 2009-05-22 15:39:22
smatz@openttd.org
(svn r16380) -Codechange: rename pool.hpp to pool_type.hpp
22 files changed with 310 insertions and 310 deletions:
0 comments (0 inline, 0 general)
projects/openttd_vs80.vcproj
Show inline comments
 
@@ -1676,14 +1676,14 @@
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\pool.hpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\pool_func.hpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\pool_type.hpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\random_func.cpp"
 
				>
 
			</File>
projects/openttd_vs90.vcproj
Show inline comments
 
@@ -1673,14 +1673,14 @@
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\pool.hpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\pool_func.hpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\pool_type.hpp"
 
				>
 
			</File>
 
			<File
 
				RelativePath=".\..\src\core\random_func.cpp"
 
				>
 
			</File>
source.list
Show inline comments
 
@@ -364,8 +364,8 @@ core/math_func.cpp
 
core/math_func.hpp
 
core/mem_func.hpp
 
core/overflowsafe_type.hpp
 
core/pool.hpp
 
core/pool_func.hpp
 
core/pool_type.hpp
 
core/random_func.cpp
 
core/random_func.hpp
 
core/smallmap_type.hpp
src/autoreplace_base.h
Show inline comments
 
@@ -5,7 +5,7 @@
 
#ifndef AUTOREPLACE_BASE_H
 
#define AUTOREPLACE_BASE_H
 

	
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "autoreplace_type.h"
 

	
 
typedef uint16 EngineRenewID;
src/cargopacket.h
Show inline comments
 
@@ -5,7 +5,7 @@
 
#ifndef CARGOPACKET_H
 
#define CARGOPACKET_H
 

	
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "economy_type.h"
 
#include "tile_type.h"
 
#include "station_type.h"
src/company_base.h
Show inline comments
 
@@ -6,7 +6,7 @@
 
#define COMPANY_BASE_H
 

	
 
#include "company_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "road_type.h"
 
#include "rail_type.h"
 
#include "date_type.h"
src/core/pool.hpp
Show inline comments
 
deleted file
src/core/pool_func.hpp
Show inline comments
 
@@ -7,7 +7,7 @@
 

	
 
#include "alloc_func.hpp"
 
#include "mem_func.hpp"
 
#include "pool.hpp"
 
#include "pool_type.hpp"
 

	
 
#define DEFINE_POOL_METHOD(type) \
 
	template <class Titem, typename Tindex, size_t Tgrowth_step, size_t Tmax_size> \
src/core/pool_type.hpp
Show inline comments
 
new file 100644
 
/* $Id$ */
 

	
 
/** @file pool_type.hpp Defintion of Pool, structure used to access PoolItems, and PoolItem, base structure for Vehicle, Town, and other indexed items. */
 

	
 
#ifndef POOL_TYPE_HPP
 
#define POOL_TYPE_HPP
 

	
 
template <class Titem, typename Tindex, size_t Tgrowth_step, size_t Tmax_size>
 
struct Pool {
 
	static const size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside
 

	
 
	const char * const name; ///< Name of this pool
 

	
 
	size_t size;         ///< Current allocated size
 
	size_t first_free;   ///< No item with index lower than this is free (doesn't say anything about this one!)
 
	size_t first_unused; ///< This and all higher indexes are free (doesn't say anything about first_unused-1 !)
 
	size_t items;        ///< Number of used indexes (non-NULL)
 

	
 
	bool cleaning;       ///< True if cleaning pool (deleting all items)
 

	
 
	Titem **data;        ///< Pointer to array of pointers to Titem
 

	
 
	/** Constructor */
 
	Pool(const char *name);
 
	/** Destroys all items in the pool and resets all member variables */
 
	void CleanPool();
 

	
 
	/**
 
	 * Returs Titem with given index
 
	 * @param index of item to get
 
	 * @return pointer to Titem
 
	 * @pre index < this->first_unused
 
	 */
 
	FORCEINLINE Titem *Get(size_t index)
 
	{
 
		assert(index < this->first_unused);
 
		return this->data[index];
 
	}
 

	
 
	/**
 
	 * Tests whether given index can be used to get valid (non-NULL) Titem
 
	 * @param index index to examine
 
	 * @return true if PoolItem::Get(index) will return non-NULL pointer
 
	 */
 
	FORCEINLINE bool IsValidID(size_t index)
 
	{
 
		return index < this->first_unused && this->Get(index) != NULL;
 
	}
 

	
 
	/**
 
	 * Tests whether we can allocate 'n' items
 
	 * @param n number of items we want to allocate
 
	 * @return true if 'n' items can be allocated
 
	 */
 
	FORCEINLINE bool CanAllocate(size_t n = 1)
 
	{
 
		return this->items <= Tmax_size - n;
 
	}
 

	
 
	/** Base class for all PoolItems */
 
	template <struct Pool<Titem, Tindex, Tgrowth_step, Tmax_size> *Tpool>
 
	struct PoolItem {
 
		Tindex index; ///< Index of this pool item
 

	
 
		/**
 
		 * Allocates space for new Titem
 
		 * @param size size of Titem
 
		 * @return pointer to allocated memory
 
		 * @note can never fail (return NULL), use CanAllocate() to check first!
 
		 */
 
		FORCEINLINE void *operator new(size_t size)
 
		{
 
			return Tpool->GetNew(size);
 
		}
 

	
 
		/**
 
		 * Marks Titem as free. Its memory is released
 
		 * @param p memory to free
 
		 * @note the item has to be allocated in the pool!
 
		 */
 
		FORCEINLINE void operator delete(void *p)
 
		{
 
			Titem *pn = (Titem *)p;
 
			assert(pn == Tpool->Get(pn->index));
 
			Tpool->FreeItem(pn->index);
 
		}
 

	
 
		/**
 
		 * Allocates space for new Titem with given index
 
		 * @param size size of Titem
 
		 * @param index index of item
 
		 * @return pointer to allocated memory
 
		 * @note can never fail (return NULL), use CanAllocate() to check first!
 
		 * @pre index has to be unused! Else it will crash
 
		 */
 
		FORCEINLINE void *operator new(size_t size, size_t index)
 
		{
 
			return Tpool->GetNew(size, index);
 
		}
 

	
 
		/**
 
		 * Deletes item with given index.
 
		 * @param p Titem memory to release
 
		 * @param index index of item
 
		 * @note never use this! Only for internal use
 
		 *       (called automatically when constructor of Titem uses throw())
 
		 */
 
		FORCEINLINE void operator delete(void *p, size_t index)
 
		{
 
			assert(p == Tpool->Get(index));
 
			Tpool->FreeItem(index);
 
		}
 

	
 

	
 
		/**
 
		 * Allocates space for new Titem at given memory address
 
		 * @param size size of Titem
 
		 * @param ptr where are we allocating the item?
 
		 * @return pointer to allocated memory (== ptr)
 
		 * @note use of this is strongly discouraged
 
		 * @pre the memory must not be allocated in the Pool!
 
		 */
 
		FORCEINLINE void *operator new(size_t size, void *ptr)
 
		{
 
			for (size_t i = 0; i < Tpool->first_unused; i++) {
 
				/* Don't allow creating new objects over existing.
 
				 * Even if we called the destructor and reused this memory,
 
				 * we don't know whether 'size' and size of currently allocated
 
				 * memory are the same (because of possible inheritance).
 
				 * Use { size_t index = item->index; delete item; new (index) item; }
 
				 * instead to make sure destructor is called and no memory leaks. */
 
				assert(ptr != Tpool->data[i]);
 
			}
 
			return ptr;
 
		}
 

	
 
		/**
 
		 * Deletes item that was allocated by the function above
 
		 * @param p Titem memory to release
 
		 * @param ptr parameter given to operator new
 
		 * @note never use this! Only for internal use
 
		 *       (called automatically when constructor of Titem uses throw())
 
		 */
 
		FORCEINLINE void operator delete(void *p, void *ptr)
 
		{
 
			assert(p == ptr);
 
			for (size_t i = 0; i < Tpool->first_unused; i++) {
 
				assert(ptr != Tpool->data[i]);
 
			}
 
		}
 

	
 

	
 
		/** Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function() */
 

	
 
		/**
 
		 * Tests whether we can allocate 'n' items
 
		 * @param n number of items we want to allocate
 
		 * @return true if 'n' items can be allocated
 
		 */
 
		static FORCEINLINE bool CanAllocateItem(size_t n = 1)
 
		{
 
			return Tpool->CanAllocate(n);
 
		}
 

	
 
		/**
 
		 * Returns current state of pool cleaning - yes or no
 
		 * @return true iff we are cleaning the pool now
 
		 */
 
		static FORCEINLINE bool CleaningPool()
 
		{
 
			return Tpool->cleaning;
 
		}
 

	
 
		/**
 
		 * Tests whether given index can be used to get valid (non-NULL) Titem
 
		 * @param index index to examine
 
		 * @return true if PoolItem::Get(index) will return non-NULL pointer
 
		 */
 
		static FORCEINLINE bool IsValidID(size_t index)
 
		{
 
			return Tpool->IsValidID(index);
 
		}
 

	
 
		/**
 
		 * Returs Titem with given index
 
		 * @param index of item to get
 
		 * @return pointer to Titem
 
		 * @pre index < this->first_unused
 
		 */
 
		static FORCEINLINE Titem *Get(size_t index)
 
		{
 
			return Tpool->Get(index);
 
		}
 

	
 
		/**
 
		 * Returs Titem with given index
 
		 * @param index of item to get
 
		 * @return pointer to Titem
 
		 * @note returns NULL for invalid index
 
		 */
 
		static FORCEINLINE Titem *GetIfValid(size_t index)
 
		{
 
			return index < Tpool->first_unused ? Tpool->Get(index) : NULL;
 
		}
 

	
 
		/**
 
		 * Returns first unused index. Useful when iterating over
 
		 * all pool items.
 
		 * @return first unused index
 
		 */
 
		static FORCEINLINE size_t GetPoolSize()
 
		{
 
			return Tpool->first_unused;
 
		}
 

	
 
		/**
 
		 * Returns number of valid items in the pool
 
		 * @return number of valid items in the pool
 
		 */
 
		static FORCEINLINE size_t GetNumItems()
 
		{
 
			return Tpool->items;
 
		}
 
	};
 

	
 
private:
 
	static const size_t NO_FREE_ITEM = MAX_UVALUE(size_t); ///< Contant to indicate we can't allocate any more items
 

	
 
	/**
 
	 * Makes given index valid
 
	 * @param size size of item
 
	 * @param index index of item
 
	 * @pre index < this->size
 
	 * @pre this->Get(index) == NULL
 
	 */
 
	void *AllocateItem(size_t size, size_t index);
 

	
 
	/**
 
	 * Resizes the pool so 'index' can be addressed
 
	 * @param index index we will allocate later
 
	 * @pre index >= this->size
 
	 * @pre index < Tmax_size
 
	 */
 
	void ResizeFor(size_t index);
 

	
 
	/**
 
	 * Searches for first free index
 
	 * @return first free index, NO_FREE_ITEM on failure
 
	 */
 
	size_t FindFirstFree();
 

	
 
	/**
 
	 * Allocates new item
 
	 * @param size size of item
 
	 * @return pointer to allocated item
 
	 * @note error() on failure! (no free item)
 
	 */
 
	void *GetNew(size_t size);
 

	
 
	/**
 
	 * Allocates new item with given index
 
	 * @param size size of item
 
	 * @param index index of item
 
	 * @return pointer to allocated item
 
	 * @note usererror() on failure! (index out of range or already used)
 
	 */
 
	void *GetNew(size_t size, size_t index);
 

	
 
	/**
 
	 * Deallocates memory used by this index and marks item as free
 
	 * @param index item to deallocate
 
	 * @pre unit is allocated (non-NULL)
 
	 * @note 'delete NULL' doesn't cause call of this function, so it is safe
 
	 */
 
	void FreeItem(size_t index);
 
};
 

	
 
#define FOR_ALL_ITEMS_FROM(type, iter, var, start) \
 
	for (size_t iter = start; var = NULL, iter < type::GetPoolSize(); iter++) \
 
		if ((var = type::Get(iter)) != NULL)
 

	
 
#define FOR_ALL_ITEMS(type, iter, var) FOR_ALL_ITEMS_FROM(type, iter, var, 0)
 

	
 
#endif /* POOL_TYPE_HPP */
src/depot_base.h
Show inline comments
 
@@ -7,7 +7,7 @@
 

	
 
#include "tile_type.h"
 
#include "depot_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "town_type.h"
 

	
 
typedef Pool<Depot, DepotID, 64, 64000> DepotPool;
src/engine_base.h
Show inline comments
 
@@ -7,7 +7,7 @@
 

	
 
#include "engine_type.h"
 
#include "economy_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "core/smallvec_type.hpp"
 

	
 
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
src/group.h
Show inline comments
 
@@ -6,7 +6,7 @@
 
#define GROUP_H
 

	
 
#include "group_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "company_type.h"
 
#include "vehicle_type.h"
 
#include "engine_type.h"
src/industry.h
Show inline comments
 
@@ -5,7 +5,7 @@
 
#ifndef INDUSTRY_H
 
#define INDUSTRY_H
 

	
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "core/random_func.hpp"
 
#include "newgrf_storage.h"
 
#include "cargo_type.h"
src/network/core/tcp_game.h
Show inline comments
 
@@ -12,7 +12,7 @@
 
#include "os_abstraction.h"
 
#include "tcp.h"
 
#include "packet.h"
 
#include "../../core/pool.hpp"
 
#include "../../core/pool_type.hpp"
 

	
 
/**
 
 * Enum with all types of UDP packets.
src/network/network_base.h
Show inline comments
 
@@ -8,7 +8,7 @@
 
#ifdef ENABLE_NETWORK
 

	
 
#include "network_type.h"
 
#include "../core/pool.hpp"
 
#include "../core/pool_type.hpp"
 

	
 
typedef Pool<NetworkClientInfo, ClientIndex, 8, MAX_CLIENT_SLOTS> NetworkClientInfoPool;
 
extern NetworkClientInfoPool _networkclientinfo_pool;
src/newgrf_spritegroup.h
Show inline comments
 
@@ -11,7 +11,7 @@
 
#include "gfx_type.h"
 
#include "engine_type.h"
 
#include "tile_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 

	
 
#include "newgrf_cargo.h"
 
#include "newgrf_callbacks.h"
src/order_base.h
Show inline comments
 
@@ -6,7 +6,7 @@
 
#define ORDER_BASE_H
 

	
 
#include "order_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "core/bitmath_func.hpp"
 
#include "cargo_type.h"
 
#include "depot_type.h"
src/signs_base.h
Show inline comments
 
@@ -8,7 +8,7 @@
 
#include "signs_type.h"
 
#include "viewport_type.h"
 
#include "tile_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 

	
 
typedef Pool<Sign, SignID, 16, 64000> SignPool;
 
extern SignPool _sign_pool;
src/station_base.h
Show inline comments
 
@@ -7,7 +7,7 @@
 

	
 
#include "station_type.h"
 
#include "airport.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "cargopacket.h"
 
#include "cargo_type.h"
 
#include "town_type.h"
src/town.h
Show inline comments
 
@@ -5,7 +5,7 @@
 
#ifndef TOWN_H
 
#define TOWN_H
 

	
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "core/bitmath_func.hpp"
 
#include "core/random_func.hpp"
 
#include "cargo_type.h"
src/vehicle_base.h
Show inline comments
 
@@ -16,7 +16,7 @@
 
#include "date_type.h"
 
#include "company_base.h"
 
#include "company_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 
#include "order_base.h"
 
#include "cargopacket.h"
 
#include "texteff.hpp"
src/waypoint.h
Show inline comments
 
@@ -12,7 +12,7 @@
 
#include "town_type.h"
 
#include "viewport_type.h"
 
#include "date_type.h"
 
#include "core/pool.hpp"
 
#include "core/pool_type.hpp"
 

	
 
typedef Pool<Waypoint, WaypointID, 32, 64000> WaypointPool;
 
extern WaypointPool _waypoint_pool;
0 comments (0 inline, 0 general)