Changeset - r24270:970d51c47b55
[Not reviewed]
master
0 2 0
Jonathan G Rennison - 4 years ago 2020-06-15 17:40:51
j.g.rennison@gmail.com
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
2 files changed with 42 insertions and 47 deletions:
0 comments (0 inline, 0 general)
src/company_gui.cpp
Show inline comments
 
@@ -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);
 
		}
src/group_gui.cpp
Show inline comments
 
@@ -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);
 

	
0 comments (0 inline, 0 general)