summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2021-07-12 11:03:42 +0200
committerMarc Mutz <marc.mutz@kdab.com>2021-07-13 21:29:52 +0200
commita3a8a1dd7c7e9d6a98ed2597ebac638edf5f067d (patch)
tree7a6ea8d73b97c017a676f4729c48226c3aae493e /src/corelib/tools
parentfbcb3fc50675b20809ae700236be263f5a38a464 (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.h42
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>