namespace R2C2 {
+struct BlockAllocator::BlockMatch
+{
+ const Block █
+
+ BlockMatch(const Block &b): block(b) { }
+
+ bool operator()(const BlockIter &bi) const { return &*bi==█ }
+};
+
+
BlockAllocator::BlockAllocator(Train &t):
train(t),
cur_blocks_end(blocks.end()),
layout.signal_block_reserved.connect(sigc::mem_fun(this, &BlockAllocator::block_reserved));
layout.signal_sensor_state_changed.connect(sigc::mem_fun(this, &BlockAllocator::sensor_state_changed));
- const set<Track *> &tracks = layout.get_tracks();
+ const set<Track *> &tracks = layout.get_all<Track>();
for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
if((*i)->get_turnout_id())
(*i)->signal_path_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &BlockAllocator::turnout_path_changed), sigc::ref(**i))));
const BlockIter &BlockAllocator::iter_for(const Block &block) const
{
- BlockList::const_iterator i = find_block(blocks.begin(), blocks.end(), block);
+ BlockList::const_iterator i = find_if(blocks.begin(), blocks.end(), BlockMatch(block));
if(i==blocks.end())
throw key_error(&block);
return *i;
bool BlockAllocator::has_block(const Block &block) const
{
- return find_block(blocks.begin(), blocks.end(), block)!=blocks.end();
+ return find_if(blocks.begin(), blocks.end(), BlockMatch(block))!=blocks.end();
}
bool BlockAllocator::is_block_current(const Block &block) const
{
- return find_block(blocks.begin(), cur_blocks_end, block)!=cur_blocks_end;
-}
-
-BlockAllocator::BlockList::const_iterator BlockAllocator::find_block(const BlockList::const_iterator &begin, const BlockList::const_iterator &end, const Block &block) const
-{
- BlockList::const_iterator i;
- for(i=begin; (i!=end && &**i!=&block); ++i) ;
- return i;
+ BlockList::const_iterator end = cur_blocks_end;
+ return find_if(blocks.begin(), end, BlockMatch(block))!=cur_blocks_end;
}
void BlockAllocator::reserve_more()
if(begin==blocks.begin())
return release_blocks_begin(blocks.end());
+ if(begin==blocks.end())
+ return;
+
/* Release the blocks in reverse order so that a consistent state is
presented in block_reserved signal. */
bool done = false;
- for(BlockList::iterator i=blocks.end(); !done; )
+ for(BlockList::iterator i=--blocks.end(); !done; )
{
done = (i==begin);
release_block(i--);