ref: c521233499b18b6c20d05ea9c6590827c7e15170
parent: bf869f6961de47e44f23a5a57cea8d7ad9d941c0
author: ISSOtm <[email protected]>
date: Sun Apr 24 12:43:29 EDT 2022
Fix `ProtoPalette::compare` Some disjoint sets were mistakenly reported not as such For example, {0} was considered to include {1}.
--- a/include/gfx/proto_palette.hpp
+++ b/include/gfx/proto_palette.hpp
@@ -17,6 +17,7 @@
class ProtoPalette {
// Up to 4 colors, sorted, and where SIZE_MAX means the slot is empty
// (OK because it's not a valid color index)
+ // Sorting is done on the raw numerical values to lessen `compare`'s complexity
std::array<uint16_t, 4> _colorIndices{UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
public:
--- a/src/gfx/proto_palette.cpp
+++ b/src/gfx/proto_palette.cpp
@@ -10,6 +10,7 @@
#include <algorithm>
#include <array>
+#include <cassert>
#include <stddef.h>
#include <stdint.h>
@@ -41,6 +42,10 @@
}
ProtoPalette::ComparisonResult ProtoPalette::compare(ProtoPalette const &other) const {
+ // This works because the sets are sorted numerically
+ assert(std::is_sorted(_colorIndices.begin(), _colorIndices.end()));
+ assert(std::is_sorted(other._colorIndices.begin(), other._colorIndices.end()));
+
auto ours = _colorIndices.begin(), theirs = other._colorIndices.begin();
bool weBigger = true, theyBigger = true;
@@ -56,8 +61,8 @@
weBigger = false;
}
}
- weBigger &= ours == _colorIndices.end();
- theyBigger &= theirs == other._colorIndices.end();
+ weBigger &= theirs == other._colorIndices.end();
+ theyBigger &= ours == _colorIndices.end();
return theyBigger ? THEY_BIGGER : (weBigger ? WE_BIGGER : NEITHER);
}