From 4e7baaaa91ce663b0b5c315e5b049d1574aef73f Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 29 Apr 2014 15:31:51 +0200 Subject: 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 ++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) (limited to 'src/corelib/kernel') 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 { -- cgit v1.2.3