Introduce QTypeInfo::sizeOf.
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>
Tue, 24 Jan 2012 14:42:01 +0000 (15:42 +0100)
committerQt by Nokia <qt-info@nokia.com>
Sun, 29 Jan 2012 14:21:16 +0000 (15:21 +0100)
In QMetaType "void" is a regular type, lack of c++ sizeof operator
force us to write a template specialization for the type.

Change-Id: I9a56e135223b416b8031836d29ef33ef3fb750e4
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
src/corelib/global/qglobal.h
src/corelib/kernel/qmetatype.cpp
tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp

index 43632cb..b38583c 100644 (file)
@@ -2020,7 +2020,8 @@ public:
         isComplex = true,
         isStatic = true,
         isLarge = (sizeof(T)>sizeof(void*)),
-        isDummy = false
+        isDummy = false,
+        sizeOf = sizeof(T)
     };
 };
 
@@ -2033,7 +2034,8 @@ public:
         isComplex = false,
         isStatic = false,
         isLarge = false,
-        isDummy = false
+        isDummy = false,
+        sizeOf = 0
     };
 };
 
@@ -2046,7 +2048,8 @@ public:
         isComplex = false,
         isStatic = false,
         isLarge = false,
-        isDummy = false
+        isDummy = false,
+        sizeOf = sizeof(T*)
     };
 };
 
@@ -2062,7 +2065,8 @@ public: \
         isComplex = true, \
         isStatic = false, \
         isLarge = (sizeof(CONTAINER<T>) > sizeof(void*)), \
-        isDummy = false \
+        isDummy = false, \
+        sizeOf = sizeof(CONTAINER<T>) \
     }; \
 };
 
@@ -2100,7 +2104,8 @@ public: \
         isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
         isLarge = (sizeof(TYPE)>sizeof(void*)), \
         isPointer = false, \
-        isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0) \
+        isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0), \
+        sizeOf = sizeof(TYPE) \
     }; \
     static inline const char *name() { return #TYPE; } \
 }
index a0a1295..38ca021 100644 (file)
@@ -1606,7 +1606,7 @@ namespace {
 class SizeOf {
     template<typename T, bool IsAcceptedType = DefinedTypesFilter::Acceptor<T>::IsAccepted>
     struct SizeOfImpl {
-        static int Size(const int) { return sizeof(T); }
+        static int Size(const int) { return QTypeInfo<T>::sizeOf; }
     };
     template<typename T>
     struct SizeOfImpl<T, /* IsAcceptedType = */ false> {
@@ -1632,7 +1632,6 @@ public:
 
     template<typename T>
     int delegate(const T*) { return SizeOfImpl<T>::Size(m_type); }
-    int delegate(const void*) { return 0; }
     int delegate(const QMetaTypeSwitcher::UnknownType*) { return customTypeSizeOf(m_type); }
 private:
     static int customTypeSizeOf(const int type)
index 19aa687..43537fc 100644 (file)
@@ -571,15 +571,12 @@ FOR_EACH_CORE_METATYPE(RETURN_CREATE_COPY_FUNCTION)
     TypeTestFunctionGetter::get(type)();
 }
 
-template<typename T> struct SafeSizeOf { enum {Size = sizeof(T)}; };
-template<> struct SafeSizeOf<void> { enum {Size = 0}; };
-
 void tst_QMetaType::sizeOf_data()
 {
     QTest::addColumn<QMetaType::Type>("type");
     QTest::addColumn<int>("size");
 #define ADD_METATYPE_TEST_ROW(MetaTypeName, MetaTypeId, RealType) \
-    QTest::newRow(#RealType) << QMetaType::MetaTypeName << int(SafeSizeOf<RealType>::Size);
+    QTest::newRow(#RealType) << QMetaType::MetaTypeName << int(QTypeInfo<RealType>::sizeOf);
 FOR_EACH_CORE_METATYPE(ADD_METATYPE_TEST_ROW)
 #undef ADD_METATYPE_TEST_ROW
 }