// 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::typeName(qMetaTypeId()); } 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: Invoker(QObject *target, const char *slot) { InvokerBase::invoke(target, slot); } template Invoker(QObject *target, const char *slot, const T0 &t0) { setReturnValue(result); addArgument(t0); InvokerBase::invoke(target, slot); } template Invoker(QObject *target, const char *slot, const T0 &t0, const T1 &t1) { setReturnValue(result); addArgument(t0); addArgument(t1); InvokerBase::invoke(target, slot); } template Invoker(QObject *target, const char *slot, const T0 &t0, const T1 &t1, const T2 &t2) { setReturnValue(result); addArgument(t0); addArgument(t1); addArgument(t2); InvokerBase::invoke(target, slot); } operator Result() const { return result; } private: Result result; }; template<> class Invoker : public InvokerBase { public: Invoker(QObject *target, const char *slot) { InvokerBase::invoke(target, slot); } template Invoker(QObject *target, const char *slot, const T0 &t0) { addArgument(t0); InvokerBase::invoke(target, slot); } template Invoker(QObject *target, const char *slot, const T0 &t0, const T1 &t1) { addArgument(t0); addArgument(t1); InvokerBase::invoke(target, slot); } template Invoker(QObject *target, const char *slot, const T0 &t0, const T1 &t1, const T2 &t2) { addArgument(t0); addArgument(t1); addArgument(t2); 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) { InvokerBase in; return invokeHelper(in, target, slot); } template Result invoke(QObject *target, const char *slot, const T0 &t0) { InvokerBase in; in.addArgument(t0); return invokeHelper(in, target, slot); } template Result invoke(QObject *target, const char *slot, const T0 &t0, const T1 &t1) { InvokerBase in; in.addArgument(t0); in.addArgument(t1); return invokeHelper(in, target, slot); } template Result invoke(QObject *target, const char *slot, const T0 &t0, const T1 &t1, const T2 &t2) { InvokerBase in; in.addArgument(t0); in.addArgument(t1); in.addArgument(t2); return invokeHelper(in, target, slot); } } // namespace ExtensionSystem