summaryrefslogtreecommitdiffstats
path: root/src/corelib/global
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>2012-06-04 16:52:32 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-27 03:27:27 +0200
commit9b95ed1fe39853534b859a64095febeaf0975cf7 (patch)
treeb331d00d5305a0b4d334d13af256e2af5db1f28f /src/corelib/global
parent0feb2646748a65bafea8485104a2d5833c0d1558 (diff)
Introduce QTypeInfoMerger.
QTypeInfoMerger class was created to allow "inheriting" QTypeInfo traits. The class implementation was based on the QTypeInfo<QPair<>> specialization, therefore the specialization was refactored to use the new class. Change-Id: I4ff3e5eac1d55da086dad84274cce2b2c0a721be Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/global')
-rw-r--r--src/corelib/global/qtypeinfo.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
index 4255548b0d..e8aa883c9d 100644
--- a/src/corelib/global/qtypeinfo.h
+++ b/src/corelib/global/qtypeinfo.h
@@ -97,6 +97,38 @@ public:
};
};
+/*!
+ \class QTypeInfoMerger
+ \internal
+
+ \brief QTypeInfoMerger merges the QTypeInfo flags of T1, T2... and presents them
+ as a QTypeInfo<T> would do.
+
+ Let's assume that we have a simple set of structs:
+
+ \snippet code/src_corelib_global_qglobal.cpp 50
+
+ To create a proper QTypeInfo specialization for A struct, we have to check
+ all sub-components; B, C and D, then take the lowest common denominator and call
+ Q_DECLATE_TYPEINFO with the resulting flags. An easier and less fragile approach is to
+ use QTypeInfoMerger, which does that automatically. So struct A would have
+ the following QTypeInfo definition:
+
+ \snippet code/src_corelib_global_qglobal.cpp 51
+*/
+template <class T, class T1, class T2 = T1, class T3 = T1, class T4 = T1>
+class QTypeInfoMerger
+{
+public:
+ enum {
+ isComplex = QTypeInfo<T1>::isComplex || QTypeInfo<T2>::isComplex || QTypeInfo<T3>::isComplex || QTypeInfo<T4>::isComplex,
+ isStatic = QTypeInfo<T1>::isStatic || QTypeInfo<T2>::isStatic || QTypeInfo<T3>::isStatic || QTypeInfo<T4>::isStatic,
+ isLarge = sizeof(T) > sizeof(void*),
+ isPointer = false,
+ isDummy = false,
+ sizeOf = sizeof(T)
+ };
+};
#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER) \
template <typename T> class CONTAINER; \