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