// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "extensionsystem_global.h" #include #include #include #include namespace ExtensionSystem { class EXTENSIONSYSTEM_EXPORT InvokerBase { public: InvokerBase(); ~InvokerBase(); bool wasSuccessful() const; void setConnectionType(Qt::ConnectionType connectionType); template void addArgument(const T &t) { arg[lastArg++] = QGenericArgument(typeName(), &t); } template void setReturnValue(T &t) { useRet = true; ret = QGenericReturnArgument(typeName(), &t); } void invoke(QObject *target, const char *slot); private: InvokerBase(const InvokerBase &); // Unimplemented. template const char *typeName() { return QMetaType(qMetaTypeId()).name(); } QObject *target; QGenericArgument arg[10]; QGenericReturnArgument ret; QVarLengthArray sig; int lastArg; bool success; bool useRet; Qt::ConnectionType connectionType; mutable bool nag; }; template class Invoker : public InvokerBase { public: template Invoker(QObject *target, const char *slot, const Args &...args) { setReturnValue(result); (addArgument(args), ...); InvokerBase::invoke(target, slot); } operator Result() const { return result; } private: Result result; }; template<> class Invoker : public InvokerBase { public: template Invoker(QObject *target, const char *slot, const Args &...args) { (addArgument(args), ...); InvokerBase::invoke(target, slot); } }; #ifndef Q_QDOC template Result invokeHelper(InvokerBase &in, QObject *target, const char *slot) { Result result; in.setReturnValue(result); in.invoke(target, slot); return result; } template <> inline void invokeHelper(InvokerBase &in, QObject *target, const char *slot) { in.invoke(target, slot); } #endif template Result invoke(QObject *target, const char *slot, const Args &...args) { InvokerBase in; (in.addArgument(args), ...); return invokeHelper(in, target, slot); } } // namespace ExtensionSystem