memory pool and rb-tree

Jeff jeff.michels at gmx.net
Tue Aug 26 04:53:43 PDT 2008


Hi, 

i'm learning D and i'm trying to translate my C++ code to D. But i hit some problems. 

My C++ code looks like:

struct spot_rec
{	
	char id[20];
	int  value1;
	int  value2;
	int  value3;
	bool changed;
	
	spot_rec() {...}; //init
	const spot_rec& operator=(const spot_rec& r) {...}; //copy-operator
};

struct less_spot_record : public std::binary_function<spot_rec *,spot_rec *,bool> 
{
  bool operator()(const spot_rec *a, const spot_rec *b) const { return stricmp(a->id, b->id); }
};

typedef set < spot_rec*, less_spot_record >  TableSpotRecords;  
typedef set < spot_rec*, less_spot_record >::iterator TableSpotRecordsIter;  

boost::my_object_pool< spot_rec > pool_spot_rec;
TableSpotRecords table_spot_rec;  //ordered RB-Tree

bool shutdown = false;
int thread_save_data()
{
	while(!shutdown)
	{
		TableSpotRecordsIter iter = table_spot_rec.begin();
		while(iter != table_spot_rec.end()) 
		{
			spot_rec *r = *iter;
			if(r->changed)
			{
				mutex.lock();
				save_record(r);
				r->changed = false;
				mutex.unlock();
			}
			if(shutdown) return 0;
			++iter; // is thread save
		}
	}
	return 0;
}

void update_spot(spot_rec *r)
{
    TableSpotRecordsIter iter = table_spot_rec.find(r); 
    if(iter==table_spot_rec.end())
	{   //add new record
		spot_rec *p = pool_spot_rec.construct();            
		*p = *r; 
		table_spot_rec.insert(p) // is thread save
	}
	else
	{	//update record
		spot_rec *p = *iter;            
		mutex.lock();
		*p = *r; 
		mutex.unlock();
	}
}

main
{
	create_thread(thread_save_data);
	...
	//read from udp socket
	char buf[1024];
	while( recvfrom(socket,buf,sizeof(buf),from,fromlen)>0 )
	{
		spot_rec r;
		if(parse_record(buf,r))
			update_spot(&r);
	}
	
	shutdown=true;
	join_thread();
	table_spot_rec.purge_memory();
	...
}

This program processes realtime data. 
I can't find a D replacement for boost::my_object_pool and stlport-set.
I looked at tango and dcollections, but i can't find any example that use RB-Trees and where i can set my own compare function.

Can somebody help me?




More information about the Digitalmars-d-learn mailing list