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:
parent
fbcb3fc506
commit
a3a8a1dd7c
@ -83,9 +83,25 @@ class QDuplicateTracker {
|
|||||||
std::pmr::monotonic_buffer_resource res{buffer, sizeof buffer};
|
std::pmr::monotonic_buffer_resource res{buffer, sizeof buffer};
|
||||||
std::pmr::unordered_set<T, QHasher<T>> set{Prealloc, &res};
|
std::pmr::unordered_set<T, QHasher<T>> set{Prealloc, &res};
|
||||||
#else
|
#else
|
||||||
static QSet<T> makeQSet() { QSet<T> r; r.reserve(Prealloc); return r; }
|
class Set : public QSet<T> {
|
||||||
QSet<T> set = makeQSet();
|
qsizetype setSize = 0;
|
||||||
int 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
|
#endif
|
||||||
Q_DISABLE_COPY_MOVE(QDuplicateTracker);
|
Q_DISABLE_COPY_MOVE(QDuplicateTracker);
|
||||||
public:
|
public:
|
||||||
@ -93,27 +109,11 @@ public:
|
|||||||
void reserve(int n) { set.reserve(n); }
|
void reserve(int n) { set.reserve(n); }
|
||||||
[[nodiscard]] bool hasSeen(const T &s)
|
[[nodiscard]] bool hasSeen(const T &s)
|
||||||
{
|
{
|
||||||
bool inserted;
|
return !set.insert(s).second;
|
||||||
#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;
|
|
||||||
}
|
}
|
||||||
[[nodiscard]] bool hasSeen(T &&s)
|
[[nodiscard]] bool hasSeen(T &&s)
|
||||||
{
|
{
|
||||||
bool inserted;
|
return !set.insert(std::move(s)).second;
|
||||||
#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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename C>
|
template <typename C>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user