// -*- C++ -*- namespace Kite { /*! \class RoutingEventQueue * \brief The priority Queue of RoutingEvent. * * \section secImplRoutingEventQueue Implementation Details * * The RoutingEventQueue is build upon a STL multiset<> and is sorted * according to the RoutingEvent::Key attribute of the event. The key * attribute has been designed specifically to be used with this queue. * It provides the features: * - Sort the RoutingEvent according to their priority. Higher priority * mainly means more constrained segment, which must be routed first. * - The attributes of RoutingEvent may change while inserted in the * queue. The key provide a cached value of those attributes ensuring * a stable sorting order. * * For more details about the sorting order, refer to RoutingEvent::Key. * * Insertion, Reinsertion & Commit * * When pushing a new event into the queue, the actual insertion into the * multimap is delayed until the next call to \c RoutingEvent::commit(). * The to be inserted events are stored into a request set which is * processed when commit is called. At commit time, the RoutingEvent::Key * cache is updated just before inserting the element. * * When repushing an event, the event is immediatly withdrawn from the * queue and put into the request set. * * Mutiple Event for one Segment * * As RoutingEvent can be cloned, there may be more than one event pointing * to a segment. But there must be only one active event, the one * which is pointed to by the segment. As a result, there maybe multiple * events for an unique segment in the queue, but only one active event, * the one that will be processed. */ //! \function RoutingEventQueue::RoutingEventQueue (); //! Contructor, create an empty queue. //! \function RoutingEventQueue::~RoutingEventQueue (); //! Destructor. //! //! \remark The destruction of the queue do not delete the //! RoutingEvent that may still be in it (they shouldn't an //! a warning is issued). //! \function bool RoutingEventQueue::empty () const; //! \sreturn \true if there is the queue is empty. //! \function size_t RoutingEventQueue::size () const; //! \sreturn The number of events in the queue. //! \function unsigned int RoutingEventQueue::getTopEventLevel () const; //! \sreturn The greatest event level the queue has ever reached (always increasing, //! starting from zero). //! \function void RoutingEventQueue::load ( const vector& ); //! Load a whole vector of TrackElement into the queue, for each //! element: //! - Create a RoutingEvent linked to the element. //! \red{To be reviewed: replace any previous event.} //! - Insert the new RoutingEvent into the queue. //! //! No commit is needed after this operation. //! \function void RoutingEventQueue::add ( TrackElement* element, unsigned int level ); //! Create a new RoutingEvent in the queue with \c level, associated to \c element. //! A commit is needed afterwards. //! //! \red{To be reviewed: replace any previous event on element.} //! \function void RoutingEventQueue::push ( RoutingEvent* event ); //! Push a RoutingEvent in the queue. Effective only after the next commit. //! \function RoutingEvent* RoutingEventQueue::pop (); //! Remove the top element of the queue (i.e. the one with the highest //! priority) and return it. If the queue is empty, \c NULL is returned. //! \function void RoutingEventQueue::repush ( RoutingEvent* event ); //! Force a complete queue re-insertion for \c event. The event is immediatly //! withdrawn from the queue and put into the insertion request set. //! //! If the \c event is not already in the queue, works like //! RoutingEventQueue::push(). //! \function void RoutingEventQueue::repushInvalidateds (); //! Using the list of invalidated segments from the Session, repush //! them if: //! - They have an associated event. //! - The event is not \e unimplemented, \e disabled or \e processed. //! \function void RoutingEventQueue::commit (); //! Process the insertion request set and actually insert it's elements //! into the queue. Perform a RoutingEvent::key update prior to insertion. //! \function void RoutingEventQueue::clear (); //! Empty the queue. Issue a warning if the queue is not empty (i.e. some //! events remains to be processeds). }