From a3a8a1dd7c7e9d6a98ed2597ebac638edf5f067d Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 12 Jul 2021 11:03:42 +0200 Subject: [PATCH] QDuplicateTracker: simplify the implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...by providing std-compatible insert() functions via a local subclass of QSet, reducing the #ifdef'ery somewhat. Change-Id: Ib532a866b47b82e8e3b9f199e8d1e01a87ed016d Reviewed-by: MÃ¥rten Nordheim --- src/corelib/tools/qduplicatetracker_p.h | 42 ++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h index 5cfa19e03bf..711d4f4ce0f 100644 --- a/src/corelib/tools/qduplicatetracker_p.h +++ b/src/corelib/tools/qduplicatetracker_p.h @@ -83,9 +83,25 @@ class QDuplicateTracker { std::pmr::monotonic_buffer_resource res{buffer, sizeof buffer}; std::pmr::unordered_set> set{Prealloc, &res}; #else - static QSet makeQSet() { QSet r; r.reserve(Prealloc); return r; } - QSet set = makeQSet(); - int setSize = 0; + class Set : public QSet { + qsizetype setSize = 0; + public: + explicit Set(qsizetype n) : QSet{} + { this->reserve(n); } + + auto insert(const T &e) { + auto it = QSet::insert(e); + const auto n = this->size(); + return std::pair{it, qExchange(setSize, n) != n}; + } + + auto insert(T &&e) { + auto it = QSet::insert(std::move(e)); + const auto n = this->size(); + return std::pair{it, qExchange(setSize, n) != n}; + } + }; + Set set{Prealloc}; #endif Q_DISABLE_COPY_MOVE(QDuplicateTracker); public: @@ -93,27 +109,11 @@ public: void reserve(int n) { set.reserve(n); } [[nodiscard]] bool hasSeen(const T &s) { - bool inserted; -#ifdef __cpp_lib_memory_resource - inserted = set.insert(s).second; -#else - set.insert(s); - const int n = set.size(); - inserted = qExchange(setSize, n) != n; -#endif - return !inserted; + return !set.insert(s).second; } [[nodiscard]] bool hasSeen(T &&s) { - bool inserted; -#ifdef __cpp_lib_memory_resource - inserted = set.insert(std::move(s)).second; -#else - set.insert(std::move(s)); - const int n = set.size(); - inserted = qExchange(setSize, n) != n; -#endif - return !inserted; + return !set.insert(std::move(s)).second; } template