/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (info@qt.nokia.com) ** ** ** GNU Lesser General Public License Usage ** ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this file. ** Please review the following information to ensure the GNU Lesser General ** Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** Other Usage ** ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** **************************************************************************/ #ifndef EXTENSIONSYSTEM_INVOKER_H #define EXTENSIONSYSTEM_INVOKER_H #include "extensionsystem_global.h" #include #include #include #include namespace ExtensionSystem { class EXTENSIONSYSTEM_EXPORT InvokerBase { public: InvokerBase(); ~InvokerBase(); bool wasSuccessful() const; 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; 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 #endif // EXTENSIONSYSTEM_INVOKER_H