summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2021-07-12 10:10:38 +0200
committerMarc Mutz <marc.mutz@kdab.com>2021-07-27 17:44:30 +0200
commit8c49ae522d184deb5a9118ba2368629709ff6e85 (patch)
tree877f1302e2ac2cfc82555ddf4a71d303a9dd4465 /src/corelib/tools
parent6b400e3147dcfd8cc3a393ace1bd118c93762e0c (diff)
QDuplicateTracker: bring back appendTo() &&
This reverts commit c19695ab953c979f15bbc72c4f4a453e9a114cf6. Just because QSet has limited API doesn't mean we can't provide this in an efficient way for std::unordered_set :P Added tests. Pick-to: 6.2 Change-Id: I4f8f0e60c810acdc666cf34f929845227ed87f3b Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qduplicatetracker_p.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h
index 565d592ac2..8d64ee5371 100644
--- a/src/corelib/tools/qduplicatetracker_p.h
+++ b/src/corelib/tools/qduplicatetracker_p.h
@@ -105,6 +105,13 @@ class QDuplicateTracker {
#endif
Q_DISABLE_COPY_MOVE(QDuplicateTracker);
public:
+ static constexpr inline bool uses_pmr =
+ #ifdef __cpp_lib_memory_resource
+ true
+ #else
+ false
+ #endif
+ ;
QDuplicateTracker() = default;
explicit QDuplicateTracker(qsizetype n)
#ifdef __cpp_lib_memory_resource
@@ -125,11 +132,22 @@ public:
}
template <typename C>
- void appendTo(C &c) const
+ void appendTo(C &c) const &
{
for (const auto &e : set)
c.push_back(e);
}
+
+ template <typename C>
+ void appendTo(C &c) &&
+ {
+ if constexpr (uses_pmr) {
+ while (!set.empty())
+ c.push_back(std::move(set.extract(set.begin()).value()));
+ } else {
+ return appendTo(c); // lvalue version
+ }
+ }
};
QT_END_NAMESPACE