Fix ProtoPalette::compare

Some disjoint sets were mistakenly reported not as such
For example, {0} was considered to include {1}.
This commit is contained in:
ISSOtm
2022-04-24 16:43:29 +02:00
committed by Eldred Habert
parent bf869f6961
commit c521233499
2 changed files with 8 additions and 2 deletions

View File

@@ -17,6 +17,7 @@
class ProtoPalette { class ProtoPalette {
// Up to 4 colors, sorted, and where SIZE_MAX means the slot is empty // Up to 4 colors, sorted, and where SIZE_MAX means the slot is empty
// (OK because it's not a valid color index) // (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}; std::array<uint16_t, 4> _colorIndices{UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
public: public:

View File

@@ -10,6 +10,7 @@
#include <algorithm> #include <algorithm>
#include <array> #include <array>
#include <cassert>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@@ -41,6 +42,10 @@ bool ProtoPalette::add(uint16_t color) {
} }
ProtoPalette::ComparisonResult ProtoPalette::compare(ProtoPalette const &other) const { 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(); auto ours = _colorIndices.begin(), theirs = other._colorIndices.begin();
bool weBigger = true, theyBigger = true; bool weBigger = true, theyBigger = true;
@@ -56,8 +61,8 @@ ProtoPalette::ComparisonResult ProtoPalette::compare(ProtoPalette const &other)
weBigger = false; weBigger = false;
} }
} }
weBigger &= ours == _colorIndices.end(); weBigger &= theirs == other._colorIndices.end();
theyBigger &= theirs == other._colorIndices.end(); theyBigger &= ours == _colorIndices.end();
return theyBigger ? THEY_BIGGER : (weBigger ? WE_BIGGER : NEITHER); return theyBigger ? THEY_BIGGER : (weBigger ? WE_BIGGER : NEITHER);
} }