/******************************************************************* * * DESCRIPTION: Atomic Model Queue * * AUTHOR: Amir Barylko & Jorge Beyoglonian * * EMAIL: mailto://amir@dc.uba.ar * mailto://jbeyoglo@dc.uba.ar * * DATE: 27/6/1998 * *******************************************************************/ /** include files **/ #include "queue.h" // class Queue #include "message.h" // class ExternalMessage, InternalMessage #include "mainsimu.h" // MainSimulator::Instance().getParameter( ... ) /** public functions **/ /******************************************************************* * Function Name: Queue * Description: ********************************************************************/ Queue::Queue( const string &name ) : Atomic( name ) , in( addInputPort( "in" ) ) , stop( addInputPort( "stop" ) ) , done( addInputPort( "done" ) ) , out( addOutputPort( "out" ) ) , preparationTime( 0, 0, 10, 0 ) { string time( MainSimulator::Instance().getParameter( description(), "preparation" ) ) ; if( time != "" ) preparationTime = time ; } /******************************************************************* * Function Name: initFunction * Description: Resetea la lista * Precondition: El tiempo del proximo evento interno es Infinito ********************************************************************/ Model &Queue::initFunction() { elements.erase( elements.begin(), elements.end() ) ; return *this ; } /******************************************************************* * Function Name: externalFunction * Description: ********************************************************************/ Model &Queue::externalFunction( const ExternalMessage &msg ) { if( msg.port() == in ) { elements.push_back( msg.value() ) ; if( elements.size() == 1 ) holdIn( active, preparationTime ); } if( msg.port() == done ) { elements.pop_front() ; if( !elements.empty() ) holdIn( active, preparationTime ); } if( msg.port() == stop ) if( state() == active && msg.value() ) { timeLeft = msg.time() - lastChange(); passivate(); } else if( state() == passive && !msg.value() ) holdIn( active, timeLeft ); return *this; } /******************************************************************* * Function Name: internalFunction * Description: ********************************************************************/ Model &Queue::internalFunction( const InternalMessage & ) { passivate(); return *this ; } /******************************************************************* * Function Name: outputFunction * Description: ********************************************************************/ Model &Queue::outputFunction( const InternalMessage &msg ) { sendOutput( msg.time(), out, elements.front() ) ; return *this ; }