Mercurial > projects > qtd
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(); +} +