diff --git a/src/corelib/kernel/qmetacontainer.cpp b/src/corelib/kernel/qmetacontainer.cpp index 200724c9f4f..5f68f8fe74d 100644 --- a/src/corelib/kernel/qmetacontainer.cpp +++ b/src/corelib/kernel/qmetacontainer.cpp @@ -14,6 +14,8 @@ QT_BEGIN_NAMESPACE \ingroup objectmodel + \compares equality + The class provides a number of primitive container operations, using void* as operands. This way, you can manipulate a generic container retrieved from a Variant without knowing its type. @@ -790,21 +792,19 @@ void QMetaSequence::valueAtConstIterator(const void *iterator, void *result) con } /*! - \fn bool operator==(QMetaSequence a, QMetaSequence b) + \fn bool QMetaSequence::operator==(const QMetaSequence &lhs, const QMetaSequence &rhs) \since 6.0 - \relates QMetaSequence - Returns \c true if the QMetaSequence \a a represents the same container type - as the QMetaSequence \a b, otherwise returns \c false. + Returns \c true if the QMetaSequence \a lhs represents the same container type + as the QMetaSequence \a rhs, otherwise returns \c false. */ /*! - \fn bool operator!=(QMetaSequence a, QMetaSequence b) + \fn bool QMetaSequence::operator!=(const QMetaSequence &lhs, const QMetaSequence &rhs) \since 6.0 - \relates QMetaSequence - Returns \c true if the QMetaSequence \a a represents a different container - type than the QMetaSequence \a b, otherwise returns \c false. + Returns \c true if the QMetaSequence \a lhs represents a different container + type than the QMetaSequence \a rhs, otherwise returns \c false. */ diff --git a/src/corelib/kernel/qmetacontainer.h b/src/corelib/kernel/qmetacontainer.h index 67c0ddcf365..1bed7f9f7b3 100644 --- a/src/corelib/kernel/qmetacontainer.h +++ b/src/corelib/kernel/qmetacontainer.h @@ -5,6 +5,7 @@ #define QMETACONTAINER_H #include +#include #include #include @@ -975,18 +976,15 @@ public: bool canGetValueAtConstIterator() const; void valueAtConstIterator(const void *iterator, void *result) const; - friend bool operator==(const QMetaSequence &a, const QMetaSequence &b) - { - return a.d() == b.d(); - } - friend bool operator!=(const QMetaSequence &a, const QMetaSequence &b) - { - return a.d() != b.d(); - } - const QtMetaContainerPrivate::QMetaSequenceInterface *iface() const { return d(); } private: + friend bool comparesEqual(const QMetaSequence &lhs, const QMetaSequence &rhs) noexcept + { + return lhs.d() == rhs.d(); + } + Q_DECLARE_EQUALITY_COMPARABLE(QMetaSequence) + template struct MetaSequence { @@ -1171,18 +1169,15 @@ public: return nullptr; } - friend bool operator==(const QMetaAssociation &a, const QMetaAssociation &b) - { - return a.d() == b.d(); - } - friend bool operator!=(const QMetaAssociation &a, const QMetaAssociation &b) - { - return a.d() != b.d(); - } - const QtMetaContainerPrivate::QMetaAssociationInterface *iface() const { return d(); } private: + friend bool comparesEqual(const QMetaAssociation &lhs, const QMetaAssociation &rhs) noexcept + { + return lhs.d() == rhs.d(); + } + Q_DECLARE_EQUALITY_COMPARABLE(QMetaAssociation) + template struct MetaAssociation { diff --git a/tests/auto/corelib/kernel/qmetacontainer/CMakeLists.txt b/tests/auto/corelib/kernel/qmetacontainer/CMakeLists.txt index a9ebcdf72fe..fb58aebe73f 100644 --- a/tests/auto/corelib/kernel/qmetacontainer/CMakeLists.txt +++ b/tests/auto/corelib/kernel/qmetacontainer/CMakeLists.txt @@ -16,4 +16,5 @@ qt_internal_add_test(tst_qmetacontainer tst_qmetacontainer.cpp LIBRARIES Qt::CorePrivate + Qt::TestPrivate ) diff --git a/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp b/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp index dff2176a117..cc1d8baa8e6 100644 --- a/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp +++ b/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include +#include #include #include #include @@ -157,6 +158,7 @@ private: private slots: void init(); + void compareCompiles(); void testSequence_data(); void testSequence(); @@ -203,6 +205,12 @@ void tst_QMetaContainer::init() }; } +void tst_QMetaContainer::compareCompiles() +{ + QTestPrivate::testEqualityOperatorsCompile(); + QTestPrivate::testEqualityOperatorsCompile(); +} + void tst_QMetaContainer::cleanup() { qvector.clear(); @@ -501,6 +509,9 @@ void tst_QMetaContainer::testSequence() QVERIFY(metaSequence.iface() != nullptr); QMetaSequence defaultConstructed; QVERIFY(defaultConstructed.iface() == nullptr); + QT_TEST_EQUALITY_OPS(QMetaSequence(), defaultConstructed, true); + QT_TEST_EQUALITY_OPS(QMetaSequence(), QMetaSequence(), true); + QT_TEST_EQUALITY_OPS(defaultConstructed, metaSequence, false); } void tst_QMetaContainer::testAssociation_data() @@ -728,8 +739,10 @@ void tst_QMetaContainer::testAssociation() metaAssociation.destroyConstIterator(constEnd); QVERIFY(metaAssociation.iface() != nullptr); - QMetaSequence defaultConstructed; + QMetaAssociation defaultConstructed; QVERIFY(defaultConstructed.iface() == nullptr); + QT_TEST_EQUALITY_OPS(QMetaAssociation(), QMetaAssociation(), true); + QT_TEST_EQUALITY_OPS(QMetaAssociation(), metaAssociation, false); } QTEST_MAIN(tst_QMetaContainer)