      1  #ifndef EVENT_H
      2  #define EVENT_H
      3
      4  #include <vector>
      5  #include <queue>
      6
      7  using std::priority_queue;
      8  using std::vector;
      9
     10  /**
     11     A single event for a discrete event driven simulation.
     12  */
     13  class Event
     14  {
     15  public:
     16     Event(int t);
     17
     18     /**
     19        Perform one event in the simulation.
     20     */
     21     virtual void do_event() = 0;
     22
     23  protected:
     24     friend class EventComparison;
     25     int time;
     26  };
     27
     28  /**
     29     Compare two events based on their time.
     30  */
     31  class EventComparison
     32  {
     33  public:
     34     bool operator()(const Event* left, const Event* right) const;
     35  };
     36
     37  inline int rand_int(int a, int b)
     38  {
     39     return a + rand() % (b - a + 1);
     40  }
     41
     42  inline Event::Event(int t) : time(t) {}
     43
     44  inline bool EventComparison::operator()
     45     (const Event* left, const Event* right) const
     46  {
     47     return left->time > right->time;
     48  }
     49
     50  /**
     51     Simulation framework for event driven simulation.
     52  */
     53  class Simulation
     54  {
     55  public:
     56     /**
     57        Add new event to simulation.
     58        @param new_event the event to add
     59     */
     60     void schedule_event(Event* new_event);
     61
     62     /**
     63        Run the simulation through all events.
     64     */
     65     void run();
     66  private:
     67     priority_queue<Event*, vector<Event*>, EventComparison> event_queue;
     68  };
     69
     70  inline void Simulation::schedule_event(Event* new_event)
     71  {
     72     event_queue.push(new_event);
     73  }
     74
     75  #endif