summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetacontainer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qmetacontainer.h')
-rw-r--r--src/corelib/kernel/qmetacontainer.h403
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);