QPartialOrdering: add missing conversions to/from Qt::_ordering types

Since QPartialOrdering is supposed to be a drop-in-replacement for
Qt::partial_ordering, it need to have the same conversions from
Qt::_ordering types that Qt::partial_ordering has.

Fix by adding the necessary conversion and relational operators and
conversion constructors.

Change-Id: Ib8e78c850b43c8bcb3bb15c5f7d25be9d0da7339
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
This commit is contained in:
Marc Mutz 2023-11-29 20:11:46 +01:00 committed by Ivan Solovev
parent 1576d70e44
commit 07ed8acdf9
2 changed files with 49 additions and 0 deletions

View File

@ -700,6 +700,54 @@ public:
friend constexpr bool operator!=(QPartialOrdering lhs, QPartialOrdering rhs) noexcept
{ return lhs.m_order != rhs.m_order; }
constexpr Q_IMPLICIT QPartialOrdering(Qt::partial_ordering order) noexcept
: m_order{} // == equivalent
{
if (order == Qt::partial_ordering::less)
m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Less);
else if (order == Qt::partial_ordering::greater)
m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::Ordering::Greater);
else if (order == Qt::partial_ordering::unordered)
m_order = static_cast<QtPrivate::CompareUnderlyingType>(QtPrivate::LegacyUncomparable::Unordered);
}
constexpr Q_IMPLICIT QPartialOrdering(Qt::weak_ordering stdorder) noexcept
: QPartialOrdering(Qt::partial_ordering{stdorder}) {}
constexpr Q_IMPLICIT QPartialOrdering(Qt::strong_ordering stdorder) noexcept
: QPartialOrdering(Qt::partial_ordering{stdorder}) {}
constexpr Q_IMPLICIT operator Qt::partial_ordering() const noexcept
{
using O = QtPrivate::Ordering;
using U = QtPrivate::LegacyUncomparable;
using R = Qt::partial_ordering;
switch (m_order) {
case qToUnderlying(O::Less): return R::less;
case qToUnderlying(O::Greater): return R::greater;
case qToUnderlying(O::Equivalent): return R::equivalent;
case qToUnderlying(U::Unordered): return R::unordered;
}
// GCC 8.x does not treat __builtin_unreachable() as constexpr
#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900)
// NOLINTNEXTLINE(qt-use-unreachable-return): Triggers on Clang, breaking GCC 8
Q_UNREACHABLE();
#endif
return R::unordered;
}
friend constexpr bool operator==(QPartialOrdering lhs, Qt::partial_ordering rhs) noexcept
{ Qt::partial_ordering qt = lhs; return qt == rhs; }
friend constexpr bool operator!=(QPartialOrdering lhs, Qt::partial_ordering rhs) noexcept
{ Qt::partial_ordering qt = lhs; return qt != rhs; }
friend constexpr bool operator==(Qt::partial_ordering lhs, QPartialOrdering rhs) noexcept
{ Qt::partial_ordering qt = rhs; return lhs == qt; }
friend constexpr bool operator!=(Qt::partial_ordering lhs, QPartialOrdering rhs) noexcept
{ Qt::partial_ordering qt = rhs; return lhs != qt; }
#ifdef __cpp_lib_three_way_comparison
constexpr Q_IMPLICIT QPartialOrdering(std::partial_ordering stdorder) noexcept
{

View File

@ -148,6 +148,7 @@ void tst_QCompare::legacyConversions()
CHECK_CONVERTS(NS ::strong_ordering, QPartialOrdering); \
} while (false)
CHECK_ALL(Qt);
#ifdef __cpp_lib_three_way_comparison
CHECK_ALL(std);
#endif // __cpp_lib_three_way_comparison