summaryrefslogtreecommitdiff
path: root/src/corelib/kernel/qmetatype_p.h
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/kernel/qmetatype_p.h
parentdae1df576f5dd468c5f9d118d9db9ece820de18a (diff)
downloadqtbase-ce4343a52f68ce0759d712c79d3acd37ecd954b1.tar.gz
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/kernel/qmetatype_p.h')
-rw-r--r--src/corelib/kernel/qmetatype_p.h66
1 files changed, 66 insertions, 0 deletions
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