Add a QDuplicateTracker<T>::contains()

When even some values I haven't seen may need to be left for later,
but values I have seen are definitely to be discarded, I need to know
if I've already processed them before doing the fiddly check for
whether to defer; but if I decide to defer, I haven't yet processed
and need the later check, to which I've deferred, to see the value as
still new, even though I did once ask about it before. So I need a way
to query without adding to the set.

Pick-to: 6.9 6.8 6.5
Change-Id: I712f1c400147210c149aeec6de1d15d2e095d6a9
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
Edward Welbourne 2025-01-20 15:40:04 +01:00 committed by Marc Mutz
parent 3e29267df0
commit 09b77a8d07
2 changed files with 21 additions and 1 deletions

View File

@ -94,6 +94,11 @@ public:
{ {
return !set.insert(std::move(s)).second; return !set.insert(std::move(s)).second;
} }
// For when you want to know, but aren't *yet* sure you'll add it:
[[nodiscard]] bool contains(const T &s) const
{
return set.find(s) != set.end(); // TODO C++20: can use set.contains()
}
template <typename C> template <typename C>
void appendTo(C &c) const & void appendTo(C &c) const &

View File

@ -24,12 +24,17 @@ void tst_QDuplicateTracker::hasSeen()
{ {
{ {
QDuplicateTracker<int, 2> tracker; QDuplicateTracker<int, 2> tracker;
QVERIFY(!tracker.contains(0));
QVERIFY(!tracker.contains(0));
QVERIFY(!tracker.hasSeen(0)); QVERIFY(!tracker.hasSeen(0));
QVERIFY(tracker.hasSeen(0)); QVERIFY(tracker.hasSeen(0));
QVERIFY(tracker.contains(0));
QVERIFY(!tracker.hasSeen(1)); QVERIFY(!tracker.hasSeen(1));
QVERIFY(tracker.hasSeen(1)); QVERIFY(tracker.hasSeen(1));
// past the prealloc amount // past the prealloc amount
QVERIFY(!tracker.contains(2));
QVERIFY(!tracker.hasSeen(2)); QVERIFY(!tracker.hasSeen(2));
QVERIFY(tracker.contains(2));
QVERIFY(tracker.hasSeen(2)); QVERIFY(tracker.hasSeen(2));
} }
@ -41,12 +46,16 @@ void tst_QDuplicateTracker::hasSeen()
QString string3("string3"); QString string3("string3");
// Move when seen // Move when seen
QVERIFY(!tracker.contains(string1));
QVERIFY(!tracker.hasSeen(string1)); QVERIFY(!tracker.hasSeen(string1));
QVERIFY(tracker.contains(string1));
QVERIFY(tracker.hasSeen(std::move(string1))); QVERIFY(tracker.hasSeen(std::move(string1)));
// Move when unseen // Move when unseen
QVERIFY(!tracker.contains(string2));
QVERIFY(!tracker.hasSeen(std::move(string2))); QVERIFY(!tracker.hasSeen(std::move(string2)));
QVERIFY(tracker.hasSeen(string2_2)); QVERIFY(tracker.hasSeen(string2_2));
QVERIFY(tracker.contains(string2_2));
// Past the prealloc amount // Past the prealloc amount
QVERIFY(!tracker.hasSeen(string3)); QVERIFY(!tracker.hasSeen(string3));
@ -62,17 +71,19 @@ void tst_QDuplicateTracker::hasSeen()
// Move when seen // Move when seen
QVERIFY(!tracker.hasSeen(string1)); QVERIFY(!tracker.hasSeen(string1));
QVERIFY(tracker.contains(string1));
QVERIFY(tracker.hasSeen(std::move(string1))); QVERIFY(tracker.hasSeen(std::move(string1)));
// Move when unseen // Move when unseen
QVERIFY(!tracker.hasSeen(std::move(string2))); QVERIFY(!tracker.hasSeen(std::move(string2)));
QVERIFY(tracker.hasSeen(string2_2)); QVERIFY(tracker.hasSeen(string2_2));
QVERIFY(tracker.contains(string2_2));
// Past the prealloc amount // Past the prealloc amount
QVERIFY(!tracker.contains(string3));
QVERIFY(!tracker.hasSeen(string3)); QVERIFY(!tracker.hasSeen(string3));
QVERIFY(tracker.hasSeen(string3)); QVERIFY(tracker.hasSeen(string3));
} }
} }
void tst_QDuplicateTracker::clear() void tst_QDuplicateTracker::clear()
@ -80,14 +91,18 @@ void tst_QDuplicateTracker::clear()
QDuplicateTracker<int, 2> tracker; QDuplicateTracker<int, 2> tracker;
QVERIFY(!tracker.hasSeen(0)); QVERIFY(!tracker.hasSeen(0));
QVERIFY(tracker.hasSeen(0)); QVERIFY(tracker.hasSeen(0));
QVERIFY(tracker.contains(0));
QVERIFY(!tracker.contains(1));
QVERIFY(!tracker.hasSeen(1)); QVERIFY(!tracker.hasSeen(1));
QVERIFY(tracker.hasSeen(1)); QVERIFY(tracker.hasSeen(1));
tracker.clear(); tracker.clear();
QVERIFY(!tracker.contains(0));
QVERIFY(!tracker.hasSeen(0)); QVERIFY(!tracker.hasSeen(0));
QVERIFY(tracker.hasSeen(0)); QVERIFY(tracker.hasSeen(0));
QVERIFY(!tracker.hasSeen(1)); QVERIFY(!tracker.hasSeen(1));
QVERIFY(tracker.hasSeen(1)); QVERIFY(tracker.hasSeen(1));
QVERIFY(tracker.contains(1));
} }
void tst_QDuplicateTracker::appendTo() void tst_QDuplicateTracker::appendTo()