Skip to content

Commit 5c18933

Browse files
committed
Replace array with umap in TrafficLight class
1 parent 99a702a commit 5c18933

File tree

6 files changed

+269
-314
lines changed

6 files changed

+269
-314
lines changed

src/dsm/dsm.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
static constexpr uint8_t DSM_VERSION_MAJOR = 2;
88
static constexpr uint8_t DSM_VERSION_MINOR = 6;
9-
static constexpr uint8_t DSM_VERSION_PATCH = 9;
9+
static constexpr uint8_t DSM_VERSION_PATCH = 10;
1010

1111
static auto const DSM_VERSION =
1212
std::format("{}.{}.{}", DSM_VERSION_MAJOR, DSM_VERSION_MINOR, DSM_VERSION_PATCH);

src/dsm/headers/TrafficLight.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace dsm {
5151

5252
class TrafficLight : public Intersection {
5353
private:
54-
std::unordered_map<Id, std::array<TrafficLightCycle, 3>> m_cycles;
54+
std::unordered_map<Id, std::unordered_map<Direction, TrafficLightCycle>> m_cycles;
5555
Delay m_cycleTime; // The total time of a red-green cycle
5656
Delay m_counter;
5757

@@ -104,9 +104,9 @@ namespace dsm {
104104
/// @param cycle The traffic light cycle
105105
void setCycle(Id const streetId, Direction direction, TrafficLightCycle const& cycle);
106106
/// @brief Set the traffic light's cycles
107-
/// @param cycles std::unordered_map<Id, std::array<TrafficLightCycle, 3>> The traffic light's cycles
107+
/// @param cycles std::unordered_map<Id, std::unordered_map<Direction, TrafficLightCycle>> The traffic light's cycles
108108
inline void setCycles(
109-
std::unordered_map<Id, std::array<TrafficLightCycle, 3>> cycles) {
109+
std::unordered_map<Id, std::unordered_map<Direction, TrafficLightCycle>> cycles) {
110110
m_cycles = std::move(cycles);
111111
}
112112
/// @brief Set the complementary cycle for a street
@@ -129,8 +129,9 @@ namespace dsm {
129129
/// @param delta Delay, the time to increase or decrease the green times
130130
void decreaseGreenTimes(Delay const delta);
131131
/// @brief Get the traffic light's cycles
132-
/// @return std::unordered_map<Id, std::array<TrafficLightCycle, 3>>& The traffic light's cycles
133-
inline std::unordered_map<Id, std::array<TrafficLightCycle, 3>> const& cycles() const {
132+
/// @return std::unordered_map<Id, std::unordered_map<Direction, TrafficLightCycle>> const& The traffic light's cycles
133+
inline std::unordered_map<Id, std::unordered_map<Direction, TrafficLightCycle>> const&
134+
cycles() const {
134135
return m_cycles;
135136
}
136137
/// @brief Returns true if all the cycles are set to their default values

src/dsm/sources/RoadNetwork.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ namespace dsm {
7979
}
8080
if (node->isTrafficLight()) {
8181
auto& trafficLight = dynamic_cast<TrafficLight&>(*node);
82-
std::unordered_map<Id, std::array<TrafficLightCycle, 3>> newCycles;
82+
std::unordered_map<Id, std::unordered_map<Direction, TrafficLightCycle>> newCycles;
8383
for (auto const& [streetId, cycles] : trafficLight.cycles()) {
8484
newCycles.emplace(newStreetIds.at(streetId), std::move(cycles));
8585
}

src/dsm/sources/TrafficLight.cpp

Lines changed: 27 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -26,32 +26,7 @@ namespace dsm {
2626
cycle.phase(),
2727
m_cycleTime));
2828
}
29-
if (direction == Direction::UTURN) {
30-
direction = Direction::LEFT;
31-
}
32-
if (!m_cycles.contains(streetId)) {
33-
TrafficLightCycle defaultCycle(m_cycleTime, 0);
34-
std::array<TrafficLightCycle, 3> cycles{defaultCycle, defaultCycle, defaultCycle};
35-
m_cycles.emplace(streetId, cycles);
36-
}
37-
switch (direction) {
38-
case Direction::RIGHTANDSTRAIGHT:
39-
m_cycles.at(streetId)[Direction::RIGHT] = cycle;
40-
m_cycles.at(streetId)[Direction::STRAIGHT] = cycle;
41-
break;
42-
case Direction::LEFTANDSTRAIGHT:
43-
m_cycles.at(streetId)[Direction::LEFT] = cycle;
44-
m_cycles.at(streetId)[Direction::STRAIGHT] = cycle;
45-
break;
46-
case Direction::ANY:
47-
m_cycles.at(streetId)[Direction::RIGHT] = cycle;
48-
m_cycles.at(streetId)[Direction::STRAIGHT] = cycle;
49-
m_cycles.at(streetId)[Direction::LEFT] = cycle;
50-
break;
51-
default:
52-
m_cycles.at(streetId)[direction] = cycle;
53-
break;
54-
}
29+
m_cycles[streetId].emplace(direction, cycle);
5530
}
5631

5732
void TrafficLightCycle::reset() {
@@ -68,7 +43,7 @@ namespace dsm {
6843
throw std::invalid_argument(Logger::buildExceptionMessage("Cycle does not exist."));
6944
}
7045
m_cycles.emplace(streetId, m_cycles.at(existingCycle));
71-
for (auto& cycle : m_cycles.at(streetId)) {
46+
for (auto& [direction, cycle] : m_cycles.at(streetId)) {
7247
cycle = TrafficLightCycle(m_cycleTime - cycle.greenTime(),
7348
cycle.phase() + m_cycleTime - cycle.greenTime());
7449
}
@@ -93,11 +68,11 @@ namespace dsm {
9368
Delay maxTime{0};
9469
for (auto const& [streetId, cycles] : m_cycles) {
9570
if (priorityStreets && m_streetPriorities.contains(streetId)) {
96-
for (auto const& cycle : cycles) {
71+
for (auto const& [direction, cycle] : cycles) {
9772
maxTime = std::max(maxTime, cycle.greenTime());
9873
}
9974
} else {
100-
for (auto const& cycle : cycles) {
75+
for (auto const& [direction, cycle] : cycles) {
10176
maxTime = std::max(maxTime, cycle.greenTime());
10277
}
10378
}
@@ -109,11 +84,11 @@ namespace dsm {
10984
Delay minTime{std::numeric_limits<Delay>::max()};
11085
for (auto const& [streetId, cycles] : m_cycles) {
11186
if (priorityStreets && m_streetPriorities.contains(streetId)) {
112-
for (auto const& cycle : cycles) {
87+
for (auto const& [direction, cycle] : cycles) {
11388
minTime = std::min(minTime, cycle.greenTime());
11489
}
11590
} else {
116-
for (auto const& cycle : cycles) {
91+
for (auto const& [direction, cycle] : cycles) {
11792
minTime = std::min(minTime, cycle.greenTime());
11893
}
11994
}
@@ -132,8 +107,8 @@ namespace dsm {
132107
cycles.end(),
133108
0.0, // Initial value (double)
134109
std::plus<double>(), // Reduction function (addition)
135-
[](const TrafficLightCycle& cycle) -> double {
136-
return static_cast<double>(cycle.greenTime());
110+
[](const auto& pair) -> double {
111+
return static_cast<double>(pair.second.greenTime());
137112
});
138113
nCycles += cycles.size();
139114
}
@@ -144,11 +119,11 @@ namespace dsm {
144119
void TrafficLight::increaseGreenTimes(Delay const delta) {
145120
for (auto& [streetId, cycles] : m_cycles) {
146121
if (m_streetPriorities.contains(streetId)) {
147-
for (auto& cycle : cycles) {
122+
for (auto& [direction, cycle] : cycles) {
148123
cycle = TrafficLightCycle(cycle.greenTime() + delta, cycle.phase());
149124
}
150125
} else {
151-
for (auto& cycle : cycles) {
126+
for (auto& [direction, cycle] : cycles) {
152127
cycle = TrafficLightCycle(cycle.greenTime() - delta, cycle.phase() + delta);
153128
}
154129
}
@@ -158,11 +133,11 @@ namespace dsm {
158133
void TrafficLight::decreaseGreenTimes(Delay const delta) {
159134
for (auto& [streetId, cycles] : m_cycles) {
160135
if (!m_streetPriorities.contains(streetId)) {
161-
for (auto& cycle : cycles) {
136+
for (auto& [direction, cycle] : cycles) {
162137
cycle = TrafficLightCycle(cycle.greenTime() + delta, cycle.phase());
163138
}
164139
} else {
165-
for (auto& cycle : cycles) {
140+
for (auto& [direction, cycle] : cycles) {
166141
cycle = TrafficLightCycle(cycle.greenTime() - delta, cycle.phase() + delta);
167142
}
168143
}
@@ -171,7 +146,7 @@ namespace dsm {
171146

172147
bool TrafficLight::isDefault() const {
173148
for (auto const& [streetId, cycles] : m_cycles) {
174-
for (auto const& cycle : cycles) {
149+
for (auto const& [direction, cycle] : cycles) {
175150
if (!cycle.isDefault()) {
176151
return false;
177152
}
@@ -181,39 +156,30 @@ namespace dsm {
181156
}
182157

183158
bool TrafficLight::isGreen(Id const streetId, Direction direction) const {
184-
if (m_cycles.empty()) {
185-
return true;
186-
}
187159
if (!m_cycles.contains(streetId)) {
188160
throw std::invalid_argument(Logger::buildExceptionMessage(
189161
std::format("Street id {} is not valid for node {}.", streetId, id())));
190162
}
191-
switch (direction) {
192-
case Direction::UTURN:
163+
if (!m_cycles.at(streetId).contains(direction)) {
164+
if (direction != Direction::UTURN) {
165+
return true;
166+
}
167+
if (m_cycles.at(streetId).contains(Direction::LEFT)) {
193168
direction = Direction::LEFT;
194-
break;
195-
case Direction::RIGHTANDSTRAIGHT:
196-
return m_cycles.at(streetId)[Direction::RIGHT].isGreen(m_cycleTime, m_counter) &&
197-
m_cycles.at(streetId)[Direction::STRAIGHT].isGreen(m_cycleTime, m_counter);
198-
case Direction::LEFTANDSTRAIGHT:
199-
return m_cycles.at(streetId)[Direction::LEFT].isGreen(m_cycleTime, m_counter) &&
200-
m_cycles.at(streetId)[Direction::STRAIGHT].isGreen(m_cycleTime, m_counter);
201-
case Direction::ANY:
202-
return m_cycles.at(streetId)[Direction::RIGHT].isGreen(m_cycleTime, m_counter) &&
203-
m_cycles.at(streetId)[Direction::STRAIGHT].isGreen(m_cycleTime,
204-
m_counter) &&
205-
m_cycles.at(streetId)[Direction::LEFT].isGreen(m_cycleTime, m_counter);
206-
default:
207-
break;
208-
}
209-
return m_cycles.at(streetId)[direction].isGreen(m_cycleTime, m_counter);
169+
} else if (m_cycles.at(streetId).contains(Direction::LEFTANDSTRAIGHT)) {
170+
direction = Direction::LEFTANDSTRAIGHT;
171+
} else {
172+
return true;
173+
}
174+
}
175+
return m_cycles.at(streetId).at(direction).isGreen(m_cycleTime, m_counter);
210176
}
211177

212178
bool TrafficLight::isFavouringDirection(bool const priority) const {
213179
for (auto const& [streetId, cycles] : m_cycles) {
214180
if ((priority && m_streetPriorities.contains(streetId)) ||
215181
(!priority && !m_streetPriorities.contains(streetId))) {
216-
for (auto const& cycle : cycles) {
182+
for (auto const& [direction, cycle] : cycles) {
217183
if (!cycle.isGreenTimeIncreased()) {
218184
return false;
219185
}
@@ -225,7 +191,7 @@ namespace dsm {
225191

226192
void TrafficLight::resetCycles() {
227193
for (auto& [streetId, cycles] : m_cycles) {
228-
for (auto& cycle : cycles) {
194+
for (auto& [direction, cycle] : cycles) {
229195
cycle.reset();
230196
}
231197
}

0 commit comments

Comments
 (0)