From 4e7baaaa91ce663b0b5c315e5b049d1574aef73f Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 29 Apr 2014 15:31:51 +0200 Subject: [PATCH] Metatype: Specialize IteratorOwner for vector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I542af3a77b0a139e137a5a736b74042a8c25eb95 Reviewed-by: Jędrzej Nowacki --- src/corelib/kernel/qmetatype.cpp | 5 +++ src/corelib/kernel/qmetatype.h | 33 +++++++++++++++++-- .../kernel/qmetatype/tst_qmetatype.cpp | 11 +++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index f74c592e8c..251e4614ab 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -2405,4 +2405,9 @@ const QMetaObject *metaObjectForQWidget() } } +namespace QtMetaTypePrivate { +bool VectorBoolElements::true_element = true; +bool VectorBoolElements::false_element = false; +} + QT_END_NAMESPACE diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 9c61a67962..cecfce65ce 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -782,7 +782,7 @@ private: }; template -struct IteratorOwner +struct IteratorOwnerCommon { static void assign(void **ptr, const_iterator iterator) { @@ -804,6 +804,15 @@ struct IteratorOwner delete static_cast(*ptr); } + static bool equal(void * const *it, void * const *other) + { + return *static_cast(*it) == *static_cast(*other); + } +}; + +template +struct IteratorOwner : IteratorOwnerCommon +{ static const void *getData(void * const *iterator) { return &**static_cast(*iterator); @@ -813,12 +822,30 @@ struct IteratorOwner { return &*it; } +}; - static bool equal(void * const *it, void * const *other) +struct Q_CORE_EXPORT VectorBoolElements +{ + static bool true_element; + static bool false_element; +}; + +template<> +struct IteratorOwner::const_iterator> : IteratorOwnerCommon::const_iterator> +{ +public: + static const void *getData(void * const *iterator) { - return *static_cast(*it) == *static_cast(*other); + return **static_cast::const_iterator*>(*iterator) ? + &VectorBoolElements::true_element : &VectorBoolElements::false_element; + } + + static const void *getData(const std::vector::const_iterator& it) + { + return *it ? &VectorBoolElements::true_element : &VectorBoolElements::false_element; } }; + template struct IteratorOwner { diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index b65bddbf65..9a86dc03e5 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -1359,6 +1359,17 @@ void tst_QMetaType::automaticTemplateRegistration() TEST_SEQUENTIAL_CONTAINER(std::vector, int) TEST_SEQUENTIAL_CONTAINER(std::list, int) + { + std::vector vecbool; + vecbool.push_back(true); + vecbool.push_back(false); + vecbool.push_back(true); + QVERIFY(QVariant::fromValue(vecbool).value >().front() == true); + QVector > vectorList; + vectorList << vecbool; + QVERIFY(QVariant::fromValue(vectorList).value > >().first().front() == true); + } + { QList bytearrayList; bytearrayList << QByteArray("foo");