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 }