CompleteEventBagModel& EventTable::popEvent() { mCurrentTime = topEvent(); if (mCurrentTime != infinity) { while (not mInternalEventList.empty() and mInternalEventList[0]->getTime() == mCurrentTime) { if (mInternalEventList[0]->isValid()) { Simulator* mdl = mInternalEventList[0]->getModel(); EventBagModel& bagmodel = mCompleteEventBagModel.getBag(mdl); bagmodel.addInternal(mInternalEventList[0]); } popInternalEvent(); } while (not mExternalEventModel.empty()) { Simulator* mdl = (*mExternalEventModel.begin()).first; EventBagModel& bagmodel = mCompleteEventBagModel.getBag(mdl); bagmodel.addExternal((*mExternalEventModel.begin()).second); mExternalEventModel.erase(mExternalEventModel.begin()); } if (mCompleteEventBagModel.emptyBag()) while (not mObservationEventList.empty() and mObservationEventList.front()->getTime() == mCurrentTime) { mCompleteEventBagModel.addState(mObservationEventList.front()); popObservationEvent(); } } mCompleteEventBagModel.init(); return mCompleteEventBagModel; }
void step() { Event topEvent( popTopEvent() ); this->time = topEvent.getTime(); topEvent.fire(); }
void step() { // Here I copy construct the top event and use its event // ID to reschedule it. This is necessary if events can // be created or deleted within fire() and the dynamic // priority queue can reallocate internal data structures. // Most of the cost of using this is optimized away when // the dynamic priority queue has a VolatileIDPolicy. Event topEvent( getTopEvent() ); const EventID ID( this->eventPriorityQueue.getTopID() ); this->time = topEvent.getTime(); // Fire top topEvent.fire(); // If the event is rescheduled into the past, remove it. // Otherwise, reuse the event. if( topEvent.getTime() >= getTime() ) { this->eventPriorityQueue.replace( ID, topEvent ); } else { this->eventPriorityQueue.pop( ID ); } // assert( getNextTime() >= getTime() ); // update dependent events // const EventIndexVector& // anEventIndexVector( this->eventDependencyArray[ topEventIndex ] ); /* for( typename EventIndexVector::const_iterator i( anEventIndexVector.begin() ); i != anEventIndexVector.end(); ++i ) { const EventIndex anIndex( *i ); updateEvent( anIndex, currentTime ); } */ }