summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qvariant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qvariant.cpp')
-rw-r--r--src/corelib/kernel/qvariant.cpp54
1 files changed, 33 insertions, 21 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index 741a477860..c28476af17 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -4243,24 +4243,19 @@ QSequentialIterable::const_iterator QSequentialIterable::end() const
return it;
}
-static const QVariant variantFromVariantDataHelper(const QtMetaTypePrivate::VariantData &d) {
- QVariant v;
- if (d.metaType == QMetaType::fromType<QVariant>())
- v = *reinterpret_cast<const QVariant*>(d.data);
- else
- v = QVariant(d.metaType, d.data);
- if (d.flags & QVariantConstructionFlags::ShouldDeleteVariantData)
- d.metaType.destroy(const_cast<void *>(d.data));
- return v;
-}
-
/*!
Returns the element at position \a idx in the container.
*/
QVariant QSequentialIterable::at(int idx) const
{
- const QtMetaTypePrivate::VariantData d = m_impl.at(idx);
- return variantFromVariantDataHelper(d);
+ QVariant v(m_impl._metaType);
+ void *dataPtr;
+ if (m_impl._metaType == QMetaType::fromType<QVariant>())
+ dataPtr = &v;
+ else
+ dataPtr = v.data();
+ m_impl.at(idx, dataPtr);
+ return v;
}
/*!
@@ -4336,8 +4331,14 @@ QSequentialIterable::const_iterator::operator=(const const_iterator &other)
*/
const QVariant QSequentialIterable::const_iterator::operator*() const
{
- const QtMetaTypePrivate::VariantData d = m_impl.getCurrent();
- return variantFromVariantDataHelper(d);
+ QVariant v(m_impl._metaType);
+ void *dataPtr;
+ if (m_impl._metaType == QMetaType::fromType<QVariant>())
+ dataPtr = &v;
+ else
+ dataPtr = v.data();
+ m_impl.getCurrent(dataPtr);
+ return v;
}
/*!
@@ -4534,8 +4535,7 @@ void QAssociativeIterable::const_iterator::end()
void QAssociativeIterable::const_iterator::find(const QVariant &key)
{
Q_ASSERT(key.metaType() == m_impl._metaType_key);
- const QtMetaTypePrivate::VariantData dkey(key.metaType(), key.constData(), 0 /*key.flags()*/);
- m_impl.find(dkey);
+ m_impl.find(key.constData());
}
/*!
@@ -4664,8 +4664,14 @@ QAssociativeIterable::const_iterator::operator=(const const_iterator &other)
*/
const QVariant QAssociativeIterable::const_iterator::operator*() const
{
- const QtMetaTypePrivate::VariantData d = m_impl.getCurrentValue();
- return variantFromVariantDataHelper(d);
+ QVariant v(m_impl._metaType_value);
+ void *dataPtr;
+ if (m_impl._metaType_value == QMetaType::fromType<QVariant>())
+ dataPtr = &v;
+ else
+ dataPtr = v.data();
+ m_impl.getCurrentValue(dataPtr);
+ return v;
}
/*!
@@ -4673,8 +4679,14 @@ const QVariant QAssociativeIterable::const_iterator::operator*() const
*/
const QVariant QAssociativeIterable::const_iterator::key() const
{
- const QtMetaTypePrivate::VariantData d = m_impl.getCurrentKey();
- return variantFromVariantDataHelper(d);
+ QVariant v(m_impl._metaType_key);
+ void *dataPtr;
+ if (m_impl._metaType_key == QMetaType::fromType<QVariant>())
+ dataPtr = &v;
+ else
+ dataPtr = v.data();
+ m_impl.getCurrentKey(dataPtr);
+ return v;
}
/*!