This repository has been archived by the owner on Dec 15, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAirport.h
96 lines (68 loc) · 2.49 KB
/
Airport.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef PROJECT2_AIRPORT_H
#define PROJECT2_AIRPORT_H
#include <vector>
#include <queue>
#include <ostream>
#include "models/Feature.h"
#include "models/Passenger.h"
#include "models/ControlPoint.h"
#include "models/Event.h"
#include "models/Report.h"
typedef std::vector<Passenger> PassengerList;
struct PassengerLessImportant {
// less than operator
bool operator()(const Passenger* a, const Passenger* b) {
return *a < *b;
}
};
class Airport {
private:
unsigned long clock = 0;
Feature features;
std::priority_queue<Event> events;
std::queue<Passenger*> luggageQueue;
std::queue<Passenger*> securityQueue;
std::priority_queue<Passenger*, std::vector<Passenger*>, PassengerLessImportant> pSecurityQueue;
std::priority_queue<Passenger*, std::vector<Passenger*>, PassengerLessImportant> pLuggageQueue;
ControlPoint luggageControl;
ControlPoint securityControl;
void dispatchHandler(Event& event);
void emit(Event event);
void acceptPassenger(Passenger& passenger);
void handleEntered(Passenger& passenger);
void handlePastLuggage(Passenger& passenger);
void handlePastSecurity(Passenger& passenger);
void handleDeparture(Passenger& passenger);
void handleExited(Passenger& passenger);
void processSecurityQueue();
void processLuggageQueue();
Passenger* popLuggageQueue();
Passenger* popSecurityQueue();
Report prepareReport(PassengerList& passengers);
bool canSkipLuggageControl(Passenger& passenger) {
return features & ONLINE_TICKETING && !passenger.hasLuggage;
}
bool canSkipSecurityControl(Passenger& passenger) {
return features & VIP_SKIP_SECURITY && passenger.isVip;
}
bool canCutInLine() {
return features & FIRST_FLY_FIRST_SERVE;
}
void pushSecurityQueue(Passenger& passenger);
void pushLuggageQueue(Passenger& passenger);
public:
Airport(unsigned long securityCounters, unsigned long luggageCounters)
: luggageControl(ControlPoint(luggageCounters)),
securityControl(ControlPoint(securityCounters)) {
this->features = FIRST_COME_FIRST_SERVE;
}
void setFeatures(Feature features) {
this->features = features;
if (!(features & FIRST_FLY_FIRST_SERVE)) {
this->features = features | FIRST_COME_FIRST_SERVE;
}
}
Report run(PassengerList& passengers);
friend std::ostream& operator<<(std::ostream& os, const Airport& airport);
};
#endif //PROJECT2_AIRPORT_H