From 5831c3123594f0d901b381110a41c75dcb9935e2 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 29 May 2024 08:40:49 +0200 Subject: [PATCH] totally_ordered_wrapper: add swap and qHash overloads; std::hash specialization Pointers have these. We also have qt_ptr_hash for raw pointers, so add an ADL overload for that, too. Don't provide a member-swap, since raw pointers don't have that. Change-Id: I1517588d2ff1aa5caf06ad5861ff09d5e7652183 Reviewed-by: Ivan Solovev --- src/corelib/global/qcomparehelpers.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/corelib/global/qcomparehelpers.h b/src/corelib/global/qcomparehelpers.h index b067cb2c7ea..9754505e70c 100644 --- a/src/corelib/global/qcomparehelpers.h +++ b/src/corelib/global/qcomparehelpers.h @@ -23,7 +23,7 @@ #endif #include -#include // std::less +#include // std::less, std::hash QT_BEGIN_NAMESPACE @@ -653,10 +653,27 @@ private: MAKE_RELOP(auto, <=>, compare_three_way) #endif #undef MAKE_RELOP + friend void qt_ptr_swap(totally_ordered_wrapper &lhs, totally_ordered_wrapper &rhs) noexcept + { qt_ptr_swap(lhs.ptr, rhs.ptr); } + friend void swap(totally_ordered_wrapper &lhs, totally_ordered_wrapper &rhs) noexcept + { qt_ptr_swap(lhs, rhs); } + friend size_t qHash(totally_ordered_wrapper key, size_t seed = 0) noexcept + { return qHash(key.ptr, seed); } }; } //Qt QT_END_NAMESPACE +namespace std { + template + struct hash> + { + using argument_type = QT_PREPEND_NAMESPACE(Qt::totally_ordered_wrapper)

; + using result_type = size_t; + constexpr result_type operator()(argument_type w) const noexcept + { return std::hash

{}(w.get()); } + }; +} + #endif // QCOMPAREHELPERS_H