From 03aa7d090507e40f6362cd242d711de4bbba8f18 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 20 Dec 2009 19:41:44 +0000 Subject: [PATCH] Change a few functions in Train to take Block reference instead of pointer Change Train::release_reserved_blocks into a more generic release_blocks --- source/engineer/engineer.cpp | 2 +- source/libmarklin/train.cpp | 50 +++++++++++++++--------------------- source/libmarklin/train.h | 8 +++--- 3 files changed, 26 insertions(+), 34 deletions(-) diff --git a/source/engineer/engineer.cpp b/source/engineer/engineer.cpp index 7777587..7bd0f77 100644 --- a/source/engineer/engineer.cpp +++ b/source/engineer/engineer.cpp @@ -307,7 +307,7 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned) { set_block_color(*placing_block, GL::Color(1, 1, 1)); - placing_train->place(placing_block, placing_entry); + placing_train->place(*placing_block, placing_entry); placing_train = 0; main_panel->set_status_text(string()); } diff --git a/source/libmarklin/train.cpp b/source/libmarklin/train.cpp index 8f8ee49..330bb70 100644 --- a/source/libmarklin/train.cpp +++ b/source/libmarklin/train.cpp @@ -67,7 +67,7 @@ void Train::set_speed(unsigned speed) if(!target_speed) { trfc_mgr.get_control().set_timer(3*Time::sec).signal_timeout.connect( - sigc::bind_return(sigc::mem_fun(this, &Train::release_reserved_blocks), false)); + sigc::bind_return(sigc::bind(sigc::mem_fun(this, &Train::release_blocks), sigc::ref(rsv_blocks)), false)); } else reserve_more(); @@ -89,46 +89,38 @@ void Train::set_route(const Route *r) signal_route_changed.emit(route); } -void Train::place(Block *block, unsigned entry) +void Train::place(Block &block, unsigned entry) { - for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end();) - { - i->block->reserve(0); - i = rsv_blocks.erase(i); - } + if(target_speed) + set_speed(0); - for(list::iterator i=cur_blocks.begin(); i!=cur_blocks.end();) - { - i->block->reserve(0); - i = cur_blocks.erase(i); - } + release_blocks(rsv_blocks); + release_blocks(cur_blocks); - if(!block->reserve(this)) + if(!block.reserve(this)) { set_status("Unplaced"); return; } - cur_blocks.push_back(BlockRef(block, entry)); - set_position(block->get_endpoints()[entry]); + cur_blocks.push_back(BlockRef(&block, entry)); + set_position(block.get_endpoints()[entry]); set_status("Stopped"); } -bool Train::free_block(Block *block) +bool Train::free_block(Block &block) { unsigned nsens = 0; for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) { - if(i->block==block) + if(i->block==&block) { if(nsens<1) return false; - while(i!=rsv_blocks.end()) - { - i->block->reserve(0); - i = rsv_blocks.erase(i); - } + for(list::iterator j=i; j!=rsv_blocks.end(); ++j) + j->block->reserve(0); + rsv_blocks.erase(i, rsv_blocks.end()); update_speed(); return true; } @@ -139,13 +131,13 @@ bool Train::free_block(Block *block) return false; } -int Train::get_entry_to_block(Block *block) const +int Train::get_entry_to_block(Block &block) const { for(list::const_iterator i=cur_blocks.begin(); i!=cur_blocks.end(); ++i) - if(i->block==block) + if(i->block==&block) return i->entry; for(list::const_iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) - if(i->block==block) + if(i->block==&block) return i->entry; return -1; } @@ -345,7 +337,7 @@ unsigned Train::reserve_more() if(!link->reserve(this)) { // If we found another train going in the same direction as us, we can keep the blocks we got - int other_entry = link->get_train()->get_entry_to_block(link); + int other_entry = link->get_train()->get_entry_to_block(*link); if(other_entry==entry || link->traverse(entry)==link->traverse(other_entry)) { good = last; @@ -525,11 +517,11 @@ void Train::set_position(const Block::Endpoint &bep) pos = cur_track->get_endpoint_position(cur_track_ep); } -void Train::release_reserved_blocks() +void Train::release_blocks(list &blocks) { - for(list::iterator i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i) + for(list::iterator i=blocks.begin(); i!=blocks.end(); ++i) i->block->reserve(0); - rsv_blocks.clear(); + blocks.clear(); } diff --git a/source/libmarklin/train.h b/source/libmarklin/train.h index 3fc7131..5f75a2a 100644 --- a/source/libmarklin/train.h +++ b/source/libmarklin/train.h @@ -90,9 +90,9 @@ public: const Route *get_route() const { return route; } const std::string &get_status() const { return status; } const Point &get_position() const { return pos; } - void place(Block *, unsigned); - bool free_block(Block *); - int get_entry_to_block(Block *) const; + void place(Block &, unsigned); + bool free_block(Block &); + int get_entry_to_block(Block &) const; void tick(const Msp::Time::TimeStamp &, const Msp::Time::TimeDelta &); void save(std::list &) const; private: @@ -106,7 +106,7 @@ private: unsigned find_speed(float) const; void set_status(const std::string &); void set_position(const Block::Endpoint &); - void release_reserved_blocks(); + void release_blocks(std::list &); }; } // namespace Marklin -- 2.43.0