diff options
author | Jonathan G Rennison <j.g.rennison@gmail.com> | 2020-06-15 18:40:51 +0100 |
---|---|---|
committer | Niels Martin Hansen <nielsm@indvikleren.dk> | 2020-06-18 12:38:43 +0200 |
commit | c167648d75428e6ff93f903de65df0cab0370bb6 (patch) | |
tree | 77ca329ee98cad2ccedd070b6bf06f638aef8a06 /src | |
parent | d830a34394a1ef9e9fa574914a01a9dd79c5c2f9 (diff) | |
download | openttd-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.cpp | 44 | ||||
-rw-r--r-- | src/group_gui.cpp | 45 |
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); |