From 8ff60214bc3b1b4f790399a8e285b4fa4ccfe4b1 Mon Sep 17 00:00:00 2001 From: Filippo Cucchetto Date: Sun, 7 Oct 2018 17:31:33 +0200 Subject: [PATCH] Started semplification refactor --- lib/CMakeLists.txt | 2 - .../DOtherSide/DosQAbstractItemModel.h | 4 +- lib/include/DOtherSide/DosQObject.h | 3 +- lib/include/DOtherSide/DosQObjectImpl.h | 14 ++++--- .../DOtherSide/OnSlotExecutedHandler.h | 24 ------------ lib/src/DOtherSide.cpp | 12 +++--- lib/src/DosQAbstractItemModel.cpp | 6 +-- lib/src/DosQObject.cpp | 4 +- lib/src/DosQObjectImpl.cpp | 39 +++++++++++++++---- lib/src/OnSlotExecutedHandler.cpp | 34 ---------------- 10 files changed, 54 insertions(+), 88 deletions(-) delete mode 100644 lib/include/DOtherSide/OnSlotExecutedHandler.h delete mode 100644 lib/src/OnSlotExecutedHandler.cpp diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 3e14ac2..76aa89d 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -24,7 +24,6 @@ set(HEADERS_LIST include/DOtherSide/DosQObject.h include/DOtherSide/DosQObjectImpl.h include/DOtherSide/DosIQObjectImpl.h - include/DOtherSide/OnSlotExecutedHandler.h include/DOtherSide/DosQMetaObject.h include/DOtherSide/DosIQAbstractItemModelImpl.h include/DOtherSide/DosQAbstractItemModel.h @@ -33,7 +32,6 @@ set(HEADERS_LIST set(SRC_LIST src/DOtherSide.cpp - src/OnSlotExecutedHandler.cpp src/DosQMetaObject.cpp src/DosQDeclarative.cpp src/DosQObject.cpp diff --git a/lib/include/DOtherSide/DosQAbstractItemModel.h b/lib/include/DOtherSide/DosQAbstractItemModel.h index ec51ea7..4ef0a35 100644 --- a/lib/include/DOtherSide/DosQAbstractItemModel.h +++ b/lib/include/DOtherSide/DosQAbstractItemModel.h @@ -7,8 +7,8 @@ // DOtherSide #include "DOtherSide/DOtherSideTypes.h" +#include "DOtherSide/DosQMetaObject.h" #include "DOtherSide/DosIQAbstractItemModelImpl.h" -#include "DOtherSide/OnSlotExecutedHandler.h" namespace DOS { @@ -19,7 +19,7 @@ public: /// Constructor DosQAbstractGenericModel(void *modelObject, DosIQMetaObjectPtr metaObject, - OnSlotExecuted onSlotExecuted, + DObjectCallback dObjectCallback, DosQAbstractItemModelCallbacks callbacks); /// @see IDynamicQObject::emitSignal diff --git a/lib/include/DOtherSide/DosQObject.h b/lib/include/DOtherSide/DosQObject.h index 97c3044..86057aa 100644 --- a/lib/include/DOtherSide/DosQObject.h +++ b/lib/include/DOtherSide/DosQObject.h @@ -14,8 +14,7 @@ class DosQObject : public QObject, public DosIQObjectImpl { public: /// Constructor - DosQObject(DosIQMetaObjectPtr metaObject, - OnSlotExecuted onSlotExecuted); + DosQObject(void *dObjectPointer, DosIQMetaObjectPtr metaObject, DObjectCallback dObjectCallback); /// Emit a signal bool emitSignal(QObject *emitter, const QString &name, const std::vector &arguments) override; diff --git a/lib/include/DOtherSide/DosQObjectImpl.h b/lib/include/DOtherSide/DosQObjectImpl.h index 2d48220..37008fc 100644 --- a/lib/include/DOtherSide/DosQObjectImpl.h +++ b/lib/include/DOtherSide/DosQObjectImpl.h @@ -20,10 +20,10 @@ public: using ParentMetaCall = std::function; /// Constructor - DosQObjectImpl(QObject *parent, - ParentMetaCall parentMetaCall, + DosQObjectImpl(ParentMetaCall parentMetaCall, std::shared_ptr metaObject, - OnSlotExecuted onSlotExecuted); + void *dObjectPointer, + DObjectCallback dObjectCallback); /// @see IDosQObject::emitSignal @@ -38,13 +38,15 @@ public: private: bool executeSlot(const QMetaMethod &method, void **args, int argumentsOffset = 1); bool executeSlot(int index, void **args); + QVariant executeSlot(const QString &name, const std::vector &args); + bool readProperty(int index, void **args); bool writeProperty(int index, void **args); - QObject *m_parent; const ParentMetaCall m_parentMetaCall; - const OnSlotExecuted m_onSlotExecuted; - mutable std::shared_ptr m_metaObject; + const std::shared_ptr m_metaObject; + void* const m_dObjectPointer = nullptr; + const DObjectCallback m_dObjectCallback; }; } // namespace DOS diff --git a/lib/include/DOtherSide/OnSlotExecutedHandler.h b/lib/include/DOtherSide/OnSlotExecutedHandler.h deleted file mode 100644 index 31823fc..0000000 --- a/lib/include/DOtherSide/OnSlotExecutedHandler.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -// std -#include -// Qt -#include -// DOtherSide -#include "DOtherSide/DOtherSideTypesCpp.h" - -namespace DOS { - -class OnSlotExecutedHandler -{ -public: - OnSlotExecutedHandler(void *dObjectPointer, DObjectCallback dObjectCallback); - - QVariant operator()(const QString &name, const std::vector &args); - -private: - void *m_dObjectPointer; - DObjectCallback m_dObjectCallback; -}; - -} // namespace DOS diff --git a/lib/src/DOtherSide.cpp b/lib/src/DOtherSide.cpp index abe7c87..32a118c 100644 --- a/lib/src/DOtherSide.cpp +++ b/lib/src/DOtherSide.cpp @@ -18,7 +18,6 @@ #include #include "DOtherSide/DOtherSideTypesCpp.h" -#include "DOtherSide/OnSlotExecutedHandler.h" #include "DOtherSide/DosQMetaObject.h" #include "DOtherSide/DosQObject.h" #include "DOtherSide/DosQObjectImpl.h" @@ -27,10 +26,12 @@ #include "DOtherSide/DosQQuickImageProvider.h" namespace { + void register_meta_types() { qRegisterMetaType>(); } + } char *convert_to_cstring(const QByteArray &array) @@ -477,8 +478,7 @@ void dos_qvariant_setArray(::DosQVariant *vptr, int size, ::DosQVariant **array) ::DosQObject *dos_qobject_create(void *dObjectPointer, ::DosQMetaObject *metaObject, ::DObjectCallback dObjectCallback) { auto metaObjectHolder = static_cast(metaObject); - auto dosQObject = new DOS::DosQObject(metaObjectHolder->data(), - DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback)); + auto dosQObject = new DOS::DosQObject(dObjectPointer, metaObjectHolder->data(), dObjectCallback); QQmlEngine::setObjectOwnership(dosQObject, QQmlEngine::CppOwnership); return static_cast(dosQObject); } @@ -718,7 +718,7 @@ void dos_qmetaobject_delete(::DosQMetaObject *vptr) auto metaObjectHolder = static_cast(metaObjectPointer); auto model = new DOS::DosQAbstractTableModel(dObjectPointer, metaObjectHolder->data(), - DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback), + dObjectCallback, *callbacks); QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership); return static_cast(model); @@ -755,7 +755,7 @@ DosQModelIndex *dos_qabstracttablemodel_parent(DosQAbstractTableModel *vptr, Dos auto metaObjectHolder = static_cast(metaObjectPointer); auto model = new DOS::DosQAbstractListModel(dObjectPointer, metaObjectHolder->data(), - DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback), + dObjectCallback, *callbacks); QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership); return static_cast(model); @@ -800,7 +800,7 @@ int dos_qabstractlistmodel_columnCount(DosQAbstractListModel *vptr, DosQModelInd auto metaObjectHolder = static_cast(metaObjectPointer); auto model = new DOS::DosQAbstractItemModel(dObjectPointer, metaObjectHolder->data(), - DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback), + dObjectCallback, *callbacks); QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership); return static_cast(model); diff --git a/lib/src/DosQAbstractItemModel.cpp b/lib/src/DosQAbstractItemModel.cpp index 22ab72a..c25f441 100644 --- a/lib/src/DosQAbstractItemModel.cpp +++ b/lib/src/DosQAbstractItemModel.cpp @@ -18,10 +18,10 @@ namespace DOS { template DosQAbstractGenericModel::DosQAbstractGenericModel(void *modelObject, DosIQMetaObjectPtr metaObject, - OnSlotExecuted onSlotExecuted, + DObjectCallback dObjectCallback, DosQAbstractItemModelCallbacks callbacks) - : m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted))) - , m_modelObject(std::move(modelObject)) + : m_impl(new DosQObjectImpl(::createParentMetaCall(this), std::move(metaObject), modelObject, dObjectCallback)) + , m_modelObject(modelObject) , m_callbacks(callbacks) {} diff --git a/lib/src/DosQObject.cpp b/lib/src/DosQObject.cpp index 6ca2180..e4407b7 100644 --- a/lib/src/DosQObject.cpp +++ b/lib/src/DosQObject.cpp @@ -13,8 +13,8 @@ DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(QObject *parent) namespace DOS { -DosQObject::DosQObject(DosIQMetaObjectPtr metaObject, OnSlotExecuted onSlotExecuted) - : m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted))) +DosQObject::DosQObject(void *dObjectPointer, DosIQMetaObjectPtr metaObject, DObjectCallback dObjectCallback) + : m_impl(new DosQObjectImpl(::createParentMetaCall(this), std::move(metaObject), dObjectPointer, dObjectCallback)) {} bool DosQObject::emitSignal(QObject *emitter, const QString &name, const std::vector &args) diff --git a/lib/src/DosQObjectImpl.cpp b/lib/src/DosQObjectImpl.cpp index ab1ca14..2163fc1 100644 --- a/lib/src/DosQObjectImpl.cpp +++ b/lib/src/DosQObjectImpl.cpp @@ -1,19 +1,21 @@ #include "DOtherSide/DosQObjectImpl.h" + #include "DOtherSide/DosQMetaObject.h" + #include #include #include namespace DOS { -DosQObjectImpl::DosQObjectImpl(QObject *parent, - ParentMetaCall parentMetaCall, +DosQObjectImpl::DosQObjectImpl(ParentMetaCall parentMetaCall, std::shared_ptr metaObject, - OnSlotExecuted onSlotExecuted) - : m_parent(std::move(parent)) - , m_parentMetaCall(std::move(parentMetaCall)) - , m_onSlotExecuted(std::move(onSlotExecuted)) + void *dObjectPointer, + DObjectCallback dObjectCallback) + : m_parentMetaCall(std::move(parentMetaCall)) , m_metaObject(std::move(metaObject)) + , m_dObjectPointer(dObjectPointer) + , m_dObjectCallback(dObjectCallback) { } @@ -83,7 +85,7 @@ bool DosQObjectImpl::executeSlot(const QMetaMethod &method, void **args, int arg arguments.emplace_back(std::move(argument)); } - const QVariant result = m_onSlotExecuted(method.name(), arguments); // Execute method + const QVariant result = executeSlot(method.name(), arguments); // Execute method if (hasReturnType && result.isValid()) { QMetaType::construct(method.returnType(), args[0], result.constData()); @@ -92,6 +94,29 @@ bool DosQObjectImpl::executeSlot(const QMetaMethod &method, void **args, int arg return true; } +QVariant DosQObjectImpl::executeSlot(const QString &name, const std::vector &args) +{ + QVariant result; + + if (!m_dObjectCallback || !m_dObjectPointer) + return result; + + // prepare slot name + QVariant slotName(name); + + // prepare void* for the QVariants + std::vector argumentsAsVoidPointers; + argumentsAsVoidPointers.reserve(args.size() + 1); + argumentsAsVoidPointers.emplace_back(&result); + for (size_t i = 0; i < args.size(); ++i) + argumentsAsVoidPointers.emplace_back((void *)(&args[i])); + + // send them to the binding handler + m_dObjectCallback(m_dObjectPointer, &slotName, argumentsAsVoidPointers.size(), &argumentsAsVoidPointers[0]); + + return result; +} + bool DosQObjectImpl::readProperty(int index, void **args) { const QMetaObject *const mo = metaObject(); diff --git a/lib/src/OnSlotExecutedHandler.cpp b/lib/src/OnSlotExecutedHandler.cpp deleted file mode 100644 index 46026a2..0000000 --- a/lib/src/OnSlotExecutedHandler.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "DOtherSide/OnSlotExecutedHandler.h" - -namespace DOS { - -OnSlotExecutedHandler::OnSlotExecutedHandler(void *dObjectPointer, - DObjectCallback dObjectCallback) - : m_dObjectPointer(dObjectPointer) - , m_dObjectCallback(dObjectCallback) -{} - -QVariant OnSlotExecutedHandler::operator()(const QString &name, const std::vector &args) -{ - QVariant result; - - if (!m_dObjectCallback || !m_dObjectPointer) - return result; - - // prepare slot name - QVariant slotName(name); - - // prepare void* for the QVariants - std::vector argumentsAsVoidPointers; - argumentsAsVoidPointers.reserve(args.size() + 1); - argumentsAsVoidPointers.emplace_back(&result); - for (size_t i = 0; i < args.size(); ++i) - argumentsAsVoidPointers.emplace_back((void *)(&args[i])); - - // send them to the binding handler - m_dObjectCallback(m_dObjectPointer, &slotName, argumentsAsVoidPointers.size(), &argumentsAsVoidPointers[0]); - - return result; -} - -} // namespace DOS