From 09b77a8d07276e0b5e5fec596f957f8fc4a78869 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 20 Jan 2025 15:40:04 +0100 Subject: [PATCH] Add a QDuplicateTracker::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 --- src/corelib/tools/qduplicatetracker_p.h | 5 +++++ .../qduplicatetracker/tst_qduplicatetracker.cpp | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h index 7e47ab0272a..434285e4907 100644 --- a/src/corelib/tools/qduplicatetracker_p.h +++ b/src/corelib/tools/qduplicatetracker_p.h @@ -94,6 +94,11 @@ public: { 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 void appendTo(C &c) const & diff --git a/tests/auto/corelib/tools/qduplicatetracker/tst_qduplicatetracker.cpp b/tests/auto/corelib/tools/qduplicatetracker/tst_qduplicatetracker.cpp index ad0b6abbc70..f370fcf6814 100644 --- a/tests/auto/corelib/tools/qduplicatetracker/tst_qduplicatetracker.cpp +++ b/tests/auto/corelib/tools/qduplicatetracker/tst_qduplicatetracker.cpp @@ -24,12 +24,17 @@ void tst_QDuplicateTracker::hasSeen() { { QDuplicateTracker tracker; + QVERIFY(!tracker.contains(0)); + QVERIFY(!tracker.contains(0)); QVERIFY(!tracker.hasSeen(0)); QVERIFY(tracker.hasSeen(0)); + QVERIFY(tracker.contains(0)); QVERIFY(!tracker.hasSeen(1)); QVERIFY(tracker.hasSeen(1)); // past the prealloc amount + QVERIFY(!tracker.contains(2)); QVERIFY(!tracker.hasSeen(2)); + QVERIFY(tracker.contains(2)); QVERIFY(tracker.hasSeen(2)); } @@ -41,12 +46,16 @@ void tst_QDuplicateTracker::hasSeen() QString string3("string3"); // Move when seen + QVERIFY(!tracker.contains(string1)); QVERIFY(!tracker.hasSeen(string1)); + QVERIFY(tracker.contains(string1)); QVERIFY(tracker.hasSeen(std::move(string1))); // Move when unseen + QVERIFY(!tracker.contains(string2)); QVERIFY(!tracker.hasSeen(std::move(string2))); QVERIFY(tracker.hasSeen(string2_2)); + QVERIFY(tracker.contains(string2_2)); // Past the prealloc amount QVERIFY(!tracker.hasSeen(string3)); @@ -62,17 +71,19 @@ void tst_QDuplicateTracker::hasSeen() // Move when seen QVERIFY(!tracker.hasSeen(string1)); + QVERIFY(tracker.contains(string1)); QVERIFY(tracker.hasSeen(std::move(string1))); // Move when unseen QVERIFY(!tracker.hasSeen(std::move(string2))); QVERIFY(tracker.hasSeen(string2_2)); + QVERIFY(tracker.contains(string2_2)); // Past the prealloc amount + QVERIFY(!tracker.contains(string3)); QVERIFY(!tracker.hasSeen(string3)); QVERIFY(tracker.hasSeen(string3)); } - } void tst_QDuplicateTracker::clear() @@ -80,14 +91,18 @@ void tst_QDuplicateTracker::clear() QDuplicateTracker tracker; QVERIFY(!tracker.hasSeen(0)); QVERIFY(tracker.hasSeen(0)); + QVERIFY(tracker.contains(0)); + QVERIFY(!tracker.contains(1)); QVERIFY(!tracker.hasSeen(1)); QVERIFY(tracker.hasSeen(1)); tracker.clear(); + QVERIFY(!tracker.contains(0)); QVERIFY(!tracker.hasSeen(0)); QVERIFY(tracker.hasSeen(0)); QVERIFY(!tracker.hasSeen(1)); QVERIFY(tracker.hasSeen(1)); + QVERIFY(tracker.contains(1)); } void tst_QDuplicateTracker::appendTo()