/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #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); } }; 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); } 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