void Selection::select_more()
{
- set<Track *> new_tracks;
+ set<Object *> new_objects;
for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
- if(Track *track = dynamic_cast<Track *>(*i))
- {
- const vector<Track *> &links = track->get_links();
- for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
- if(*j)
- new_tracks.insert(*j);
- }
+ {
+ unsigned nls = (*i)->get_n_link_slots();
+ for(unsigned j=0; j<nls; ++j)
+ if(Object *obj = (*i)->get_link(j))
+ new_objects.insert(obj);
+ }
bool changed = false;
- for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
+ for(set<Object *>::iterator i=new_objects.begin(); i!=new_objects.end(); ++i)
if(objects.insert(*i).second)
changed = true;
void Selection::select_linked()
{
bool changed = false;
- list<Track *> queue;
- for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
- if(Track *track = dynamic_cast<Track *>(*i))
- queue.push_back(track);
+ list<Object *> queue(objects.begin(), objects.end());
while(!queue.empty())
{
- Track *track = queue.front();
- queue.erase(queue.begin());
-
- const vector<Track *> &links = track->get_links();
- for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
- if(*j && objects.insert(*j).second)
- {
- queue.push_back(*j);
- changed = true;
- }
+ Object *obj = queue.front();
+ queue.pop_front();
+
+ unsigned nls = obj->get_n_link_slots();
+ for(unsigned j=0; j<nls; ++j)
+ if(Object *linked = obj->get_link(j))
+ if(objects.insert(linked).second)
+ {
+ queue.push_back(linked);
+ changed = true;
+ }
}
if(changed)