summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-12-18 15:46:11 +0100
committerUlf Hermann <ulf.hermann@qt.io>2021-01-06 17:15:03 +0100
commitc9a11022692f9a4bd36beb0cd001686694a48915 (patch)
tree3237e2f88fc261067bed8a8a49db7bd949d7482d /src
parent05146a77fce7f080eefad3f82a14e60c8e3ec464 (diff)
Make QString and QByteArray sequentially iterable
As lists of QStrings and QByteArrays are sequentially iterable the base types should really also be. The only problem is that they don't have methods to remove items from the back or the front, but that is well within what we can support with QSequentialIterable. Change-Id: I2ab551e7b11a092aba363fb4012d131bbc4b11b4 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/kernel/qmetatype.cpp64
1 files changed, 40 insertions, 24 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 78ade68a2c..859a8946a4 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -1951,27 +1951,33 @@ static bool convertIterableToVariantPair(QMetaType fromType, const void *from, v
static bool convertToSequentialIterable(QMetaType fromType, const void *from, void *to)
{
using namespace QtMetaTypePrivate;
- int fromTypeId = fromType.id();
+ const int fromTypeId = fromType.id();
QSequentialIterable &i = *static_cast<QSequentialIterable *>(to);
- if (fromTypeId == QMetaType::QVariantList) {
+ switch (fromTypeId) {
+ case QMetaType::QVariantList:
i = QSequentialIterable(reinterpret_cast<const QVariantList *>(from));
return true;
- }
- if (fromTypeId == QMetaType::QStringList) {
+ case QMetaType::QStringList:
i = QSequentialIterable(reinterpret_cast<const QStringList *>(from));
return true;
- }
- else if (fromTypeId == QMetaType::QByteArrayList) {
+ case QMetaType::QByteArrayList:
i = QSequentialIterable(reinterpret_cast<const QByteArrayList *>(from));
return true;
- }
-
- QSequentialIterable impl;
- if (QMetaType::convert(
- fromType, from, QMetaType::fromType<QIterable<QMetaSequence>>(), &impl)) {
- i = std::move(impl);
+ case QMetaType::QString:
+ i = QSequentialIterable(reinterpret_cast<const QString *>(from));
+ return true;
+ case QMetaType::QByteArray:
+ i = QSequentialIterable(reinterpret_cast<const QByteArray *>(from));
return true;
+ default: {
+ QSequentialIterable impl;
+ if (QMetaType::convert(
+ fromType, from, QMetaType::fromType<QIterable<QMetaSequence>>(), &impl)) {
+ i = std::move(impl);
+ return true;
+ }
+ }
}
return false;
@@ -1983,6 +1989,8 @@ static bool canConvertToSequentialIterable(QMetaType fromType)
case QMetaType::QVariantList:
case QMetaType::QStringList:
case QMetaType::QByteArrayList:
+ case QMetaType::QString:
+ case QMetaType::QByteArray:
return true;
default:
return QMetaType::canConvert(fromType, QMetaType::fromType<QIterable<QMetaSequence>>());
@@ -1995,6 +2003,8 @@ static bool canImplicitlyViewAsSequentialIterable(QMetaType fromType)
case QMetaType::QVariantList:
case QMetaType::QStringList:
case QMetaType::QByteArrayList:
+ case QMetaType::QString:
+ case QMetaType::QByteArray:
return true;
default:
return QMetaType::canView(
@@ -2005,27 +2015,33 @@ static bool canImplicitlyViewAsSequentialIterable(QMetaType fromType)
static bool viewAsSequentialIterable(QMetaType fromType, void *from, void *to)
{
using namespace QtMetaTypePrivate;
- int fromTypeId = fromType.id();
+ const int fromTypeId = fromType.id();
QSequentialIterable &i = *static_cast<QSequentialIterable *>(to);
- if (fromTypeId == QMetaType::QVariantList) {
+ switch (fromTypeId) {
+ case QMetaType::QVariantList:
i = QSequentialIterable(reinterpret_cast<QVariantList *>(from));
return true;
- }
- if (fromTypeId == QMetaType::QStringList) {
+ case QMetaType::QStringList:
i = QSequentialIterable(reinterpret_cast<QStringList *>(from));
return true;
- }
- else if (fromTypeId == QMetaType::QByteArrayList) {
+ case QMetaType::QByteArrayList:
i = QSequentialIterable(reinterpret_cast<QByteArrayList *>(from));
return true;
- }
-
- QIterable<QMetaSequence> j(QMetaSequence(), nullptr);
- if (QMetaType::view(
- fromType, from, QMetaType::fromType<QIterable<QMetaSequence>>(), &j)) {
- i = std::move(j);
+ case QMetaType::QString:
+ i = QSequentialIterable(reinterpret_cast<QString *>(from));
+ return true;
+ case QMetaType::QByteArray:
+ i = QSequentialIterable(reinterpret_cast<QByteArray *>(from));
return true;
+ default: {
+ QIterable<QMetaSequence> j(QMetaSequence(), nullptr);
+ if (QMetaType::view(
+ fromType, from, QMetaType::fromType<QIterable<QMetaSequence>>(), &j)) {
+ i = std::move(j);
+ return true;
+ }
+ }
}
return false;