summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>2011-11-21 14:08:52 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-22 19:05:18 +0100
commitce4343a52f68ce0759d712c79d3acd37ecd954b1 (patch)
treed6aeb9946f4aeb9afeaf941b7840e9f7539c0a5f /src/corelib
parentdae1df576f5dd468c5f9d118d9db9ece820de18a (diff)
Code cleanup in QVariant and QMetaType.
QMetaTypeGuiHelper was generalized and renamed to QMetaTypeInterface. From now all types will have common interface which can be used for basic operations. Change-Id: I50d67f4a8081fa0f75c9d530a8211593ec37bc55 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qmetatype.cpp34
-rw-r--r--src/corelib/kernel/qmetatype_p.h66
2 files changed, 69 insertions, 31 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index ebb4548934..e3a8293ee6 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -287,42 +287,14 @@ static const struct { const char * typeName; int typeNameLength; int type; } typ
{0, 0, QMetaType::Void}
};
-struct QMetaTypeGuiHelper
-{
- QMetaType::Creator creator;
- QMetaType::Deleter deleter;
-#ifndef QT_NO_DATASTREAM
- QMetaType::SaveOperator saveOp;
- QMetaType::LoadOperator loadOp;
-#endif
- QMetaType::Constructor constructor;
- QMetaType::Destructor destructor;
- int size;
-};
-Q_CORE_EXPORT const QMetaTypeGuiHelper *qMetaTypeGuiHelper = 0;
-Q_CORE_EXPORT const QMetaTypeGuiHelper *qMetaTypeWidgetsHelper = 0;
+Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper = 0;
+Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper = 0;
-class QCustomTypeInfo
+class QCustomTypeInfo : public QMetaTypeInterface
{
public:
- QCustomTypeInfo() : typeName(), creator(0), deleter(0)
-#ifndef QT_NO_DATASTREAM
- , saveOp(0), loadOp(0)
-#endif
- , constructor(0), destructor(0), size(0)
- {}
-
QByteArray typeName;
- QMetaType::Creator creator;
- QMetaType::Deleter deleter;
-#ifndef QT_NO_DATASTREAM
- QMetaType::SaveOperator saveOp;
- QMetaType::LoadOperator loadOp;
-#endif
int alias;
- QMetaType::Constructor constructor;
- QMetaType::Destructor destructor;
- int size;
};
Q_DECLARE_TYPEINFO(QCustomTypeInfo, Q_MOVABLE_TYPE);
diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h
index 521e8ff1ac..205516d862 100644
--- a/src/corelib/kernel/qmetatype_p.h
+++ b/src/corelib/kernel/qmetatype_p.h
@@ -111,6 +111,72 @@ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER)
#undef QT_DECLARE_GUI_MODULE_TYPES_ITER
#undef QT_DECLARE_WIDGETS_MODULE_TYPES_ITER
+class QMetaTypeInterface
+{
+private:
+ template<typename T>
+ struct Impl {
+ static void *creator(const T *t)
+ {
+ if (t)
+ return new T(*t);
+ return new T();
+ }
+
+ static void deleter(T *t) { delete t; }
+ #ifndef QT_NO_DATASTREAM
+ static void saver(QDataStream &stream, const T *t) { stream << *t; }
+ static void loader(QDataStream &stream, T *t) { stream >> *t; }
+ #endif // QT_NO_DATASTREAM
+ static void destructor(T *t)
+ {
+ Q_UNUSED(t) // Silence MSVC that warns for POD types.
+ t->~T();
+ }
+ static void *constructor(void *where, const T *t)
+ {
+ if (t)
+ return new (where) T(*static_cast<const T*>(t));
+ return new (where) T;
+ }
+ };
+public:
+ template<typename T>
+ QMetaTypeInterface(T * = 0)
+ : creator(reinterpret_cast<QMetaType::Creator>(Impl<T>::creator))
+ , deleter(reinterpret_cast<QMetaType::Deleter>(Impl<T>::deleter))
+ #ifndef QT_NO_DATASTREAM
+ , saveOp(reinterpret_cast<QMetaType::SaveOperator>(Impl<T>::saver))
+ , loadOp(reinterpret_cast<QMetaType::LoadOperator>(Impl<T>::loader))
+ #endif
+ , constructor(reinterpret_cast<QMetaType::Constructor>(Impl<T>::constructor))
+ , destructor(reinterpret_cast<QMetaType::Destructor>(Impl<T>::destructor))
+ , size(sizeof(T))
+ {}
+
+ QMetaTypeInterface()
+ : creator(0)
+ , deleter(0)
+ #ifndef QT_NO_DATASTREAM
+ , saveOp(0)
+ , loadOp(0)
+ #endif
+ , constructor(0)
+ , destructor(0)
+ , size(0)
+ {}
+
+ QMetaType::Creator creator;
+ QMetaType::Deleter deleter;
+#ifndef QT_NO_DATASTREAM
+ QMetaType::SaveOperator saveOp;
+ QMetaType::LoadOperator loadOp;
+#endif
+ QMetaType::Constructor constructor;
+ QMetaType::Destructor destructor;
+ int size;
+};
+
QT_END_NAMESPACE
#endif // QMETATYPE_P_H