@@ -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