Move CompareThreeWayTester to qcomparehelpers.h

We will need these checks in the qcomparehelpers.h header, so move
the code there.

As a drive-by, use QtOrderingPrivate namespace instead of QtPrivate,
and also mark the constexpr bool variables as inline.

This is required for the follow-up patches.

Task-number: QTBUG-127095
Task-number: QTBUG-120305
Change-Id: I1ea827ecf68b6bffa347dae22ddac25c059b53a9
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit 678e9f614bc5a05d2ff16cf916397998e7cdfca1)
This commit is contained in:
Ivan Solovev 2024-10-01 15:28:35 +02:00
parent 69da5314ff
commit ef8fc89355
2 changed files with 42 additions and 41 deletions

View File

@ -629,42 +629,6 @@ QT_BEGIN_INCLUDE_NAMESPACE
QT_END_INCLUDE_NAMESPACE
namespace QtPrivate {
namespace CompareThreeWayTester {
using Qt::compareThreeWay;
// Check if compareThreeWay is implemented for the (LT, RT) argument
// pair.
template <typename LT, typename RT, typename = void>
constexpr bool hasCompareThreeWay = false;
template <typename LT, typename RT>
constexpr bool hasCompareThreeWay<
LT, RT, std::void_t<decltype(compareThreeWay(std::declval<LT>(), std::declval<RT>()))>
> = true;
// Check if the operation is noexcept. We have two different overloads,
// depending on the available compareThreeWay() implementation.
// Both are declared, but not implemented. To be used only in unevaluated
// context.
template <typename LT, typename RT,
std::enable_if_t<hasCompareThreeWay<LT, RT>, bool> = true>
constexpr bool compareThreeWayNoexcept() noexcept
{ return noexcept(compareThreeWay(std::declval<LT>(), std::declval<RT>())); }
template <typename LT, typename RT,
std::enable_if_t<!hasCompareThreeWay<LT, RT> && hasCompareThreeWay<RT, LT>,
bool> = true>
constexpr bool compareThreeWayNoexcept() noexcept
{ return noexcept(compareThreeWay(std::declval<RT>(), std::declval<LT>())); }
} // namespace CompareThreeWayTester
} // namespace QtPrivate
#if defined(Q_QDOC)
template <typename LeftType, typename RightType>
@ -673,14 +637,15 @@ auto qCompareThreeWay(const LeftType &lhs, const RightType &rhs);
#else
template <typename LT, typename RT,
std::enable_if_t<QtPrivate::CompareThreeWayTester::hasCompareThreeWay<LT, RT>
|| QtPrivate::CompareThreeWayTester::hasCompareThreeWay<RT, LT>,
bool> = true>
std::enable_if_t<
QtOrderingPrivate::CompareThreeWayTester::hasCompareThreeWay<LT, RT>
|| QtOrderingPrivate::CompareThreeWayTester::hasCompareThreeWay<RT, LT>,
bool> = true>
auto qCompareThreeWay(const LT &lhs, const RT &rhs)
noexcept(QtPrivate::CompareThreeWayTester::compareThreeWayNoexcept<LT, RT>())
noexcept(QtOrderingPrivate::CompareThreeWayTester::compareThreeWayNoexcept<LT, RT>())
{
using Qt::compareThreeWay;
if constexpr (QtPrivate::CompareThreeWayTester::hasCompareThreeWay<LT, RT>) {
if constexpr (QtOrderingPrivate::CompareThreeWayTester::hasCompareThreeWay<LT, RT>) {
return compareThreeWay(lhs, rhs);
} else {
const auto retval = compareThreeWay(rhs, lhs);

View File

@ -864,6 +864,42 @@ compareThreeWay(std::nullptr_t lhs, Qt::totally_ordered_wrapper<T*> rhs) noexcep
template <typename P>
class QTypeInfo<Qt::totally_ordered_wrapper<P>> : public QTypeInfo<P> {};
namespace QtOrderingPrivate {
namespace CompareThreeWayTester {
using Qt::compareThreeWay;
// Check if compareThreeWay is implemented for the (LT, RT) argument
// pair.
template <typename LT, typename RT, typename = void>
constexpr inline bool hasCompareThreeWay = false;
template <typename LT, typename RT>
constexpr inline bool hasCompareThreeWay<
LT, RT, std::void_t<decltype(compareThreeWay(std::declval<LT>(), std::declval<RT>()))>
> = true;
// Check if the operation is noexcept. We have two different overloads,
// depending on the available compareThreeWay() implementation.
// Both are declared, but not implemented. To be used only in unevaluated
// context.
template <typename LT, typename RT,
std::enable_if_t<hasCompareThreeWay<LT, RT>, bool> = true>
constexpr bool compareThreeWayNoexcept() noexcept
{ return noexcept(compareThreeWay(std::declval<LT>(), std::declval<RT>())); }
template <typename LT, typename RT,
std::enable_if_t<!hasCompareThreeWay<LT, RT> && hasCompareThreeWay<RT, LT>,
bool> = true>
constexpr bool compareThreeWayNoexcept() noexcept
{ return noexcept(compareThreeWay(std::declval<RT>(), std::declval<LT>())); }
} // namespace CompareThreeWayTester
} // namespace QtOrderingPrivate
QT_END_NAMESPACE
namespace std {