Revision: 8233
http://playerstage.svn.sourceforge.net/playerstage/?rev=8233&view=rev
Author: rtv
Date: 2009-08-26 19:30:17 +0000 (Wed, 26 Aug 2009)
Log Message:
-----------
more STLing and type safety to hopefully reduce bugs
Modified Paths:
--------------
code/stage/trunk/libstage/ancestor.cc
code/stage/trunk/libstage/block.cc
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/model.cc
code/stage/trunk/libstage/model_draw.cc
code/stage/trunk/libstage/model_getset.cc
code/stage/trunk/libstage/region.cc
code/stage/trunk/libstage/region.hh
code/stage/trunk/libstage/stage.hh
code/stage/trunk/libstage/world.cc
code/stage/trunk/webstage/webstage.cc
Modified: code/stage/trunk/libstage/ancestor.cc
===================================================================
--- code/stage/trunk/libstage/ancestor.cc 2009-08-26 17:30:15 UTC (rev
8232)
+++ code/stage/trunk/libstage/ancestor.cc 2009-08-26 19:30:17 UTC (rev
8233)
@@ -20,8 +20,16 @@
void Ancestor::AddChild( Model* mod )
{
+ // if the child is already there, this is a serious error
+ if( std::find( children.begin(), children.end(), mod ) != children.end() )
+ {
+ PRINT_ERR2( "Attempting to add child %s to %s - child already
exists",
+ mod->Token(), this->Token() );
+ exit( -1 );
+ }
+
// poke a name into the child
- char* buf = new char[TOKEN_MAX];
+ static char* buf = new char[TOKEN_MAX]; // allocated once
// printf( "adding child of type %d token %s\n", mod->type, mod->Token() );
@@ -41,18 +49,17 @@
mod->SetToken( buf );
- children.insert( mod );
+ children.push_back( mod );
child_type_counts[mod->type]++;
- delete[] buf;
+ //delete[] buf; // no need to free the statically allocated buffer
}
void Ancestor::RemoveChild( Model* mod )
{
child_type_counts[mod->type]--;
-
- children.erase( mod );//std::remove( children.begin(), children.end(), mod )
);
+ EraseAll( mod, children );
}
Pose Ancestor::GetGlobalPose()
Modified: code/stage/trunk/libstage/block.cc
===================================================================
--- code/stage/trunk/libstage/block.cc 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/block.cc 2009-08-26 19:30:17 UTC (rev 8233)
@@ -206,13 +206,30 @@
void Block::RemoveFromCellArray( CellPtrVec *cells )
{
FOR_EACH( it, *cells )
- (*it)->RemoveBlock( this);
+ {
+ Cell* cell = *it;
+
+ // remove me from the cell
+ EraseAll( this, cell->blocks );
+ --cell->region->count;
+ --cell->region->superregion->count;
+ }
}
void Block::AddToCellArray( CellPtrVec *cells )
{
FOR_EACH( it, *cells )
- (*it)->AddBlock( this);
+ {
+ Cell* cell = *it;
+
+ // record that I am rendered in this cell
+ rendered_cells->push_back( cell );
+
+ // store me in the cell
+ cell->blocks.push_back( this );
+ ++cell->region->count;
+ ++cell->region->superregion->count;
+ }
}
void Block::SwitchToTestedCells()
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/canvas.cc 2009-08-26 19:30:17 UTC (rev 8233)
@@ -304,7 +304,7 @@
{
if( mod )
{
- selected_models.erase( std::remove( selected_models.begin(),
selected_models.end(), mod ));
+ EraseAll( mod, selected_models );
redraw();
}
}
@@ -577,7 +577,7 @@
void Canvas::RemoveModel( Model* mod )
{
printf( "removing model %s from canvas list\n", mod->Token() );
- models_sorted.erase( std::remove( models_sorted.begin(),
models_sorted.end(), mod ));
+ EraseAll( mod, models_sorted );
}
void Canvas::DrawGlobalGrid()
Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/model.cc 2009-08-26 19:30:17 UTC (rev 8233)
@@ -277,8 +277,8 @@
// remove myself from my parent's child list, or the world's child
// list if I have no parent
- ModelPtrSet& vec = parent ? parent->children : world->children;
- vec.erase( this );//std::remove( vec.begin(), vec.end(), this ));
+ ModelPtrVec& vec = parent ? parent->children : world->children;
+ EraseAll( this, vec );
modelsbyid.erase(id);
@@ -332,7 +332,7 @@
{
if( flag )
{
- flag_list.erase( remove( flag_list.begin(), flag_list.end(),
flag ));
+ EraseAll( flag, flag_list );
CallCallbacks( &hooks.flag_decr );
}
}
Modified: code/stage/trunk/libstage/model_draw.cc
===================================================================
--- code/stage/trunk/libstage/model_draw.cc 2009-08-26 17:30:15 UTC (rev
8232)
+++ code/stage/trunk/libstage/model_draw.cc 2009-08-26 19:30:17 UTC (rev
8233)
@@ -246,28 +246,27 @@
if( ! world_gui )
return;
- //save visual instance
- //cv_list = g_list_append(cv_list, cv );
+ //save visual instance
cv_list.push_back( cv );
-
- //register option for all instances which share the same name
- Canvas* canvas = world_gui->GetCanvas();
- std::map< std::string, Option* >::iterator i =
canvas->_custom_options.find( cv->GetMenuName() );
- if( i == canvas->_custom_options.end() ) {
- Option* op = new Option( cv->GetMenuName(),
-
cv->GetWorldfileName(),
-
"",
-
on_by_default,
-
world_gui );
- canvas->_custom_options[ cv->GetMenuName() ] = op;
- RegisterOption( op );
- }
+
+ //register option for all instances which share the same name
+ Canvas* canvas = world_gui->GetCanvas();
+ std::map< std::string, Option* >::iterator i = canvas->_custom_options.find(
cv->GetMenuName() );
+ if( i == canvas->_custom_options.end() ) {
+ Option* op = new Option( cv->GetMenuName(),
+
cv->GetWorldfileName(),
+ "",
+
on_by_default,
+
world_gui );
+ canvas->_custom_options[ cv->GetMenuName() ] = op;
+ RegisterOption( op );
+ }
}
void Model::RemoveVisualizer( Visualizer* cv )
{
if( cv )
- cv_list.erase( remove( cv_list.begin(), cv_list.end(), cv ));
+ EraseAll( cv, cv_list );
//TODO unregister option - tricky because there might still be instances
attached to different models which have the same name
}
Modified: code/stage/trunk/libstage/model_getset.cc
===================================================================
--- code/stage/trunk/libstage/model_getset.cc 2009-08-26 17:30:15 UTC (rev
8232)
+++ code/stage/trunk/libstage/model_getset.cc 2009-08-26 19:30:17 UTC (rev
8233)
@@ -49,9 +49,9 @@
// non-zero values mean we need to be in the world's set of
// detectable models
if( val == 0 )
- world->models_with_fiducials.erase( this );
+ world->FiducialErase( this );
else
- world->models_with_fiducials.insert( this );
+ world->FiducialInsert( this );
CallCallbacks( &vis.fiducial_return );
}
@@ -135,17 +135,13 @@
}
int Model::SetParent( Model* newparent)
-{
-
+{
// remove the model from its old parent (if it has one)
if( parent )
- //this->parent->children = g_list_remove( this->parent->children, this );
- //parent->children.erase( remove( parent->children.begin(),
parent->children.end(), this ) );
- parent->children.erase( this );
-
+ EraseAll( this, parent->children );
+
if( newparent )
- //newparent->children = g_list_append( newparent->children, this );
- newparent->children.insert( this );
+ newparent->children.push_back( this );
// link from the model to its new parent
this->parent = newparent;
Modified: code/stage/trunk/libstage/region.cc
===================================================================
--- code/stage/trunk/libstage/region.cc 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/region.cc 2009-08-26 19:30:17 UTC (rev 8233)
@@ -11,26 +11,25 @@
// collection
// std::set<Region*> Region::empty_regions;
-Region::Region() :
- cells( NULL ),
+Region::Region( SuperRegion* sr) :
+ cells(),
+ superregion(sr),
count(0)
{
}
Region::~Region()
{
- if( cells )
- delete[] cells;
}
SuperRegion::SuperRegion( World* world, stg_point_int_t origin )
- : regions( new Region[ SUPERREGIONSIZE ] ),
+ : regions(),
origin(origin),
world(world),
count(0)
{
- for( int i=0; i<SUPERREGIONSIZE; i++ )
- regions[i].superregion = this;
+ // populate the regions
+ regions.insert( regions.begin(), SUPERREGIONSIZE, Region( this ) );
//static int srcount=0;
//printf( "created SR number %d\n", ++srcount );
@@ -39,9 +38,6 @@
SuperRegion::~SuperRegion()
{
- if( regions )
- delete[] regions;
-
//printf( "deleting SR %p at [%d,%d]\n", this, origin.x, origin.y );
}
@@ -64,12 +60,12 @@
for( int y=0; y<SUPERREGIONWIDTH; y++ )
{
const Region* r = GetRegion(x,y);
-
+
if( r->count )
// outline regions with contents
glRecti( x<<RBITS, y<<RBITS,
(x+1)<<RBITS, (y+1)<<RBITS );
- else if( r->cells )
+ else if( ! r->cells.empty() )
{
double left = x << RBITS;
double right = (x+1) << RBITS;
@@ -81,35 +77,22 @@
// draw little corner markers for regions with
memory
// allocated but no contents
glBegin( GL_LINES );
-
glVertex2f( left, bottom );
glVertex2f( left+d, bottom );
-
glVertex2f( left, bottom );
glVertex2f( left, bottom+d );
-
-
glVertex2f( left, top );
glVertex2f( left+d, top );
-
glVertex2f( left, top );
glVertex2f( left, top-d );
-
-
-
glVertex2f( right, top );
glVertex2f( right-d, top );
-
glVertex2f( right, top );
glVertex2f( right, top-d );
-
-
glVertex2f( right, bottom );
glVertex2f( right-d, bottom );
-
glVertex2f( right, bottom );
glVertex2f( right, bottom+d );
-
glEnd();
}
}
Modified: code/stage/trunk/libstage/region.hh
===================================================================
--- code/stage/trunk/libstage/region.hh 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/region.hh 2009-08-26 19:30:17 UTC (rev 8233)
@@ -45,12 +45,10 @@
private:
Region* region;
std::vector<Block*> blocks;
- //std::set<Block*> blocks;
- bool boundary;
public:
- Cell()
- : region( NULL),
+ Cell( Region* reg )
+ : region( reg ),
blocks()
{
}
@@ -63,26 +61,22 @@
class Region
{
public:
-
- Cell* cells;
+ std::vector<Cell> cells;
+
SuperRegion* superregion;
unsigned long count; // number of blocks rendered into this region
- Region();
+ Region( SuperRegion* sr );
~Region();
Cell* GetCell( int32_t x, int32_t y )
{
- if( ! cells )
- {
- cells = new Cell[REGIONSIZE];
-
- for( int i=0; i<REGIONSIZE; ++i )
- cells[i].region = this;
- }
-
+ if( cells.empty() ) // lazy population of cells
+ cells.insert( cells.begin(), REGIONSIZE, Cell( this ) );
+
return( (Cell*)&cells[ x + y * REGIONWIDTH ] );
}
+
}; // end class Region
class SuperRegion
@@ -92,7 +86,7 @@
private:
- Region* regions;
+ std::vector<Region> regions;
stg_point_int_t origin;
World* world;
@@ -110,24 +104,4 @@
unsigned long count; // number of blocks rendered into this superregion
}; // class SuperRegion;
- void Cell::RemoveBlock( Block* b )
- {
- // linear time removal, but these vectors are very short, usually 1
- // or 2 elements.
- blocks.erase( std::remove( blocks.begin(), blocks.end(), b ),
blocks.end() );
-
- --region->count;
- --region->superregion->count;
- }
-
- void Cell::AddBlock( Block* b )
- {
- blocks.push_back( b );
- b->RecordRendering( this );
-
- ++region->count;
- ++region->superregion->count;
- }
-
-
}; // namespace Stg
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/stage.hh 2009-08-26 19:30:17 UTC (rev 8233)
@@ -89,6 +89,9 @@
/** Set of pointers to Models. */
typedef std::set<Model*> ModelPtrSet;
+ /** Set of pointers to Models. */
+ typedef std::vector<Model*> ModelPtrVec;
+
/** Set of pointers to Blocks. */
typedef std::set<Block*> BlockPtrSet;
@@ -615,6 +618,11 @@
#define VAR(V,init) __typeof(init) V=(init)
#define FOR_EACH(I,C) for(VAR(I,(C).begin());I!=(C).end();I++)
+/** wrapper for Erase-Remove method of removing all instances of thing from
container */
+ template <class T, class C>
+ void EraseAll( T thing, C& cont )
+ { cont.erase( std::remove( cont.begin(), cont.end(), thing ), cont.end() ); }
+
// Error macros - output goes to stderr
#define PRINT_ERR(m) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n",
__FILE__, __FUNCTION__)
#define PRINT_ERR1(m,a) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n",
a, __FILE__, __FUNCTION__)
@@ -679,7 +687,7 @@
friend class Canvas; // allow Canvas access to our private members
protected:
- ModelPtrSet children;
+ ModelPtrVec children;
bool debug;
char* token;
pthread_mutex_t access_mutex; ///< Used by Lock() and Unlock() to
prevent parallel access to this model
@@ -690,7 +698,7 @@
public:
/** get the children of the this element */
- ModelPtrSet& GetChildren(){ return children;}
+ ModelPtrVec& GetChildren(){ return children;}
/** recursively call func( model, arg ) for each descendant */
void ForEachDescendant( stg_model_callback_t func, void* arg );
@@ -812,8 +820,22 @@
/** Keep a list of all models with detectable fiducials. This
avoids searching the whole world for fiducials. */
- ModelPtrSet models_with_fiducials;
-
+ ModelPtrVec models_with_fiducials;
+
+ /** Add a model to the set of models with non-zero fiducials, if not
already there. */
+ void FiducialInsert( Model* mod )
+ {
+ FiducialErase( mod ); // make sure it's not there already
+ models_with_fiducials.push_back( mod );
+ }
+
+ /** Remove a model from the set of models with non-zero fiducials, if
it exists. */
+ void FiducialErase( Model* mod )
+ {
+ //EraseAll<Model*,ModelPtrVec&>( mod, models_with_fiducials );
+ EraseAll( mod, models_with_fiducials );
+ }
+
double ppm; ///< the resolution of the world model in pixels per meter
bool quit; ///< quit this world ASAP
@@ -842,7 +864,7 @@
std::map<stg_point_int_t,SuperRegion*> superregions;
SuperRegion* sr_cached; ///< The last superregion looked up by this world
- std::vector<ModelPtrSet> update_lists;
+ std::vector<ModelPtrVec> update_lists;
uint64_t updates; ///< the number of simulated time steps executed so far
Worldfile* wf; ///< If set, points to the worldfile used to create this
world
@@ -1111,9 +1133,6 @@
/** Set the extent in Z of the block */
void SetZ( double min, double max );
- void RecordRendering( Cell* cell )
- { rendered_cells->push_back( cell ); }
-
stg_point_t* Points( unsigned int *count )
{ if( count ) *count = pt_count; return &pts[0]; };
Modified: code/stage/trunk/libstage/world.cc
===================================================================
--- code/stage/trunk/libstage/world.cc 2009-08-26 17:30:15 UTC (rev 8232)
+++ code/stage/trunk/libstage/world.cc 2009-08-26 19:30:17 UTC (rev 8233)
@@ -1024,7 +1024,7 @@
void World::RemovePowerPack( PowerPack* pp )
{
- powerpack_list.erase( remove( powerpack_list.begin(), powerpack_list.end(),
pp ));
+ EraseAll( pp, powerpack_list );
}
/// Register an Option for pickup by the GUI
Modified: code/stage/trunk/webstage/webstage.cc
===================================================================
--- code/stage/trunk/webstage/webstage.cc 2009-08-26 17:30:15 UTC (rev
8232)
+++ code/stage/trunk/webstage/webstage.cc 2009-08-26 19:30:17 UTC (rev
8233)
@@ -137,7 +137,7 @@
virtual bool GetModelChildren(const std::string& model,
std::vector<std::string>& children)
{
- std::set<Model*> c;
+ std::vector<Model*> c;
if(model == "")
{
@@ -157,9 +157,7 @@
}
- for( std::set<Model*>::iterator it = c.begin();
- it != c.end();
- it++ )
+ FOR_EACH( it, c )
{
children.push_back(std::string((*it)->Token()));
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit