Simplify QMetaTypeSwitcher.
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>
Fri, 24 Feb 2012 13:27:01 +0000 (14:27 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 27 Feb 2012 12:19:00 +0000 (13:19 +0100)
We do not need to distinguish between different types in the switcher.

Before this patch it was not possible to overload
DelegateObject::delegate with a pointer type. Now it is fixed.

Change-Id: Icd73a53e73e5e66b1b6f6407ba4e0f79e584d930
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
src/corelib/kernel/qmetatypeswitcher_p.h
src/corelib/kernel/qvariant_p.h

index 05db2cb..e9c15ea 100644 (file)
@@ -59,46 +59,27 @@ QT_BEGIN_NAMESPACE
 
 class QMetaTypeSwitcher {
 public:
-
-    typedef void *NotBuiltinType;
+    class NotBuiltinType;
     template<class ReturnType, class DelegateObject>
     static ReturnType switcher(DelegateObject &logic, int type, const void *data);
 };
 
 
-#define QT_METATYPE_SWICHER_CASE_PRIMITIVE(TypeName, TypeId, Name)\
-    case QMetaType::TypeName: return logic.delegate(static_cast<const Name *>(data));
-
-#define QT_METATYPE_SWICHER_CASE_PRIMITIVE_POINTER(TypeName, TypeId, Name)\
-    case QMetaType::TypeName: return logic.delegate(static_cast< Name * const *>(data));
-
-#define QT_METATYPE_SWICHER_CASE_POINTER(TypeName, TypeId, Name)\
-    case QMetaType::TypeName: return logic.delegate(static_cast< QT_PREPEND_NAMESPACE(Name) * const *>(data));
-
-#define QT_METATYPE_SWICHER_CASE_QCLASS(TypeName, TypeId, Name)\
-    case QMetaType::TypeName: return logic.delegate(static_cast<const QT_PREPEND_NAMESPACE(Name) *>(data));
+#define QT_METATYPE_SWICHER_CASE(TypeName, TypeId, Name)\
+    case QMetaType::TypeName: return logic.delegate(static_cast<Name const *>(data));
 
 template<class ReturnType, class DelegateObject>
 ReturnType QMetaTypeSwitcher::switcher(DelegateObject &logic, int type, const void *data)
 {
     switch (QMetaType::Type(type)) {
-    QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_SWICHER_CASE_PRIMITIVE)
-    QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_SWICHER_CASE_PRIMITIVE_POINTER)
-    QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_SWICHER_CASE_POINTER)
-    QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_SWICHER_CASE_QCLASS)
-    QT_FOR_EACH_STATIC_CORE_TEMPLATE(QT_METATYPE_SWICHER_CASE_QCLASS)
-    QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_SWICHER_CASE_QCLASS)
-    QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_METATYPE_SWICHER_CASE_QCLASS)
+    QT_FOR_EACH_STATIC_TYPE(QT_METATYPE_SWICHER_CASE)
 
     default:
-        return logic.delegate(static_cast<const NotBuiltinType *>(data));
+        return logic.delegate(static_cast<NotBuiltinType const *>(data));
     }
 }
 
-#undef QT_METATYPE_SWICHER_CASE_PRIMITIVE
-#undef QT_METATYPE_SWICHER_CASE_PRIMITIVE_POINTER
-#undef QT_METATYPE_SWICHER_CASE_QCLASS
-#undef QT_METATYPE_SWICHER_CASE_POINTER
+#undef QT_METATYPE_SWICHER_CASE
 
 QT_END_NAMESPACE
 
index 708a427..a754bc4 100644 (file)
@@ -188,7 +188,7 @@ public:
     }
 
     bool delegate(const void*) { return true; }
-
+    bool delegate(const QMetaTypeSwitcher::NotBuiltinType*) { return false; }
 protected:
     const QVariant::Private *m_a;
     const QVariant::Private *m_b;
@@ -282,6 +282,7 @@ public:
     }
     // we need that as sizof(void) is undefined and it is needed in HasIsNullMethod
     bool delegate(const void *) { return m_d->is_null; }
+    bool delegate(const QMetaTypeSwitcher::NotBuiltinType *) { return m_d->is_null; }
 protected:
     const QVariant::Private *m_d;
 };