1 /****************************************************************************
3 ** Copyright (C) Qxt Foundation. Some rights reserved.
5 ** This file is part of the QxtCore module of the Qt eXTension library
7 ** This library is free software; you can redistribute it and/or modify it
8 ** under the terms of th Common Public License, version 1.0, as published by
11 ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
12 ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
13 ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
14 ** FITNESS FOR A PARTICULAR PURPOSE.
16 ** You should have received a copy of the CPL along with this file.
17 ** See the LICENSE file and the cpl1.0.txt file included with the source
18 ** distribution for more information. If you did not receive a copy of the
19 ** license, contact the Qxt Foundation.
21 ** <http://libqxt.sourceforge.net> <foundation@libqxt.org>
23 ****************************************************************************/
25 #ifndef QXTBOUNDCFUNCTION_H
26 #define QXTBOUNDCFUNCTION_H
28 #include <qxtboundfunctionbase.h>
29 #include <qxtmetatype.h>
32 #ifndef QXT_DOXYGEN_RUN
34 #define QXT_RETURN(fp) *reinterpret_cast<RETURN*>(returnValue.data()) = (*reinterpret_cast<FUNCTION>(fp))
35 #define QXT_INVOKE(fp) (*reinterpret_cast<FUNCTION>(fp))
36 #define QXT_PARAM(i) *reinterpret_cast<T ## i *>(p ## i .data())
38 template <typename RETURN, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,
39 typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void>
40 class qxt_cfunction_return : public QxtGenericFunctionPointer {
42 typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
43 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
45 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));
50 template <typename RETURN>
51 class qxt_cfunction_return<RETURN, void, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
53 typedef RETURN(*FUNCTION)();
54 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
56 QXT_RETURN (funcPtr)();
61 template <typename RETURN, typename T1>
62 class qxt_cfunction_return<RETURN, T1, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
64 typedef RETURN(*FUNCTION)(T1);
65 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
67 QXT_RETURN (funcPtr)(QXT_PARAM(1));
72 template <typename RETURN, typename T1, typename T2>
73 class qxt_cfunction_return<RETURN, T1, T2, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
75 typedef RETURN(*FUNCTION)(T1, T2);
76 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
78 QXT_RETURN (funcPtr)(QXT_PARAM(1), QXT_PARAM(2));
83 template <typename RETURN, typename T1, typename T2, typename T3>
84 class qxt_cfunction_return<RETURN, T1, T2, T3, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
86 typedef RETURN(*FUNCTION)(T1, T2, T3);
87 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
89 QXT_RETURN (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3));
94 template <typename RETURN, typename T1, typename T2, typename T3, typename T4>
95 class qxt_cfunction_return<RETURN, T1, T2, T3, T4, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
97 typedef RETURN(*FUNCTION)(T1, T2, T3, T4);
98 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
100 QXT_RETURN (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4));
105 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>
106 class qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void> : public QxtGenericFunctionPointer {
108 typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5);
109 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
111 QXT_RETURN (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5));
116 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
117 class qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void> : public QxtGenericFunctionPointer {
119 typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6);
120 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
122 QXT_RETURN (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6));
127 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
128 class qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void> : public QxtGenericFunctionPointer {
130 typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7);
131 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
133 QXT_RETURN (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7));
138 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
139 class qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void> : public QxtGenericFunctionPointer {
141 typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8);
142 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
144 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));
149 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
150 class qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void> : public QxtGenericFunctionPointer {
152 typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9);
153 bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) {
155 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));
160 template <typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,
161 typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void>
162 class qxt_cfunction : public QxtGenericFunctionPointer {
164 typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
165 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
167 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));
173 class qxt_cfunction<void, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
175 typedef void(*FUNCTION)();
176 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
178 QXT_INVOKE (funcPtr)();
183 template <typename T1>
184 class qxt_cfunction<T1, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
186 typedef void(*FUNCTION)(T1);
187 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
189 QXT_INVOKE (funcPtr)(QXT_PARAM(1));
194 template <typename T1, typename T2>
195 class qxt_cfunction<T1, T2, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
197 typedef void(*FUNCTION)(T1, T2);
198 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
200 QXT_INVOKE (funcPtr)(QXT_PARAM(1), QXT_PARAM(2));
205 template <typename T1, typename T2, typename T3>
206 class qxt_cfunction<T1, T2, T3, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
208 typedef void(*FUNCTION)(T1, T2, T3);
209 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
211 QXT_INVOKE (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3));
216 template <typename T1, typename T2, typename T3, typename T4>
217 class qxt_cfunction<T1, T2, T3, T4, void, void, void, void, void, void> : public QxtGenericFunctionPointer {
219 typedef void(*FUNCTION)(T1, T2, T3, T4);
220 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
222 QXT_INVOKE (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4));
227 template <typename T1, typename T2, typename T3, typename T4, typename T5>
228 class qxt_cfunction<T1, T2, T3, T4, T5, void, void, void, void, void> : public QxtGenericFunctionPointer {
230 typedef void(*FUNCTION)(T1, T2, T3, T4, T5);
231 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
233 QXT_INVOKE (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5));
238 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
239 class qxt_cfunction<T1, T2, T3, T4, T5, T6, void, void, void, void> : public QxtGenericFunctionPointer {
241 typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6);
242 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
244 QXT_INVOKE (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6));
249 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
250 class qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, void, void, void> : public QxtGenericFunctionPointer {
252 typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7);
253 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
255 QXT_INVOKE (funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7));
260 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
261 class qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, void, void> : public QxtGenericFunctionPointer {
263 typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8);
264 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
266 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));
271 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
272 class qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, T9, void> : public QxtGenericFunctionPointer {
274 typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9);
275 bool invoke(QXT_PROTO_10ARGS(QGenericArgument)) {
277 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));
282 template <typename RETURN = void, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,
283 typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void>
284 class QxtBoundCFunction : public QxtBoundFunctionBase {
286 QxtGenericFunctionPointer funcPtr;
288 QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer) {
289 // initializers only, thanks to template magic
292 virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument)) {
293 if(type != Qt::AutoConnection && type != Qt::DirectConnection) {
294 qWarning() << "WxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection";
297 return reinterpret_cast<qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>*>(&funcPtr)->invoke(returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
301 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
302 class QxtBoundCFunction<void, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : public QxtBoundFunctionBase {
304 QxtGenericFunctionPointer funcPtr;
306 QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer) {
307 // initializers only, thanks to template magic
310 virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument)) {
311 Q_UNUSED(returnValue);
312 if(type != Qt::AutoConnection && type != Qt::DirectConnection) {
313 qWarning() << "WxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection";
316 return reinterpret_cast<qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>*>(&funcPtr)->invoke(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
325 namespace QxtMetaObject {
327 * \relates QxtMetaObject
328 * \sa QxtMetaObject::connect
330 * \sa QxtBoundFunction
333 * Creates a binding to the provided C/C++ function using the provided parameter list.
334 * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function.
335 * Use the Q_ARG macro to specify constant parameters, or use the QXT_BIND macro to
336 * relay a parameter from a connected signal or passed via the QxtBoundFunction::invoke()
339 * The first template parameter must match the return type of the function, or
340 * void if the function does not return a value. The remaining template parameters must
341 * match the types of the function's parameters. If any type does not match, this
342 * function returns NULL.
344 * The returned QxtBoundFunction will not have a parent. Assigning a parent using
345 * QObject::setParent() is strongly recommended to avoid memory leaks.
347 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
348 QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QGenericArgument)) {
349 // Make sure the template parameters make a function pointer equivalent to the one passed in
350 if(funcPointer.typeName != typeid(typename qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::FUNCTION).name()) {
351 qWarning() << "QxtMetaObject::bind: parameter list mismatch, check template arguments";
355 QGenericArgument* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };
356 for (int i=0; i<10; i++)
358 if (args[i]->name() == 0) break; // done
359 if (QByteArray(args[i]->name()) == "QxtBoundArgument")
361 Q_ASSERT_X((quintptr)(args[i]->data()) > 0 && (quintptr)(args[i]->data()) <= 10, "QXT_BIND", "invalid argument number");
365 QByteArray types[10];
366 types[0] = QxtMetaType<T1>::name();
367 types[1] = QxtMetaType<T2>::name();
368 types[2] = QxtMetaType<T3>::name();
369 types[3] = QxtMetaType<T4>::name();
370 types[4] = QxtMetaType<T5>::name();
371 types[5] = QxtMetaType<T6>::name();
372 types[6] = QxtMetaType<T7>::name();
373 types[7] = QxtMetaType<T8>::name();
374 types[8] = QxtMetaType<T9>::name();
375 types[9] = QxtMetaType<T10>::name();
377 return new QxtBoundCFunction<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(0, funcPointer, args, types);
381 * \relates QxtMetaObject
382 * \sa QxtMetaObject::connect
384 * \sa QxtBoundFunction
386 * Creates a binding to the provided C/C++ function using the provided parameter list.
387 * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function.
388 * The type of each argument is deduced from the type of the QVariant. This function
389 * cannot bind positional arguments; see the overload using QGenericArgument.
391 * The first template parameter must match the return type of the function, or
392 * void if the function does not return a value. The remaining template parameters must
393 * match the types of the function's parameters. If any type does not match, this
394 * function returns NULL.
396 * The returned QxtBoundFunction will not have a parent. Assigning a parent using
397 * QObject::setParent() is strongly recommended to avoid memory leaks.
399 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
400 QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QVariant)) {
401 QVariant* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };
402 return QxtMetaObject::bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(funcPointer, QXT_VAR_ARG(1), QXT_VAR_ARG(2), QXT_VAR_ARG(3), QXT_VAR_ARG(4),
403 QXT_VAR_ARG(5), QXT_VAR_ARG(6), QXT_VAR_ARG(7), QXT_VAR_ARG(8), QXT_VAR_ARG(9), QXT_VAR_ARG(10));
406 // The following overloads exist because C++ doesn't support default parameters in function templates
407 #ifndef QXT_DOXYGEN_RUN
408 template <typename RETURN>
409 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer) {
410 return bind<RETURN, void, void, void, void, void, void, void, void, void, void>(funcPointer,
411 QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
414 template <typename RETURN, typename T1>
415 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1) {
416 return bind<RETURN, T1, void, void, void, void, void, void, void, void, void>(funcPointer,
417 p1, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
420 template <typename RETURN, typename T1, typename T2>
421 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2) {
422 return bind<RETURN, T1, T2, void, void, void, void, void, void, void, void>(funcPointer,
423 p1, p2, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
426 template <typename RETURN, typename T1, typename T2, typename T3>
427 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3) {
428 return bind<RETURN, T1, T2, T3, void, void, void, void, void, void, void>(funcPointer,
429 p1, p2, p3, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
432 template <typename RETURN, typename T1, typename T2, typename T3, typename T4>
433 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4) {
434 return bind<RETURN, T1, T2, T3, T4, void, void, void, void, void, void>(funcPointer,
435 p1, p2, p3, p4, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
438 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>
439 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5) {
440 return bind<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void>(funcPointer,
441 p1, p2, p3, p4, p5, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
444 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
445 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6) {
446 return bind<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void>(funcPointer,
447 p1, p2, p3, p4, p5, p6, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
450 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
451 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6, QGenericArgument p7) {
452 return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void>(funcPointer,
453 p1, p2, p3, p4, p5, p6, p7, QGenericArgument(), QGenericArgument(), QGenericArgument());
456 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
457 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5,
458 QGenericArgument p6, QGenericArgument p7, QGenericArgument p8) {
459 return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QGenericArgument(), QGenericArgument());
462 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
463 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5,
464 QGenericArgument p6, QGenericArgument p7, QGenericArgument p8, QGenericArgument p9) {
465 return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QGenericArgument());
468 template <typename RETURN, typename T1>
469 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1) {
470 return bind<RETURN, T1, void, void, void, void, void, void, void, void, void>(funcPointer, p1, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
473 template <typename RETURN, typename T1, typename T2>
474 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2) {
475 return bind<RETURN, T1, T2, void, void, void, void, void, void, void, void>(funcPointer, p1, p2, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
478 template <typename RETURN, typename T1, typename T2, typename T3>
479 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3) {
480 return bind<RETURN, T1, T2, T3, void, void, void, void, void, void, void>(funcPointer, p1, p2, p3, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
483 template <typename RETURN, typename T1, typename T2, typename T3, typename T4>
484 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4) {
485 return bind<RETURN, T1, T2, T3, T4, void, void, void, void, void, void>(funcPointer, p1, p2, p3, p4, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
488 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>
489 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5) {
490 return bind<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void>(funcPointer, p1, p2, p3, p4, p5, QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
493 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
494 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6) {
495 return bind<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, QVariant(), QVariant(), QVariant(), QVariant());
498 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
499 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7) {
500 return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, QVariant(), QVariant(), QVariant());
503 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
504 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8) {
505 return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QVariant(), QVariant());
508 template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
509 inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8, QVariant p9) {
510 return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QVariant());