summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan G Rennison <j.g.rennison@gmail.com>2020-06-15 18:40:51 +0100
committerNiels Martin Hansen <nielsm@indvikleren.dk>2020-06-18 12:38:43 +0200
commitc167648d75428e6ff93f903de65df0cab0370bb6 (patch)
tree77ca329ee98cad2ccedd070b6bf06f638aef8a06 /src
parentd830a34394a1ef9e9fa574914a01a9dd79c5c2f9 (diff)
downloadopenttd-c167648d75428e6ff93f903de65df0cab0370bb6.tar.xz
Fix: Violation of strict weak ordering in group name sorters
This could be caused by a group being renamed, and the old name being cached from a previous sort. See: #7838
Diffstat (limited to 'src')
-rw-r--r--src/company_gui.cpp44
-rw-r--r--src/group_gui.cpp45
2 files changed, 42 insertions, 47 deletions
diff --git a/src/company_gui.cpp b/src/company_gui.cpp
index 423efcb01..f4fe7f803 100644
--- a/src/company_gui.cpp
+++ b/src/company_gui.cpp
@@ -615,28 +615,6 @@ private:
ShowDropDownList(this, std::move(list), sel, widget);
}
- static bool GroupNameSorter(const Group * const &a, const Group * const &b)
- {
- static const Group *last_group[2] = { nullptr, nullptr };
- static char last_name[2][64] = { "", "" };
-
- if (a != last_group[0]) {
- last_group[0] = a;
- SetDParam(0, a->index);
- GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0]));
- }
-
- if (b != last_group[1]) {
- last_group[1] = b;
- SetDParam(0, b->index);
- GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1]));
- }
-
- int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting).
- if (r == 0) return a->index < b->index;
- return r < 0;
- }
-
void AddChildren(GUIGroupList *source, GroupID parent, int indent)
{
for (const Group *g : *source) {
@@ -665,7 +643,27 @@ private:
}
list.ForceResort();
- list.Sort(&GroupNameSorter);
+
+ /* Sort the groups by their name */
+ const Group *last_group[2] = { nullptr, nullptr };
+ char last_name[2][64] = { "", "" };
+ list.Sort([&](const Group * const &a, const Group * const &b) -> bool {
+ if (a != last_group[0]) {
+ last_group[0] = a;
+ SetDParam(0, a->index);
+ GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0]));
+ }
+
+ if (b != last_group[1]) {
+ last_group[1] = b;
+ SetDParam(0, b->index);
+ GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1]));
+ }
+
+ int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting).
+ if (r == 0) return a->index < b->index;
+ return r < 0;
+ });
AddChildren(&list, INVALID_GROUP, 0);
}
diff --git a/src/group_gui.cpp b/src/group_gui.cpp
index 0bf8589ac..8d0bba8fb 100644
--- a/src/group_gui.cpp
+++ b/src/group_gui.cpp
@@ -141,29 +141,6 @@ private:
}
}
- /** Sort the groups by their name */
- static bool GroupNameSorter(const Group * const &a, const Group * const &b)
- {
- static const Group *last_group[2] = { nullptr, nullptr };
- static char last_name[2][64] = { "", "" };
-
- if (a != last_group[0]) {
- last_group[0] = a;
- SetDParam(0, a->index);
- GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0]));
- }
-
- if (b != last_group[1]) {
- last_group[1] = b;
- SetDParam(0, b->index);
- GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1]));
- }
-
- int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting).
- if (r == 0) return a->index < b->index;
- return r < 0;
- }
-
/**
* (Re)Build the group list.
*
@@ -185,7 +162,27 @@ private:
}
list.ForceResort();
- list.Sort(&GroupNameSorter);
+
+ /* Sort the groups by their name */
+ const Group *last_group[2] = { nullptr, nullptr };
+ char last_name[2][64] = { "", "" };
+ list.Sort([&](const Group * const &a, const Group * const &b) {
+ if (a != last_group[0]) {
+ last_group[0] = a;
+ SetDParam(0, a->index);
+ GetString(last_name[0], STR_GROUP_NAME, lastof(last_name[0]));
+ }
+
+ if (b != last_group[1]) {
+ last_group[1] = b;
+ SetDParam(0, b->index);
+ GetString(last_name[1], STR_GROUP_NAME, lastof(last_name[1]));
+ }
+
+ int r = strnatcmp(last_name[0], last_name[1]); // Sort by name (natural sorting).
+ if (r == 0) return a->index < b->index;
+ return r < 0;
+ });
AddChildren(&list, INVALID_GROUP, 0);