      1  #include "event.h"
      2  #include <iostream>
      3
      4  using namespace std;
      5
      6  /**
      7     Simulation of a hot dog stand with limited seating
      8  */
      9  class HotDogStand : public Simulation
     10  {
     11  public:
     12     HotDogStand(int s);
     13     /**
     14        Test to see if new customer can be seated.
     15        @return true if customer is seated
     16     */
     17     bool can_seat();
     18
     19     /**
     20        Satisfied customer leaves, having eaten.
     21     */
     22     void customer_leaves();
     23  private:
     24     int free_seats;
     25  };
     26
     27  HotDogStand::HotDogStand(int s) : free_seats(s) {}
     28
     29  bool HotDogStand::can_seat()
     30  {
     31     if (free_seats > 0)
     32     {
     33        free_seats--;
     34        return true;
     35     }
     36     else
     37        return false;
     38  }
     39
     40  void HotDogStand::customer_leaves()
     41  {
     42     free_seats++;
     43  }
     44
     45  HotDogStand freds(3);
     46
     47  /**
     48     Arrival event for simulation.
     49     Either customer is seated, or leaves without eating.
     50  */
     51  class ArriveEvent : public Event
     52  {
     53  public:
     54     ArriveEvent(int t);
     55     virtual void do_event();
     56  };
     57
     58  /**
     59     Leave event for simulation.
     60     Satisfied customer leaves and releases seat.
     61  */
     62  class LeaveEvent : public Event
     63  {
     64  public:
     65     LeaveEvent(int t);
     66     virtual void do_event();
     67  };
     68
     69  ArriveEvent::ArriveEvent(int t) : Event(t) {}
     70
     71  void ArriveEvent::do_event()
     72  {
     73     if (freds.can_seat())
     74     {
     75        cout << "time " << time << " Customer is seated\n";
     76        freds.schedule_event(new LeaveEvent(time + rand_int(1, 5)));
     77     }
     78     else
     79        cout << "time " << time
     80           << " Customer is unable to find a seat, leaves\n";
     81  }
     82
     83  LeaveEvent::LeaveEvent(int t) : Event(t) {}
     84
     85  void LeaveEvent::do_event()
     86  {
     87     cout << "time " << time << " Customer finishes eating, leaves\n";
     88     freds.customer_leaves();
     89  }
     90
     91  int main()
     92  {
     93     for (int i = 0; i < 50; i++)
     94        freds.schedule_event(new ArriveEvent(rand_int(1, 60)));
     95     freds.run();
     96     return 0;
     97  }