summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2012-08-24 12:40:20 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-26 16:54:27 +0200
commit3de60970e58aa7c455e356c277667614804475ce (patch)
treed3d75529481975457e7aadd3611ded80940a7869 /src/corelib
parent56603a8d83762d15e37c887e4c66a340d679f316 (diff)
QMetaTypeId: optimize qt_metatype_id() in special cases
Same change as for Q_DECLARE_METATYPE, but in the container and smart pointer specialisations of it. Change-Id: If9390ccc43eb3b07122f5ea5b8094139b5e1ded0 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qmetatype.h98
1 files changed, 50 insertions, 48 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 80bc4a48b7..cc4626f5eb 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -648,16 +648,17 @@ struct QMetaTypeIdQObject<T*, /* isPointerToTypeDerivedFromQObject */ true>
static int qt_metatype_id()
{
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
- if (!metatype_id.load()) {
- const int len = int(strlen(T::staticMetaObject.className()));
- QVarLengthArray<char, 16> classNameStar;
- classNameStar.append(T::staticMetaObject.className(), len);
- classNameStar.append('*');
- metatype_id.storeRelease(qRegisterNormalizedMetaType<T*>( \
+ if (const int id = metatype_id.loadAcquire())
+ return id;
+ const int len = int(strlen(T::staticMetaObject.className()));
+ QVarLengthArray<char, 16> classNameStar;
+ classNameStar.append(T::staticMetaObject.className(), len);
+ classNameStar.append('*');
+ const int newId = qRegisterNormalizedMetaType<T*>( \
QByteArray(classNameStar.constData(), classNameStar.size()),
- reinterpret_cast<T**>(quintptr(-1))));
- }
- return metatype_id.loadAcquire();
+ reinterpret_cast<T**>(quintptr(-1)));
+ metatype_id.storeRelease(newId);
+ return newId;
}
};
@@ -733,22 +734,22 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE<T> > \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
- if (!metatype_id.load()) { \
- QVarLengthArray<char, 24> name; \
- name.append(#SINGLE_ARG_TEMPLATE, int(sizeof(#SINGLE_ARG_TEMPLATE)) - 1); \
- name.append('<'); \
- const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
- Q_ASSERT(tName); \
- name.append(tName, int(strlen(tName))); \
- if (name.last() == '>') \
- name.append(' '); \
- name.append('>'); \
- metatype_id.storeRelease( \
- qRegisterNormalizedMetaType< SINGLE_ARG_TEMPLATE<T> >( \
+ if (const int id = metatype_id.load()) \
+ return id; \
+ QVarLengthArray<char, 24> name; \
+ name.append(#SINGLE_ARG_TEMPLATE, int(sizeof(#SINGLE_ARG_TEMPLATE)) - 1); \
+ name.append('<'); \
+ const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
+ Q_ASSERT(tName); \
+ name.append(tName, int(strlen(tName))); \
+ if (name.last() == '>') \
+ name.append(' '); \
+ name.append('>'); \
+ const int newId = qRegisterNormalizedMetaType< SINGLE_ARG_TEMPLATE<T> >( \
QByteArray(name.constData(), name.size()), \
- reinterpret_cast< SINGLE_ARG_TEMPLATE<T> *>(quintptr(-1)))); \
- } \
- return metatype_id.loadAcquire(); \
+ reinterpret_cast< SINGLE_ARG_TEMPLATE<T> *>(quintptr(-1))); \
+ metatype_id.storeRelease(newId); \
+ return newId; \
} \
};
@@ -762,26 +763,26 @@ struct QMetaTypeId< DOUBLE_ARG_TEMPLATE<T, U> > \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
- if (!metatype_id.load()) {\
- QVarLengthArray<char, 24> name; \
- name.append(#DOUBLE_ARG_TEMPLATE, sizeof(#DOUBLE_ARG_TEMPLATE) - 1); \
- name.append('<'); \
- const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
- Q_ASSERT(tName); \
- name.append(tName, int(strlen(tName))); \
- name.append(','); \
- const char *uName = QMetaType::typeName(qMetaTypeId<U>()); \
- Q_ASSERT(uName); \
- name.append(uName, int(strlen(uName))); \
- if (name.last() == '>') \
- name.append(' '); \
- name.append('>'); \
- metatype_id.storeRelease(\
- qRegisterNormalizedMetaType< DOUBLE_ARG_TEMPLATE<T, U> >(\
+ if (const int id = metatype_id.loadAcquire()) \
+ return id; \
+ QVarLengthArray<char, 24> name; \
+ name.append(#DOUBLE_ARG_TEMPLATE, sizeof(#DOUBLE_ARG_TEMPLATE) - 1); \
+ name.append('<'); \
+ const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
+ Q_ASSERT(tName); \
+ name.append(tName, int(strlen(tName))); \
+ name.append(','); \
+ const char *uName = QMetaType::typeName(qMetaTypeId<U>()); \
+ Q_ASSERT(uName); \
+ name.append(uName, int(strlen(uName))); \
+ if (name.last() == '>') \
+ name.append(' '); \
+ name.append('>'); \
+ const int newId = qRegisterNormalizedMetaType< DOUBLE_ARG_TEMPLATE<T, U> >(\
QByteArray(name.constData(), name.size()), \
- reinterpret_cast< DOUBLE_ARG_TEMPLATE<T, U> *>(quintptr(-1)))); \
- }\
- return metatype_id.loadAcquire(); \
+ reinterpret_cast< DOUBLE_ARG_TEMPLATE<T, U> *>(quintptr(-1))); \
+ metatype_id.storeRelease(newId); \
+ return newId; \
} \
};
@@ -803,11 +804,12 @@ struct QMetaTypeId_ ## SMART_POINTER ## _QObjectStar<T, true> \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
- if (!metatype_id.load()) { \
- metatype_id.storeRelease(qRegisterNormalizedMetaType< SMART_POINTER<T> >( #SMART_POINTER "<" + QByteArray(T::staticMetaObject.className()) + ">", \
- reinterpret_cast< SMART_POINTER<T> *>(quintptr(-1)))); \
- } \
- return metatype_id.loadAcquire(); \
+ if (const int id = metatype_id.loadAcquire()) \
+ return id; \
+ const int newId = qRegisterNormalizedMetaType< SMART_POINTER<T> >( #SMART_POINTER "<" + QByteArray(T::staticMetaObject.className()) + ">", \
+ reinterpret_cast< SMART_POINTER<T> *>(quintptr(-1))); \
+ metatype_id.storeRelease(newId); \
+ return newId; \
} \
}; \
\