diff cpp/qt_qtd/qtd_core.cpp @ 355:08c1ca7975ab

obviated redundant virtual dispatch callbacks
author Max Samukha <maxter@spambox.com>
date Tue, 25 May 2010 17:23:11 +0300
parents 18bd68f586c6
children 9784459f0750
line wrap: on
line diff
--- a/cpp/qt_qtd/qtd_core.cpp	Mon May 24 23:43:30 2010 +0300
+++ b/cpp/qt_qtd/qtd_core.cpp	Tue May 25 17:23:11 2010 +0300
@@ -12,6 +12,8 @@
 #include "qtd_core.h"
 #include <iostream>
 
+uint userDataId;
+
 extern "C" DLL_PUBLIC QModelIndex qtd_to_QModelIndex(QModelIndexAccessor mia)
 {
     return * (QModelIndex *) (&mia) ;
@@ -47,6 +49,8 @@
 extern "C" DLL_PUBLIC void qtd_core_initCallBacks(pfunc_abstr d_func, pfunc_abstr del_d_qobj) {
     QTD_EXPORT_VAR_SET(qtd_toUtf8, d_func);
     QTD_EXPORT_VAR_SET(qtd_QtdObject_delete, del_d_qobj);
+
+    userDataId = QObject::registerUserData();
 }
 #endif
 
@@ -67,3 +71,48 @@
 {
     return qUnregisterResourceData(version, tree, name, data);
 }
+
+//
+// QObjectLink implementation
+//
+
+QObjectLink::QObjectLink(QObject *qObject, void* dId) :
+    QtdObjectLink(dId),
+    flags(None)
+{
+    qObject->setUserData(userDataId, this);
+}
+
+QObjectLink* QObjectLink::getLink(const QObject *qObject)
+{
+    return static_cast<QObjectLink*>(qObject->userData(userDataId));
+}
+
+void* QObjectLink::getDId(const QObject* qObject)
+{
+    QObjectLink* link = getLink(qObject);
+    return link ? link->dId : NULL;
+}
+
+void QObjectLink::destroyLink(QObject* qObject)
+{
+    Q_ASSERT(dId);
+    qtd_QtdObject_delete(dId);
+    if (qObject)
+    {
+        qObject->setUserData(userDataId, NULL);
+        dId = NULL;
+    }
+}
+
+bool QObjectLink::createdByD()
+{
+    return CreatedByD & flags;
+}
+
+QObjectLink::~QObjectLink()
+{
+    if (dId)
+        destroyLink();
+}
+