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>
This commit is contained in:
Marc Mutz 2021-07-12 11:03:42 +02:00
parent fbcb3fc506
commit a3a8a1dd7c

View File

@ -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>