diff options
author | Jędrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-10-31 10:22:46 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-09 10:12:34 +0100 |
commit | ca26fefc0624264262a2abe630568271cefa2753 (patch) | |
tree | 6f0a5acc1263b744dea7c79f0b9c8e164874748e /src | |
parent | 5bd377274e080234cb7e74679b7477feec9ec294 (diff) |
[optimization] QVariants comparison
QMetaType::isRegistered and QMetaType::typeName are quite expensive.
To compare two custom objects we need to have their type name (for
dereferenced comparison). If the name exist we know for sure that the
type is registered and we do not have to call QMetaType::isRegistered
anymore.
Change-Id: Iba631e012504c8633868a902880fa30d38afb917
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/kernel/qvariant_p.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index aa03bb298a..5729c0d2d5 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -161,13 +161,13 @@ class QVariantComparator { struct FilteredComparator<T, /* IsAcceptedType = */ false> { static bool compare(const QVariant::Private *m_a, const QVariant::Private *m_b) { - if (!QMetaType::isRegistered(m_a->type)) + const char *const typeName = QMetaType::typeName(m_a->type); + if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(m_a->type))) qFatal("QVariant::compare: type %d unknown to QVariant.", m_a->type); const void *a_ptr = m_a->is_shared ? m_a->data.shared->ptr : &(m_a->data.ptr); const void *b_ptr = m_b->is_shared ? m_b->data.shared->ptr : &(m_b->data.ptr); - const char *const typeName = QMetaType::typeName(m_a->type); uint typeNameLen = qstrlen(typeName); if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*') return *static_cast<void *const *>(a_ptr) == *static_cast<void *const *>(b_ptr); |