/**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #ifndef QXTBOUNDCFUNCTION_H #define QXTBOUNDCFUNCTION_H #include #include #include #include #ifndef QXT_DOXYGEN_RUN #define QXT_RETURN(fp) *reinterpret_cast(returnValue.data()) = (*reinterpret_cast(fp)) #define QXT_INVOKE(fp) (*reinterpret_cast(fp)) #define QXT_PARAM(i) *reinterpret_cast(p ## i .data()) template < typename RETURN, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void > class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9), QXT_PARAM(10)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7)); return true; } }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer { public: typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9); bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9)); return true; } private: qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template < typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void > class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9), QXT_PARAM(10)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template <> class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4, T5); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer { public: typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9); bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) { QXT_10_UNUSED; QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9)); return true; } private: qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {} }; template < typename RETURN = void, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void > class /*QXT_CORE_EXPORT*/ QxtBoundCFunction : public QxtBoundFunctionBase { public: QxtGenericFunctionPointer funcPtr; QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer) { // initializers only, thanks to template magic } virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument)) { if (type != Qt::AutoConnection && type != Qt::DirectConnection) { qWarning() << "QxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection"; return false; } return reinterpret_cast*>(&funcPtr)->invoke(returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } }; template class /*QXT_CORE_EXPORT*/ QxtBoundCFunction : public QxtBoundFunctionBase { public: QxtGenericFunctionPointer funcPtr; QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer) { // initializers only, thanks to template magic } virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument)) { Q_UNUSED(returnValue); if (type != Qt::AutoConnection && type != Qt::DirectConnection) { qWarning() << "QxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection"; return false; } return reinterpret_cast*>(&funcPtr)->invoke(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } }; #undef QXT_RETURN #undef QXT_INVOKE #undef QXT_PARAM #endif namespace QxtMetaObject { /*! * \relates QxtMetaObject * \sa QxtMetaObject::connect * \sa qxtFuncPtr * \sa QxtBoundFunction * \sa QXT_BIND * * Creates a binding to the provided C/C++ function using the provided parameter list. * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function. * Use the Q_ARG macro to specify constant parameters, or use the QXT_BIND macro to * relay a parameter from a connected signal or passed via the QxtBoundFunction::invoke() * method. * * The first template parameter must match the return type of the function, or * void if the function does not return a value. The remaining template parameters must * match the types of the function's parameters. If any type does not match, this * function returns NULL. * * The returned QxtBoundFunction will not have a parent. Assigning a parent using * QObject::setParent() is strongly recommended to avoid memory leaks. */ template QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QGenericArgument)) { // Make sure the template parameters make a function pointer equivalent to the one passed in if (funcPointer.typeName != typeid(typename qxt_cfunction_return::FUNCTION).name()) { qWarning() << "QxtMetaObject::bind: parameter list mismatch, check template arguments"; return 0; } QGenericArgument* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 }; for (int i = 0; i < 10; i++) { if (args[i]->name() == 0) break; // done if (QByteArray(args[i]->name()) == "QxtBoundArgument") { Q_ASSERT_X((quintptr)(args[i]->data()) > 0 && (quintptr)(args[i]->data()) <= 10, "QXT_BIND", "invalid argument number"); } } QByteArray types[10]; types[0] = QxtMetaType::name(); types[1] = QxtMetaType::name(); types[2] = QxtMetaType::name(); types[3] = QxtMetaType::name(); types[4] = QxtMetaType::name(); types[5] = QxtMetaType::name(); types[6] = QxtMetaType::name(); types[7] = QxtMetaType::name(); types[8] = QxtMetaType::name(); types[9] = QxtMetaType::name(); return new QxtBoundCFunction(0, funcPointer, args, types); } /*! * \relates QxtMetaObject * \sa QxtMetaObject::connect * \sa qxtFuncPtr * \sa QxtBoundFunction * * Creates a binding to the provided C/C++ function using the provided parameter list. * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function. * The type of each argument is deduced from the type of the QVariant. This function * cannot bind positional arguments; see the overload using QGenericArgument. * * The first template parameter must match the return type of the function, or * void if the function does not return a value. The remaining template parameters must * match the types of the function's parameters. If any type does not match, this * function returns NULL. * * The returned QxtBoundFunction will not have a parent. Assigning a parent using * QObject::setParent() is strongly recommended to avoid memory leaks. */ template QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QVariant)) { QVariant* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 }; return QxtMetaObject::bind(funcPointer, QXT_VAR_ARG(1), QXT_VAR_ARG(2), QXT_VAR_ARG(3), QXT_VAR_ARG(4), QXT_VAR_ARG(5), QXT_VAR_ARG(6), QXT_VAR_ARG(7), QXT_VAR_ARG(8), QXT_VAR_ARG(9), QXT_VAR_ARG(10)); } // The following overloads exist because C++ doesn't support default parameters in function templates #ifndef QXT_DOXYGEN_RUN template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer) { return bind(funcPointer, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1) { return bind(funcPointer, p1, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2) { return bind(funcPointer, p1, p2, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3) { return bind(funcPointer, p1, p2, p3, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4) { return bind(funcPointer, p1, p2, p3, p4, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5) { return bind(funcPointer, p1, p2, p3, p4, p5, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6, QGenericArgument p7) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, p7, QGenericArgument(), QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6, QGenericArgument p7, QGenericArgument p8) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QGenericArgument(), QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6, QGenericArgument p7, QGenericArgument p8, QGenericArgument p9) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QGenericArgument()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1) { return bind(funcPointer, p1, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2) { return bind(funcPointer, p1, p2, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3) { return bind(funcPointer, p1, p2, p3, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4) { return bind(funcPointer, p1, p2, p3, p4, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5) { return bind(funcPointer, p1, p2, p3, p4, p5, QVariant(), QVariant(), QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, QVariant(), QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, p7, QVariant(), QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QVariant(), QVariant()); } template inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8, QVariant p9) { return bind(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QVariant()); } #endif } #endif