diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2021-07-12 11:03:42 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2021-07-13 21:29:52 +0200 |
commit | a3a8a1dd7c7e9d6a98ed2597ebac638edf5f067d (patch) | |
tree | 7a6ea8d73b97c017a676f4729c48226c3aae493e /src/corelib/tools | |
parent | fbcb3fc50675b20809ae700236be263f5a38a464 (diff) |
QDuplicateTracker: simplify the implementation
...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 <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qduplicatetracker_p.h | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h index 5cfa19e03b..711d4f4ce0 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<T, QHasher<T>> set{Prealloc, &res}; #else - static QSet<T> makeQSet() { QSet<T> r; r.reserve(Prealloc); return r; } - QSet<T> set = makeQSet(); - int setSize = 0; + class Set : public QSet<T> { + qsizetype setSize = 0; + public: + explicit Set(qsizetype n) : QSet<T>{} + { this->reserve(n); } + + auto insert(const T &e) { + auto it = QSet<T>::insert(e); + const auto n = this->size(); + return std::pair{it, qExchange(setSize, n) != n}; + } + + auto insert(T &&e) { + auto it = QSet<T>::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 <typename C> |