  | 
   Templated Object Pool 
   Submitted by  |   
  
  
Hello flipcoders. I've been having fun with an idea for object pools. What I
wanted was a basic object pool designed for fast alocation of fixed size
objects.
I required operations to create and destroy the object pool, a function to
do a fast allocation from it, and also a fast delete (return to pool). Last
of all, I required a variable to hold the pool contents, which is passed to
the other routines so that the program knows which object pool I am
referring to.
  I came up with quite an elegant solution IMHO. The AllocateFromObjectPool
function is very fast, at the expense of a slow setup in CreateObjectPool.
You will notice that the pool is a parameter to every function, this is
because I sneakily get the size etc from the variable's type.
You can have as many different pools, of whatever types, as you like.
Use it like this:
 
  struct blah {
   short a;
   int b;
   char c;
 };
   blah *pool;
 CreateObjectPool(pool, 10);
   blah *myitem = AllocateFromObjectPool(pool); // (myitem = new blah;)
 ReturnObjectToPool(pool, myitem); // (delete myitem;)
   DeleteObjectPool(pool);
   |  
  
 
  DO NOT try and access the items directly through the pointer to the pool for
any reason! Only use these functions on it. It uses a free-list internally,
stored at the address pointed to by the pool, so the items are offset in
memory. I should probably have wrapped this up in a class to prevent that,
but I haven't. Instead of suggesting that, how about DIY? My ultimate aim
here is to inspire someone else into writing something even better.
I made good use of structs and unions and templates and avoid having to do
typecasts like (TItem***) - no I'm not kidding, that was my original plan!
  I haven't tested this too extensively, but being quite short it's not likely
to contain many bugs. It wont be thread-safe I guess.
  Written on a Mac using Symantec C++ v8.6.
Permission to use/copy/modify/distribute hereby granted. Do what you want
with it - enjoy!
  
Keep the cotd alive people - contribute!
[NZ]_i/\/\alc 
(Malcolm)
 | 
 
 
 
Download Associated File: MyObjectPool.h (1,703 bytes)
 
 #ifndef MY_OBJECTPOOL_H
#define MY_OBJECTPOOL_H
  //Creates an object pool
//pool: the variable to hold the pool
//numObj: how many objects required in the pool
template <class TItem>
void CreateObjectPool(TItem *&pool, int numObj) {
	union TElement {
		TItem *next;
		TItem item;
	};
	pool = (TItem*)(new char[sizeof(TElement) * numObj + sizeof(TItem*)])
	struct TPool {
		TItem *freePtr;
		TElement items[1];
	} *data = (TPool*)pool;
	data->freePtr = &data->items[0].item;
	for (int i=0; i<numObj-1; ++i)
		data->items[i].next = &data->items[i+1].item;
	data->items[numObj-1].next = NULL;
}
  //Destroy the object pool
//pool: the variable holding the pool to destroy
template <class TItem>
void DeleteObjectPool(TItem *pool) {
	delete[] ((char*)pool);
}
  //This is essentially replaces your 'new' function
//pool: the pool you wish to allocate from
//returns: an object from the pool, or NULL
template <class TItem>
TItem *AllocateFromObjectPool(TItem *pool) {
	union TElement {
		TItem *next;
		TItem item;
	};
	struct TPool {
		TItem *freePtr;
		TElement items[1];
	} *data = (TPool*)pool;
	TItem *newObj = data->freePtr;
	if (newObj != NULL)
		data->freePtr = ((TElement*)newObj)->next;
	return newObj;
}
  //This is essentially replaces your 'delete' function
//pool: the pool that the object came from
//oldObj: an object from the pool to return
template <class TItem>
void ReturnObjectToPool(TItem *pool, TItem *oldObj) {
	union TElement {
		TItem *next;
		TItem item;
	};
	struct TPool {
		TItem *freePtr;
		TElement items[1];
	} *data = (TPool*)pool;
	((TElement*)oldObj)->next = data->freePtr;
	data->freePtr = oldObj;
}
  #endif   |  
  
 | 
 
 
 
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
 
 
 |