40std::vector<ElevatorRoute*>
SBS::GetRouteToFloor(
int StartingFloor,
int DestinationFloor,
bool service_access)
52 std::vector<ElevatorRoute*> result;
54 Floor *start_floor = GetFloor(StartingFloor);
55 Floor *dest_floor = GetFloor(DestinationFloor);
57 if (!start_floor || !dest_floor || start_floor == dest_floor)
60 std::vector<int> checked_floors;
65 ElevatorRoute *route = GetDirectRoute(start_floor, DestinationFloor, service_access);
69 result.emplace_back(route);
73 checked_floors.emplace_back(StartingFloor);
77 std::vector<ElevatorRoute*> route = GetIndirectRoute(checked_floors, StartingFloor, DestinationFloor, service_access);
79 if (route.empty() ==
false)
86 for (
size_t i = 0; i < connected.size(); i++)
88 checked_floors.clear();
89 route = GetIndirectRoute(checked_floors, StartingFloor, connected[i], service_access);
91 if (route.empty() ==
false)
94 Floor *floor = GetFloor(connected[i]);
95 ElevatorRoute *endroute = GetDirectRoute(floor, DestinationFloor, service_access);
98 route.emplace_back(endroute);
133std::vector<ElevatorRoute*>
SBS::GetIndirectRoute(std::vector<int> &checked_floors,
int StartingFloor,
int DestinationFloor,
bool service_access,
bool top_level)
141 std::vector<ElevatorRoute*> result;
143 Floor *start_floor = GetFloor(StartingFloor);
148 std::vector<int> list, list_express, list_local;
151 if (service_access ==
true)
156 list.insert(list.end(), list_express.begin(), list_express.end());
158 bool locals_checked =
false;
159 bool recurse =
false;
163 for (
size_t i = 0; i < list.size(); i++)
165 Elevator *elev = GetElevator(list[i]);
176 std::vector<int> floor_list;
177 if ((DestinationFloor > StartingFloor && car->
GetTopFloor() < DestinationFloor) ||
178 (DestinationFloor < StartingFloor && car->GetBottomFloor() < DestinationFloor))
193 for (
size_t j = 0; j < floor_list.size(); j++)
195 int number = floor_list[j];
197 if (number != StartingFloor)
201 std::vector<ElevatorRoute*> result2 = GetIndirectRoute(checked_floors, number, DestinationFloor, service_access,
false);
203 if (result2.empty() ==
false)
206 result.emplace_back(first);
208 for (
size_t i = 0; i < result2.size(); i++)
210 result.emplace_back(result2[i]);
217 Floor *floor = GetFloor(number);
220 bool checked =
false;
221 for (
size_t i = 0; i < checked_floors.size(); i++)
223 if (checked_floors[i] == number)
230 if (floor && checked ==
false)
232 ElevatorRoute *result2 = GetDirectRoute(floor, DestinationFloor, service_access);
237 result.emplace_back(first);
238 result.emplace_back(result2);
242 checked_floors.emplace_back(number);
251 if (top_level ==
false)
255 if (locals_checked ==
true && recurse ==
true)
261 if (locals_checked ==
false && recurse ==
true)
265 list.insert(list.end(), list_local.begin(), list_local.end());
266 locals_checked =
true;
269 else if (recurse ==
false)
std::vector< ElevatorRoute * > GetIndirectRoute(std::vector< int > &checked_floors, int StartingFloor, int DestinationFloor, bool service_access=false, bool top_level=true)