diff options
Diffstat (limited to 'src/corelib/kernel/qmetacontainer.h')
-rw-r--r-- | src/corelib/kernel/qmetacontainer.h | 403 |
1 files changed, 178 insertions, 225 deletions
diff --git a/src/corelib/kernel/qmetacontainer.h b/src/corelib/kernel/qmetacontainer.h index a873bb2106..1bed7f9f7b 100644 --- a/src/corelib/kernel/qmetacontainer.h +++ b/src/corelib/kernel/qmetacontainer.h @@ -1,56 +1,23 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QMETACONTAINER_H #define QMETACONTAINER_H #include <QtCore/qcontainerinfo.h> +#include <QtCore/qcompare.h> #include <QtCore/qflags.h> #include <QtCore/qglobal.h> +#include <iterator> + QT_BEGIN_NAMESPACE class QMetaType; namespace QtPrivate { class QMetaTypeInterface; template<typename T> -constexpr QMetaTypeInterface *qMetaTypeInterfaceForType(); +constexpr const QMetaTypeInterface *qMetaTypeInterfaceForType(); } namespace QtMetaContainerPrivate { @@ -110,7 +77,7 @@ public: QMetaContainerInterface() = default; template<typename MetaContainer> - QMetaContainerInterface(const MetaContainer &) + constexpr QMetaContainerInterface(const MetaContainer &) : iteratorCapabilities(MetaContainer::getIteratorCapabilities()) , sizeFn(MetaContainer::getSizeFn()) , clearFn(MetaContainer::getClearFn()) @@ -132,7 +99,7 @@ public: class QMetaSequenceInterface : public QMetaContainerInterface { public: - QtPrivate::QMetaTypeInterface *valueMetaType; + const QtPrivate::QMetaTypeInterface *valueMetaType; AddRemoveCapabilities addRemoveCapabilities; using ValueAtIndexFn = void(*)(const void *, qsizetype, void *); @@ -163,7 +130,7 @@ public: QMetaSequenceInterface() = default; template<typename MetaSequence> - QMetaSequenceInterface(const MetaSequence &m) + constexpr QMetaSequenceInterface(const MetaSequence &m) : QMetaContainerInterface(m) , valueMetaType(MetaSequence::getValueMetaType()) , addRemoveCapabilities(MetaSequence::getAddRemoveCapabilities()) @@ -183,8 +150,8 @@ public: class QMetaAssociationInterface : public QMetaContainerInterface { public: - QtPrivate::QMetaTypeInterface *keyMetaType; - QtPrivate::QMetaTypeInterface *mappedMetaType; + const QtPrivate::QMetaTypeInterface *keyMetaType; + const QtPrivate::QMetaTypeInterface *mappedMetaType; using InsertKeyFn = void(*)(void *, const void *); InsertKeyFn insertKeyFn; @@ -220,7 +187,7 @@ public: QMetaAssociationInterface() = default; template<typename MetaAssociation> - QMetaAssociationInterface(const MetaAssociation &m) + constexpr QMetaAssociationInterface(const MetaAssociation &m) : QMetaContainerInterface(m) , keyMetaType(MetaAssociation::getKeyMetaType()) , mappedMetaType(MetaAssociation::getMappedMetaType()) @@ -263,17 +230,17 @@ class QMetaContainerForContainer static constexpr IteratorCapabilities getIteratorCapabilities() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) - return capabilitiesForIterator<QContainerTraits::iterator<C>>(); - else if constexpr (QContainerTraits::has_const_iterator_v<C>) - return capabilitiesForIterator<QContainerTraits::const_iterator<C>>(); + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) + return capabilitiesForIterator<QContainerInfo::iterator<C>>(); + else if constexpr (QContainerInfo::has_const_iterator_v<C>) + return capabilitiesForIterator<QContainerInfo::const_iterator<C>>(); else return {}; } static constexpr QMetaContainerInterface::SizeFn getSizeFn() { - if constexpr (QContainerTraits::has_size_v<C>) { + if constexpr (QContainerInfo::has_size_v<C>) { return [](const void *c) -> qsizetype { return static_cast<const C *>(c)->size(); }; } else { return nullptr; @@ -282,7 +249,7 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::ClearFn getClearFn() { - if constexpr (QContainerTraits::has_clear_v<C>) { + if constexpr (QContainerInfo::has_clear_v<C>) { return [](void *c) { return static_cast<C *>(c)->clear(); }; } else { return nullptr; @@ -291,18 +258,16 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::CreateIteratorFn getCreateIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) { return [](void *c, QMetaContainerInterface::Position p) -> void* { - using Iterator = QContainerTraits::iterator<C>; + using Iterator = QContainerInfo::iterator<C>; switch (p) { case QMetaContainerInterface::Unspecified: return new Iterator; case QMetaContainerInterface::AtBegin: return new Iterator(static_cast<C *>(c)->begin()); - break; case QMetaContainerInterface::AtEnd: return new Iterator(static_cast<C *>(c)->end()); - break; } return nullptr; }; @@ -313,9 +278,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::DestroyIteratorFn getDestroyIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) { return [](const void *i) { - using Iterator = QContainerTraits::iterator<C>; + using Iterator = QContainerInfo::iterator<C>; delete static_cast<const Iterator *>(i); }; } else { @@ -325,9 +290,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::CompareIteratorFn getCompareIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) { return [](const void *i, const void *j) { - using Iterator = QContainerTraits::iterator<C>; + using Iterator = QContainerInfo::iterator<C>; return *static_cast<const Iterator *>(i) == *static_cast<const Iterator *>(j); }; } else { @@ -337,9 +302,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::CopyIteratorFn getCopyIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) { return [](void *i, const void *j) { - using Iterator = QContainerTraits::iterator<C>; + using Iterator = QContainerInfo::iterator<C>; *static_cast<Iterator *>(i) = *static_cast<const Iterator *>(j); }; } else { @@ -349,9 +314,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::AdvanceIteratorFn getAdvanceIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) { return [](void *i, qsizetype step) { - std::advance(*static_cast<QContainerTraits::iterator<C> *>(i), step); + std::advance(*static_cast<QContainerInfo::iterator<C> *>(i), step); }; } else { return nullptr; @@ -360,10 +325,10 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::DiffIteratorFn getDiffIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) { return [](const void *i, const void *j) -> qsizetype { - return std::distance(*static_cast<const QContainerTraits::iterator<C> *>(j), - *static_cast<const QContainerTraits::iterator<C> *>(i)); + return std::distance(*static_cast<const QContainerInfo::iterator<C> *>(j), + *static_cast<const QContainerInfo::iterator<C> *>(i)); }; } else { return nullptr; @@ -372,9 +337,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::CreateConstIteratorFn getCreateConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C>) { return [](const void *c, QMetaContainerInterface::Position p) -> void* { - using Iterator = QContainerTraits::const_iterator<C>; + using Iterator = QContainerInfo::const_iterator<C>; switch (p) { case QMetaContainerInterface::Unspecified: return new Iterator; @@ -392,9 +357,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::DestroyIteratorFn getDestroyConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C>) { return [](const void *i) { - using Iterator = QContainerTraits::const_iterator<C>; + using Iterator = QContainerInfo::const_iterator<C>; delete static_cast<const Iterator *>(i); }; } else { @@ -404,9 +369,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::CompareIteratorFn getCompareConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C>) { return [](const void *i, const void *j) { - using Iterator = QContainerTraits::const_iterator<C>; + using Iterator = QContainerInfo::const_iterator<C>; return *static_cast<const Iterator *>(i) == *static_cast<const Iterator *>(j); }; } else { @@ -416,9 +381,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::CopyIteratorFn getCopyConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C>) { return [](void *i, const void *j) { - using Iterator = QContainerTraits::const_iterator<C>; + using Iterator = QContainerInfo::const_iterator<C>; *static_cast<Iterator *>(i) = *static_cast<const Iterator *>(j); }; } else { @@ -428,9 +393,9 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::AdvanceIteratorFn getAdvanceConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C>) { return [](void *i, qsizetype step) { - std::advance(*static_cast<QContainerTraits::const_iterator<C> *>(i), step); + std::advance(*static_cast<QContainerInfo::const_iterator<C> *>(i), step); }; } else { return nullptr; @@ -439,10 +404,10 @@ class QMetaContainerForContainer static constexpr QMetaContainerInterface::DiffIteratorFn getDiffConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C>) { return [](const void *i, const void *j) -> qsizetype { - return std::distance(*static_cast<const QContainerTraits::const_iterator<C> *>(j), - *static_cast<const QContainerTraits::const_iterator<C> *>(i)); + return std::distance(*static_cast<const QContainerInfo::const_iterator<C> *>(j), + *static_cast<const QContainerInfo::const_iterator<C> *>(i)); }; } else { return nullptr; @@ -454,10 +419,10 @@ protected: template<typename EraseFn> static constexpr EraseFn getEraseAtIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> - && QContainerTraits::can_erase_at_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> + && QContainerInfo::can_erase_at_iterator_v<C> && !std::is_const_v<C>) { return [](void *c, const void *i) { - static_cast<C *>(c)->erase(*static_cast<const QContainerTraits::iterator<C> *>(i)); + static_cast<C *>(c)->erase(*static_cast<const QContainerInfo::iterator<C> *>(i)); }; } else { return nullptr; @@ -470,9 +435,9 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> { friend QMetaSequenceInterface; - static constexpr QtPrivate::QMetaTypeInterface *getValueMetaType() + static constexpr const QtPrivate::QMetaTypeInterface *getValueMetaType() { - if constexpr (QContainerTraits::has_value_type_v<C>) + if constexpr (QContainerInfo::has_value_type_v<C>) return QtPrivate::qMetaTypeInterfaceForType<typename C::value_type>(); else return nullptr; @@ -481,27 +446,27 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr AddRemoveCapabilities getAddRemoveCapabilities() { AddRemoveCapabilities caps; - if constexpr (QContainerTraits::has_push_back_v<C>) + if constexpr (QContainerInfo::has_push_back_v<C>) caps |= CanAddAtEnd; - if constexpr (QContainerTraits::has_pop_back_v<C>) + if constexpr (QContainerInfo::has_pop_back_v<C>) caps |= CanRemoveAtEnd; - if constexpr (QContainerTraits::has_push_front_v<C>) + if constexpr (QContainerInfo::has_push_front_v<C>) caps |= CanAddAtBegin; - if constexpr (QContainerTraits::has_pop_front_v<C>) + if constexpr (QContainerInfo::has_pop_front_v<C>) caps |= CanRemoveAtBegin; return caps; } static constexpr QMetaSequenceInterface::ValueAtIndexFn getValueAtIndexFn() { - if constexpr (QContainerTraits::has_at_index_v<C>) { + if constexpr (QContainerInfo::has_at_index_v<C>) { return [](const void *c, qsizetype i, void *r) { - *static_cast<QContainerTraits::value_type<C> *>(r) + *static_cast<QContainerInfo::value_type<C> *>(r) = static_cast<const C *>(c)->at(i); }; - } else if constexpr (QContainerTraits::can_get_at_index_v<C>) { + } else if constexpr (QContainerInfo::can_get_at_index_v<C>) { return [](const void *c, qsizetype i, void *r) { - *static_cast<QContainerTraits::value_type<C> *>(r) + *static_cast<QContainerInfo::value_type<C> *>(r) = (*static_cast<const C *>(c))[i]; }; } else { @@ -511,10 +476,10 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::SetValueAtIndexFn getSetValueAtIndexFn() { - if constexpr (QContainerTraits::can_set_at_index_v<C>) { + if constexpr (QContainerInfo::can_set_at_index_v<C>) { return [](void *c, qsizetype i, const void *e) { (*static_cast<C *>(c))[i] - = *static_cast<const QContainerTraits::value_type<C> *>(e); + = *static_cast<const QContainerInfo::value_type<C> *>(e); }; } else { return nullptr; @@ -523,10 +488,10 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::AddValueFn getAddValueFn() { - if constexpr (QContainerTraits::has_push_back_v<C>) { - if constexpr (QContainerTraits::has_push_front_v<C>) { + if constexpr (QContainerInfo::has_push_back_v<C>) { + if constexpr (QContainerInfo::has_push_front_v<C>) { return [](void *c, const void *v, QMetaSequenceInterface::Position position) { - const auto &value = *static_cast<const QContainerTraits::value_type<C> *>(v); + const auto &value = *static_cast<const QContainerInfo::value_type<C> *>(v); switch (position) { case QMetaSequenceInterface::AtBegin: static_cast<C *>(c)->push_front(value); @@ -539,7 +504,7 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> }; } else { return [](void *c, const void *v, QMetaSequenceInterface::Position position) { - const auto &value = *static_cast<const QContainerTraits::value_type<C> *>(v); + const auto &value = *static_cast<const QContainerInfo::value_type<C> *>(v); switch (position) { case QMetaSequenceInterface::AtBegin: break; @@ -550,9 +515,9 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> } }; } - } else if constexpr (QContainerTraits::has_push_front_v<C>) { + } else if constexpr (QContainerInfo::has_push_front_v<C>) { return [](void *c, const void *v, QMetaSequenceInterface::Position position) { - const auto &value = *static_cast<const QContainerTraits::value_type<C> *>(v); + const auto &value = *static_cast<const QContainerInfo::value_type<C> *>(v); switch (position) { case QMetaSequenceInterface::Unspecified: case QMetaSequenceInterface::AtBegin: @@ -561,11 +526,11 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> break; } }; - } else if constexpr (QContainerTraits::has_insert_v<C>) { + } else if constexpr (QContainerInfo::has_insert_v<C>) { return [](void *c, const void *v, QMetaSequenceInterface::Position position) { if (position == QMetaSequenceInterface::Unspecified) { static_cast<C *>(c)->insert( - *static_cast<const QContainerTraits::value_type<C> *>(v)); + *static_cast<const QContainerInfo::value_type<C> *>(v)); } }; } else { @@ -575,8 +540,8 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::RemoveValueFn getRemoveValueFn() { - if constexpr (QContainerTraits::has_pop_back_v<C>) { - if constexpr (QContainerTraits::has_pop_front_v<C>) { + if constexpr (QContainerInfo::has_pop_back_v<C>) { + if constexpr (QContainerInfo::has_pop_front_v<C>) { return [](void *c, QMetaSequenceInterface::Position position) { switch (position) { case QMetaSequenceInterface::AtBegin: @@ -600,7 +565,7 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> } }; } - } else if constexpr (QContainerTraits::has_pop_front_v<C>) { + } else if constexpr (QContainerInfo::has_pop_front_v<C>) { return [](void *c, QMetaSequenceInterface::Position position) { switch (position) { case QMetaSequenceInterface::Unspecified: @@ -618,11 +583,11 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::ValueAtIteratorFn getValueAtIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> - && QContainerTraits::iterator_dereferences_to_value_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> + && QContainerInfo::iterator_dereferences_to_value_v<C> && !std::is_const_v<C>) { return [](const void *i, void *r) { - *static_cast<QContainerTraits::value_type<C> *>(r) = - *(*static_cast<const QContainerTraits::iterator<C> *>(i)); + *static_cast<QContainerInfo::value_type<C> *>(r) = + *(*static_cast<const QContainerInfo::iterator<C> *>(i)); }; } else { return nullptr; @@ -631,11 +596,11 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::SetValueAtIteratorFn getSetValueAtIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> - && QContainerTraits::can_set_value_at_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> + && QContainerInfo::can_set_value_at_iterator_v<C> && !std::is_const_v<C>) { return [](const void *i, const void *e) { - *(*static_cast<const QContainerTraits::iterator<C> *>(i)) - = *static_cast<const QContainerTraits::value_type<C> *>(e); + *(*static_cast<const QContainerInfo::iterator<C> *>(i)) + = *static_cast<const QContainerInfo::value_type<C> *>(e); }; } else { return nullptr; @@ -644,12 +609,12 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::InsertValueAtIteratorFn getInsertValueAtIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> - && QContainerTraits::can_insert_value_at_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> + && QContainerInfo::can_insert_value_at_iterator_v<C> && !std::is_const_v<C>) { return [](void *c, const void *i, const void *e) { static_cast<C *>(c)->insert( - *static_cast<const QContainerTraits::iterator<C> *>(i), - *static_cast<const QContainerTraits::value_type<C> *>(e)); + *static_cast<const QContainerInfo::iterator<C> *>(i), + *static_cast<const QContainerInfo::value_type<C> *>(e)); }; } else { return nullptr; @@ -658,11 +623,11 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::ValueAtIteratorFn getValueAtConstIteratorFn() { - if constexpr (QContainerTraits::has_const_iterator_v<C> - && QContainerTraits::iterator_dereferences_to_value_v<C>) { + if constexpr (QContainerInfo::has_const_iterator_v<C> + && QContainerInfo::iterator_dereferences_to_value_v<C>) { return [](const void *i, void *r) { - *static_cast<QContainerTraits::value_type<C> *>(r) = - *(*static_cast<const QContainerTraits::const_iterator<C> *>(i)); + *static_cast<QContainerInfo::value_type<C> *>(r) = + *(*static_cast<const QContainerInfo::const_iterator<C> *>(i)); }; } else { return nullptr; @@ -677,19 +642,16 @@ class QMetaSequenceForContainer : public QMetaContainerForContainer<C> static constexpr QMetaSequenceInterface::EraseRangeAtIteratorFn getEraseRangeAtIteratorFn() { - if constexpr (QContainerTraits::has_iterator_v<C> - && QContainerTraits::can_erase_range_at_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::has_iterator_v<C> + && QContainerInfo::can_erase_range_at_iterator_v<C> && !std::is_const_v<C>) { return [](void *c, const void *i, const void *j) { - static_cast<C *>(c)->erase(*static_cast<const QContainerTraits::iterator<C> *>(i), - *static_cast<const QContainerTraits::iterator<C> *>(j)); + static_cast<C *>(c)->erase(*static_cast<const QContainerInfo::iterator<C> *>(i), + *static_cast<const QContainerInfo::iterator<C> *>(j)); }; } else { return nullptr; } } - -public: - static QMetaSequenceInterface metaSequence; }; template<typename C> @@ -697,17 +659,17 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> { friend QMetaAssociationInterface; - static constexpr QtPrivate::QMetaTypeInterface *getKeyMetaType() + static constexpr const QtPrivate::QMetaTypeInterface *getKeyMetaType() { - if constexpr (QContainerTraits::has_key_type_v<C>) + if constexpr (QContainerInfo::has_key_type_v<C>) return QtPrivate::qMetaTypeInterfaceForType<typename C::key_type>(); else return nullptr; } - static constexpr QtPrivate::QMetaTypeInterface *getMappedMetaType() + static constexpr const QtPrivate::QMetaTypeInterface *getMappedMetaType() { - if constexpr (QContainerTraits::has_mapped_type_v<C>) + if constexpr (QContainerInfo::has_mapped_type_v<C>) return QtPrivate::qMetaTypeInterfaceForType<typename C::mapped_type>(); else return nullptr; @@ -715,20 +677,20 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::InsertKeyFn getInsertKeyFn() { - if constexpr (QContainerTraits::can_insert_key_v<C>) { + if constexpr (QContainerInfo::can_insert_key_v<C>) { return [](void *c, const void *k) { static_cast<C *>(c)->insert( - *static_cast<const QContainerTraits::key_type<C> *>(k)); + *static_cast<const QContainerInfo::key_type<C> *>(k)); }; - } else if constexpr (QContainerTraits::can_insert_pair_v<C>) { + } else if constexpr (QContainerInfo::can_insert_pair_v<C>) { return [](void *c, const void *k) { static_cast<C *>(c)->insert( - {*static_cast<const QContainerTraits::key_type<C> *>(k), {}}); + {*static_cast<const QContainerInfo::key_type<C> *>(k), {}}); }; - } else if constexpr (QContainerTraits::can_insert_key_mapped_v<C>) { + } else if constexpr (QContainerInfo::can_insert_key_mapped_v<C>) { return [](void *c, const void *k) { static_cast<C *>(c)->insert( - *static_cast<const QContainerTraits::key_type<C> *>(k), {}); + *static_cast<const QContainerInfo::key_type<C> *>(k), {}); }; } else { return nullptr; @@ -737,13 +699,13 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::RemoveKeyFn getRemoveKeyFn() { - if constexpr (QContainerTraits::can_erase_at_key_v<C>) { + if constexpr (QContainerInfo::can_erase_at_key_v<C>) { return [](void *c, const void *k) { - static_cast<C *>(c)->erase(*static_cast<const QContainerTraits::key_type<C> *>(k)); + static_cast<C *>(c)->erase(*static_cast<const QContainerInfo::key_type<C> *>(k)); }; - } else if constexpr (QContainerTraits::can_remove_at_key_v<C>) { + } else if constexpr (QContainerInfo::can_remove_at_key_v<C>) { return [](void *c, const void *k) { - static_cast<C *>(c)->remove(*static_cast<const QContainerTraits::key_type<C> *>(k)); + static_cast<C *>(c)->remove(*static_cast<const QContainerInfo::key_type<C> *>(k)); }; } else { return nullptr; @@ -752,16 +714,16 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::ContainsKeyFn getContainsKeyFn() { - if constexpr (QContainerTraits::has_contains_v<C>) { + if constexpr (QContainerInfo::has_contains_v<C>) { return [](const void *c, const void *k) { return static_cast<const C *>(c)->contains( - *static_cast<const QContainerTraits::key_type<C> *>(k)); + *static_cast<const QContainerInfo::key_type<C> *>(k)); }; - } else if (QContainerTraits::has_find_v<C>) { + } else if (QContainerInfo::has_find_v<C>) { return [](const void *c, const void *k) { const C *container = static_cast<const C *>(c); return container->find( - *static_cast<const QContainerTraits::key_type<C> *>(k)) + *static_cast<const QContainerInfo::key_type<C> *>(k)) != container->end(); }; } else { @@ -771,17 +733,17 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::MappedAtKeyFn getMappedAtKeyFn() { - if constexpr (QContainerTraits::has_at_key_v<C>) { + if constexpr (QContainerInfo::has_at_key_v<C>) { return [](const void *c, const void *k, void *r) { - *static_cast<QContainerTraits::mapped_type<C> *>(r) + *static_cast<QContainerInfo::mapped_type<C> *>(r) = static_cast<const C *>(c)->at( - *static_cast<const QContainerTraits::key_type<C> *>(k)); + *static_cast<const QContainerInfo::key_type<C> *>(k)); }; - } else if constexpr (QContainerTraits::can_get_at_key_v<C>) { + } else if constexpr (QContainerInfo::can_get_at_key_v<C>) { return [](const void *c, const void *k, void *r) { - *static_cast<QContainerTraits::mapped_type<C> *>(r) + *static_cast<QContainerInfo::mapped_type<C> *>(r) = (*static_cast<const C *>(c))[ - *static_cast<const QContainerTraits::key_type<C> *>(k)]; + *static_cast<const QContainerInfo::key_type<C> *>(k)]; }; } else { return nullptr; @@ -790,10 +752,10 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::SetMappedAtKeyFn getSetMappedAtKeyFn() { - if constexpr (QContainerTraits::can_set_at_key_v<C>) { + if constexpr (QContainerInfo::can_set_at_key_v<C>) { return [](void *c, const void *k, const void *m) { - (*static_cast<C *>(c))[*static_cast<const QContainerTraits::key_type<C> *>(k)] = - *static_cast<const QContainerTraits::mapped_type<C> *>(m); + (*static_cast<C *>(c))[*static_cast<const QContainerInfo::key_type<C> *>(k)] = + *static_cast<const QContainerInfo::mapped_type<C> *>(m); }; } else { return nullptr; @@ -802,11 +764,11 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::CreateIteratorAtKeyFn createIteratorAtKeyFn() { - if constexpr (QContainerTraits::has_find_v<C>) { + if constexpr (QContainerInfo::has_find_v<C>) { return [](void *c, const void *k) -> void* { - using Iterator = QContainerTraits::iterator<C>; + using Iterator = QContainerInfo::iterator<C>; return new Iterator(static_cast<C *>(c)->find( - *static_cast<const QContainerTraits::key_type<C> *>(k))); + *static_cast<const QContainerInfo::key_type<C> *>(k))); }; } else { return nullptr; @@ -815,11 +777,11 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::CreateConstIteratorAtKeyFn createConstIteratorAtKeyFn() { - if constexpr (QContainerTraits::has_find_v<C>) { + if constexpr (QContainerInfo::has_find_v<C>) { return [](const void *c, const void *k) -> void* { - using Iterator = QContainerTraits::const_iterator<C>; + using Iterator = QContainerInfo::const_iterator<C>; return new Iterator(static_cast<const C *>(c)->find( - *static_cast<const QContainerTraits::key_type<C> *>(k))); + *static_cast<const QContainerInfo::key_type<C> *>(k))); }; } else { return nullptr; @@ -829,20 +791,20 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> template<typename Iterator> static constexpr QMetaAssociationInterface::KeyAtIteratorFn keyAtIteratorFn() { - if constexpr (QContainerTraits::iterator_has_key_v<C>) { + if constexpr (QContainerInfo::iterator_has_key_v<C>) { return [](const void *i, void *k) { - *static_cast<QContainerTraits::key_type<C> *>(k) + *static_cast<QContainerInfo::key_type<C> *>(k) = static_cast<const Iterator *>(i)->key(); }; - } else if constexpr (QContainerTraits::iterator_dereferences_to_value_v<C> - && QContainerTraits::value_type_has_first_v<C>) { + } else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C> + && QContainerInfo::value_type_has_first_v<C>) { return [](const void *i, void *k) { - *static_cast<QContainerTraits::key_type<C> *>(k) + *static_cast<QContainerInfo::key_type<C> *>(k) = (*static_cast<const Iterator *>(i))->first; }; - } else if constexpr (QContainerTraits::iterator_dereferences_to_key_v<C>) { + } else if constexpr (QContainerInfo::iterator_dereferences_to_key_v<C>) { return [](const void *i, void *k) { - *static_cast<QContainerTraits::key_type<C> *>(k) + *static_cast<QContainerInfo::key_type<C> *>(k) = *(*static_cast<const Iterator *>(i)); }; } else { @@ -852,31 +814,31 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::KeyAtIteratorFn getKeyAtIteratorFn() { - return keyAtIteratorFn<QContainerTraits::iterator<C>>(); + return keyAtIteratorFn<QContainerInfo::iterator<C>>(); } static constexpr QMetaAssociationInterface::KeyAtIteratorFn getKeyAtConstIteratorFn() { - return keyAtIteratorFn<QContainerTraits::const_iterator<C>>(); + return keyAtIteratorFn<QContainerInfo::const_iterator<C>>(); } template<typename Iterator> static constexpr QMetaAssociationInterface::MappedAtIteratorFn mappedAtIteratorFn() { - if constexpr (QContainerTraits::iterator_has_value_v<C>) { + if constexpr (QContainerInfo::iterator_has_value_v<C>) { return [](const void *i, void *k) { - *static_cast<QContainerTraits::mapped_type<C> *>(k) + *static_cast<QContainerInfo::mapped_type<C> *>(k) = static_cast<const Iterator *>(i)->value(); }; - } else if constexpr (QContainerTraits::iterator_dereferences_to_value_v<C> - && QContainerTraits::value_type_has_second_v<C>) { + } else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C> + && QContainerInfo::value_type_has_second_v<C>) { return [](const void *i, void *k) { - *static_cast<QContainerTraits::mapped_type<C> *>(k) + *static_cast<QContainerInfo::mapped_type<C> *>(k) = (*static_cast<const Iterator *>(i))->second; }; - } else if constexpr (QContainerTraits::iterator_dereferences_to_mapped_v<C>) { + } else if constexpr (QContainerInfo::iterator_dereferences_to_mapped_v<C>) { return [](const void *i, void *k) { - *static_cast<QContainerTraits::mapped_type<C> *>(k) + *static_cast<QContainerInfo::mapped_type<C> *>(k) = *static_cast<const Iterator *>(i); }; } else { @@ -886,26 +848,26 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> static constexpr QMetaAssociationInterface::MappedAtIteratorFn getMappedAtIteratorFn() { - return mappedAtIteratorFn<QContainerTraits::iterator<C>>(); + return mappedAtIteratorFn<QContainerInfo::iterator<C>>(); } static constexpr QMetaAssociationInterface::MappedAtIteratorFn getMappedAtConstIteratorFn() { - return mappedAtIteratorFn<QContainerTraits::const_iterator<C>>(); + return mappedAtIteratorFn<QContainerInfo::const_iterator<C>>(); } static constexpr QMetaAssociationInterface::SetMappedAtIteratorFn getSetMappedAtIteratorFn() { - if constexpr (QContainerTraits::can_set_mapped_at_iterator_v<C> && !std::is_const_v<C>) { + if constexpr (QContainerInfo::can_set_mapped_at_iterator_v<C> && !std::is_const_v<C>) { return [](const void *i, const void *m) { - *(*static_cast<const QContainerTraits::iterator<C> *>(i)) - = *static_cast<const QContainerTraits::mapped_type<C> *>(m); + *(*static_cast<const QContainerInfo::iterator<C> *>(i)) + = *static_cast<const QContainerInfo::mapped_type<C> *>(m); }; - } else if constexpr (QContainerTraits::iterator_dereferences_to_value_v<C> - && QContainerTraits::value_type_has_second_v<C>) { + } else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C> + && QContainerInfo::value_type_has_second_v<C>) { return [](const void *i, const void *m) { - (*static_cast<const QContainerTraits::iterator<C> *>(i))->second - = *static_cast<const QContainerTraits::mapped_type<C> *>(m); + (*static_cast<const QContainerInfo::iterator<C> *>(i))->second + = *static_cast<const QContainerInfo::mapped_type<C> *>(m); }; } else { return nullptr; @@ -917,31 +879,8 @@ class QMetaAssociationForContainer : public QMetaContainerForContainer<C> return QMetaContainerForContainer<C>::template getEraseAtIteratorFn< QMetaAssociationInterface::EraseKeyAtIteratorFn>(); } - -public: - static QMetaAssociationInterface metaAssociation; }; -template<typename C> -QMetaSequenceInterface QMetaSequenceForContainer<C>::metaSequence - = QMetaSequenceInterface(QMetaSequenceForContainer<C>()); - -template<typename C> -QMetaAssociationInterface QMetaAssociationForContainer<C>::metaAssociation - = QMetaAssociationInterface(QMetaAssociationForContainer<C>()); - -template<typename C> -constexpr QMetaSequenceInterface *qMetaSequenceInterfaceForContainer() -{ - return &QMetaSequenceForContainer<C>::metaSequence; -} - -template<typename C> -constexpr QMetaAssociationInterface *qMetaAssociationInterfaceForContainer() -{ - return &QMetaAssociationForContainer<C>::metaAssociation; -} - } // namespace QtMetaContainerPrivate class Q_CORE_EXPORT QMetaContainer @@ -987,12 +926,12 @@ class Q_CORE_EXPORT QMetaSequence : public QMetaContainer { public: QMetaSequence() = default; - explicit QMetaSequence(QtMetaContainerPrivate::QMetaSequenceInterface *d) : QMetaContainer(d) {} + explicit QMetaSequence(const QtMetaContainerPrivate::QMetaSequenceInterface *d) : QMetaContainer(d) {} template<typename T> static constexpr QMetaSequence fromContainer() { - return QMetaSequence(QtMetaContainerPrivate::qMetaSequenceInterfaceForContainer<T>()); + return QMetaSequence(&MetaSequence<T>::value); } QMetaType valueMetaType() const; @@ -1037,16 +976,23 @@ public: bool canGetValueAtConstIterator() const; void valueAtConstIterator(const void *iterator, void *result) const; - friend bool operator==(const QMetaSequence &a, const QMetaSequence &b) + const QtMetaContainerPrivate::QMetaSequenceInterface *iface() const { return d(); } + +private: + friend bool comparesEqual(const QMetaSequence &lhs, const QMetaSequence &rhs) noexcept { - return a.d() == b.d(); + return lhs.d() == rhs.d(); } - friend bool operator!=(const QMetaSequence &a, const QMetaSequence &b) + Q_DECLARE_EQUALITY_COMPARABLE(QMetaSequence) + + template<typename T> + struct MetaSequence { - return a.d() != b.d(); - } + static constexpr const QtMetaContainerPrivate::QMetaSequenceInterface value + = QtMetaContainerPrivate::QMetaSequenceInterface( + QtMetaContainerPrivate::QMetaSequenceForContainer<T>()); + }; -private: const QtMetaContainerPrivate::QMetaSequenceInterface *d() const { return static_cast<const QtMetaContainerPrivate::QMetaSequenceInterface *>(d_ptr); @@ -1057,12 +1003,12 @@ class Q_CORE_EXPORT QMetaAssociation : public QMetaContainer { public: QMetaAssociation() = default; - explicit QMetaAssociation(QtMetaContainerPrivate::QMetaAssociationInterface *d) : QMetaContainer(d) {} + explicit QMetaAssociation(const QtMetaContainerPrivate::QMetaAssociationInterface *d) : QMetaContainer(d) {} template<typename T> static constexpr QMetaAssociation fromContainer() { - return QMetaAssociation(QtMetaContainerPrivate::qMetaAssociationInterfaceForContainer<T>()); + return QMetaAssociation(&MetaAssociation<T>::value); } QMetaType keyMetaType() const; @@ -1223,16 +1169,23 @@ public: return nullptr; } - friend bool operator==(const QMetaAssociation &a, const QMetaAssociation &b) + const QtMetaContainerPrivate::QMetaAssociationInterface *iface() const { return d(); } + +private: + friend bool comparesEqual(const QMetaAssociation &lhs, const QMetaAssociation &rhs) noexcept { - return a.d() == b.d(); + return lhs.d() == rhs.d(); } - friend bool operator!=(const QMetaAssociation &a, const QMetaAssociation &b) + Q_DECLARE_EQUALITY_COMPARABLE(QMetaAssociation) + + template<typename T> + struct MetaAssociation { - return a.d() != b.d(); - } + static constexpr const QtMetaContainerPrivate::QMetaAssociationInterface value + = QtMetaContainerPrivate::QMetaAssociationInterface( + QtMetaContainerPrivate::QMetaAssociationForContainer<T>()); + }; -private: const QtMetaContainerPrivate::QMetaAssociationInterface *d() const { return static_cast<const QtMetaContainerPrivate::QMetaAssociationInterface *>(d_ptr); |