+void Layout::sensor_state_changed(Sensor &sensor, Sensor::State state)
+{
+ if(state==Sensor::ACTIVE)
+ {
+ Block *block = sensor.get_block();
+ if(block && !block->get_train())
+ emergency(block, "Unreserved sensor triggered");
+ }
+}
+
+void Layout::block_reserved(Block &block, Train *train)
+{
+ if(emitting_block_reserved)
+ {
+ if(!train)
+ {
+ for(deque<BlockReservation>::iterator i=block_reserve_queue.end(); i!=block_reserve_queue.begin(); )
+ if((--i)->block==&block)
+ {
+ block_reserve_queue.erase(i);
+ return;
+ }
+ }
+
+ block_reserve_queue.push_back(BlockReservation(block, train));
+ }
+ else
+ {
+ SetFlag setf(emitting_block_reserved);
+ signal_block_reserved.emit(block, train);
+ while(!block_reserve_queue.empty())
+ {
+ BlockReservation br = block_reserve_queue.front();
+ block_reserve_queue.pop_front();
+ signal_block_reserved.emit(*br.block, br.train);
+ }
+ }
+}
+
+
+template<typename B>
+Layout::Storage<B>::~Storage()