From ef360a9a1438ae00d70dd8534cb2889ed37d85a6 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 24 Jun 2025 21:47:55 +0100 Subject: [PATCH] Codechange: Use FlatSet to avoid trying to add variant parents multiple times. --- src/autoreplace_gui.cpp | 5 ++--- src/build_vehicle_gui.cpp | 10 ++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 804dd92a9d..73ed7b0846 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -122,7 +122,7 @@ class ReplaceVehicleWindow : public Window { */ void GenerateReplaceVehList(bool draw_left) { - std::vector variants; + FlatSet variants; EngineID selected_engine = EngineID::Invalid(); VehicleType type = this->window_number; uint8_t side = draw_left ? 0 : 1; @@ -161,8 +161,7 @@ class ReplaceVehicleWindow : public Window { if (side == 1) { EngineID parent = e->info.variant_id; - while (parent != EngineID::Invalid()) { - variants.push_back(parent); + while (parent != EngineID::Invalid() && variants.insert(parent).second) { parent = Engine::Get(parent)->info.variant_id; } } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 9386d903a2..d77ea2126c 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1360,7 +1360,7 @@ struct BuildVehicleWindow : Window { /* Figure out what train EngineIDs to put in the list */ void GenerateBuildTrainList(GUIEngineList &list) { - std::vector variants; + FlatSet variants; EngineID sel_id = EngineID::Invalid(); size_t num_engines = 0; @@ -1395,8 +1395,7 @@ struct BuildVehicleWindow : Window { /* Add all parent variants of this engine to the variant list */ EngineID parent = e->info.variant_id; - while (parent != EngineID::Invalid()) { - variants.push_back(parent); + while (parent != EngineID::Invalid() && variants.insert(parent).second) { parent = Engine::Get(parent)->info.variant_id; } @@ -1543,11 +1542,10 @@ struct BuildVehicleWindow : Window { this->FilterEngineList(); /* ensure primary engine of variant group is in list after filtering */ - std::vector variants; + FlatSet variants; for (const auto &item : this->eng_list) { EngineID parent = item.variant_id; - while (parent != EngineID::Invalid()) { - variants.push_back(parent); + while (parent != EngineID::Invalid() && variants.insert(parent).second) { parent = Engine::Get(parent)->info.variant_id; } }