/thirdparty/qxt/qxtweb-standalone/qxtweb/qxtboundcfunction.h

http://github.com/tomahawk-player/tomahawk · C Header · 633 lines · 508 code · 57 blank · 68 comment · 16 complexity · 968fedbacad19249c0db6f9a2f966855 MD5 · raw file

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) Qxt Foundation. Some rights reserved.
  4. **
  5. ** This file is part of the QxtCore module of the Qxt library.
  6. **
  7. ** This library is free software; you can redistribute it and/or modify it
  8. ** under the terms of the Common Public License, version 1.0, as published
  9. ** by IBM, and/or under the terms of the GNU Lesser General Public License,
  10. ** version 2.1, as published by the Free Software Foundation.
  11. **
  12. ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
  13. ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
  14. ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
  15. ** FITNESS FOR A PARTICULAR PURPOSE.
  16. **
  17. ** You should have received a copy of the CPL and the LGPL along with this
  18. ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
  19. ** included with the source distribution for more information.
  20. ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
  21. **
  22. ** <http://libqxt.org> <foundation@libqxt.org>
  23. **
  24. ****************************************************************************/
  25. #ifndef QXTBOUNDCFUNCTION_H
  26. #define QXTBOUNDCFUNCTION_H
  27. #include <qxtboundfunctionbase.h>
  28. #include <qxtmetatype.h>
  29. #include <qxtglobal.h>
  30. #include <QtDebug>
  31. #ifndef QXT_DOXYGEN_RUN
  32. #define QXT_RETURN(fp) *reinterpret_cast<RETURN*>(returnValue.data()) = (*reinterpret_cast<FUNCTION>(fp))
  33. #define QXT_INVOKE(fp) (*reinterpret_cast<FUNCTION>(fp))
  34. #define QXT_PARAM(i) *reinterpret_cast<T ## i *>(p ## i .data())
  35. template < typename RETURN, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,
  36. typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void >
  37. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer
  38. {
  39. public:
  40. typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
  41. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  42. {
  43. QXT_10_UNUSED;
  44. 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));
  45. return true;
  46. }
  47. private:
  48. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  49. };
  50. template <typename RETURN>
  51. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, void, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  52. {
  53. public:
  54. typedef RETURN(*FUNCTION)();
  55. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  56. {
  57. QXT_10_UNUSED;
  58. QXT_RETURN(funcPtr)();
  59. return true;
  60. }
  61. private:
  62. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  63. };
  64. template <typename RETURN, typename T1>
  65. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  66. {
  67. public:
  68. typedef RETURN(*FUNCTION)(T1);
  69. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  70. {
  71. QXT_10_UNUSED;
  72. QXT_RETURN(funcPtr)(QXT_PARAM(1));
  73. return true;
  74. }
  75. private:
  76. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  77. };
  78. template <typename RETURN, typename T1, typename T2>
  79. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  80. {
  81. public:
  82. typedef RETURN(*FUNCTION)(T1, T2);
  83. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  84. {
  85. QXT_10_UNUSED;
  86. QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2));
  87. return true;
  88. }
  89. private:
  90. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  91. };
  92. template <typename RETURN, typename T1, typename T2, typename T3>
  93. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  94. {
  95. public:
  96. typedef RETURN(*FUNCTION)(T1, T2, T3);
  97. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  98. {
  99. QXT_10_UNUSED;
  100. QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3));
  101. return true;
  102. }
  103. private:
  104. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  105. };
  106. template <typename RETURN, typename T1, typename T2, typename T3, typename T4>
  107. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  108. {
  109. public:
  110. typedef RETURN(*FUNCTION)(T1, T2, T3, T4);
  111. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  112. {
  113. QXT_10_UNUSED;
  114. QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4));
  115. return true;
  116. }
  117. private:
  118. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  119. };
  120. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>
  121. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void> : public QxtGenericFunctionPointer
  122. {
  123. public:
  124. typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5);
  125. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  126. {
  127. QXT_10_UNUSED;
  128. QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5));
  129. return true;
  130. }
  131. private:
  132. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  133. };
  134. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
  135. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void> : public QxtGenericFunctionPointer
  136. {
  137. public:
  138. typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6);
  139. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  140. {
  141. QXT_10_UNUSED;
  142. QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6));
  143. return true;
  144. }
  145. private:
  146. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  147. };
  148. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
  149. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void> : public QxtGenericFunctionPointer
  150. {
  151. public:
  152. typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7);
  153. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  154. {
  155. QXT_10_UNUSED;
  156. QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7));
  157. return true;
  158. }
  159. };
  160. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
  161. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void> : public QxtGenericFunctionPointer
  162. {
  163. public:
  164. typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8);
  165. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  166. {
  167. QXT_10_UNUSED;
  168. 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));
  169. return true;
  170. }
  171. private:
  172. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  173. };
  174. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  175. class /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void> : public QxtGenericFunctionPointer
  176. {
  177. public:
  178. typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9);
  179. bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))
  180. {
  181. QXT_10_UNUSED;
  182. 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));
  183. return true;
  184. }
  185. private:
  186. qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  187. };
  188. template < typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,
  189. typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void >
  190. class /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer
  191. {
  192. public:
  193. typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
  194. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  195. {
  196. QXT_10_UNUSED;
  197. 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));
  198. return true;
  199. }
  200. private:
  201. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  202. };
  203. template <>
  204. class /*QXT_CORE_EXPORT*/ qxt_cfunction<void, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  205. {
  206. public:
  207. typedef void(*FUNCTION)();
  208. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  209. {
  210. QXT_10_UNUSED;
  211. QXT_INVOKE(funcPtr)();
  212. return true;
  213. }
  214. private:
  215. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  216. };
  217. template <typename T1>
  218. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  219. {
  220. public:
  221. typedef void(*FUNCTION)(T1);
  222. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  223. {
  224. QXT_10_UNUSED;
  225. QXT_INVOKE(funcPtr)(QXT_PARAM(1));
  226. return true;
  227. }
  228. private:
  229. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  230. };
  231. template <typename T1, typename T2>
  232. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  233. {
  234. public:
  235. typedef void(*FUNCTION)(T1, T2);
  236. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  237. {
  238. QXT_10_UNUSED;
  239. QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2));
  240. return true;
  241. }
  242. private:
  243. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  244. };
  245. template <typename T1, typename T2, typename T3>
  246. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  247. {
  248. public:
  249. typedef void(*FUNCTION)(T1, T2, T3);
  250. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  251. {
  252. QXT_10_UNUSED;
  253. QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3));
  254. return true;
  255. }
  256. private:
  257. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  258. };
  259. template <typename T1, typename T2, typename T3, typename T4>
  260. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, void, void, void, void, void, void> : public QxtGenericFunctionPointer
  261. {
  262. public:
  263. typedef void(*FUNCTION)(T1, T2, T3, T4);
  264. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  265. {
  266. QXT_10_UNUSED;
  267. QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4));
  268. return true;
  269. }
  270. private:
  271. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  272. };
  273. template <typename T1, typename T2, typename T3, typename T4, typename T5>
  274. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, void, void, void, void, void> : public QxtGenericFunctionPointer
  275. {
  276. public:
  277. typedef void(*FUNCTION)(T1, T2, T3, T4, T5);
  278. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  279. {
  280. QXT_10_UNUSED;
  281. QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5));
  282. return true;
  283. }
  284. private:
  285. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  286. };
  287. template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
  288. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, void, void, void, void> : public QxtGenericFunctionPointer
  289. {
  290. public:
  291. typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6);
  292. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  293. {
  294. QXT_10_UNUSED;
  295. QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6));
  296. return true;
  297. }
  298. private:
  299. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  300. };
  301. template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
  302. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, void, void, void> : public QxtGenericFunctionPointer
  303. {
  304. public:
  305. typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7);
  306. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  307. {
  308. QXT_10_UNUSED;
  309. QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7));
  310. return true;
  311. }
  312. private:
  313. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  314. };
  315. template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
  316. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, void, void> : public QxtGenericFunctionPointer
  317. {
  318. public:
  319. typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8);
  320. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  321. {
  322. QXT_10_UNUSED;
  323. 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));
  324. return true;
  325. }
  326. private:
  327. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  328. };
  329. template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  330. class /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, T9, void> : public QxtGenericFunctionPointer
  331. {
  332. public:
  333. typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9);
  334. bool invoke(QXT_PROTO_10ARGS(QGenericArgument))
  335. {
  336. QXT_10_UNUSED;
  337. 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));
  338. return true;
  339. }
  340. private:
  341. qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}
  342. };
  343. template < typename RETURN = void, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,
  344. typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void >
  345. class /*QXT_CORE_EXPORT*/ QxtBoundCFunction : public QxtBoundFunctionBase
  346. {
  347. public:
  348. QxtGenericFunctionPointer funcPtr;
  349. QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer)
  350. {
  351. // initializers only, thanks to template magic
  352. }
  353. virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))
  354. {
  355. if (type != Qt::AutoConnection && type != Qt::DirectConnection)
  356. {
  357. qWarning() << "QxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection";
  358. return false;
  359. }
  360. 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);
  361. }
  362. };
  363. template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
  364. class /*QXT_CORE_EXPORT*/ QxtBoundCFunction<void, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : public QxtBoundFunctionBase
  365. {
  366. public:
  367. QxtGenericFunctionPointer funcPtr;
  368. QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer)
  369. {
  370. // initializers only, thanks to template magic
  371. }
  372. virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))
  373. {
  374. Q_UNUSED(returnValue);
  375. if (type != Qt::AutoConnection && type != Qt::DirectConnection)
  376. {
  377. qWarning() << "QxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection";
  378. return false;
  379. }
  380. 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);
  381. }
  382. };
  383. #undef QXT_RETURN
  384. #undef QXT_INVOKE
  385. #undef QXT_PARAM
  386. #endif
  387. namespace QxtMetaObject
  388. {
  389. /*!
  390. * \relates QxtMetaObject
  391. * \sa QxtMetaObject::connect
  392. * \sa qxtFuncPtr
  393. * \sa QxtBoundFunction
  394. * \sa QXT_BIND
  395. *
  396. * Creates a binding to the provided C/C++ function using the provided parameter list.
  397. * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function.
  398. * Use the Q_ARG macro to specify constant parameters, or use the QXT_BIND macro to
  399. * relay a parameter from a connected signal or passed via the QxtBoundFunction::invoke()
  400. * method.
  401. *
  402. * The first template parameter must match the return type of the function, or
  403. * void if the function does not return a value. The remaining template parameters must
  404. * match the types of the function's parameters. If any type does not match, this
  405. * function returns NULL.
  406. *
  407. * The returned QxtBoundFunction will not have a parent. Assigning a parent using
  408. * QObject::setParent() is strongly recommended to avoid memory leaks.
  409. */
  410. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
  411. QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QGenericArgument))
  412. {
  413. // Make sure the template parameters make a function pointer equivalent to the one passed in
  414. if (funcPointer.typeName != typeid(typename qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::FUNCTION).name())
  415. {
  416. qWarning() << "QxtMetaObject::bind: parameter list mismatch, check template arguments";
  417. return 0;
  418. }
  419. QGenericArgument* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };
  420. for (int i = 0; i < 10; i++)
  421. {
  422. if (args[i]->name() == 0) break; // done
  423. if (QByteArray(args[i]->name()) == "QxtBoundArgument")
  424. {
  425. Q_ASSERT_X((quintptr)(args[i]->data()) > 0 && (quintptr)(args[i]->data()) <= 10, "QXT_BIND", "invalid argument number");
  426. }
  427. }
  428. QByteArray types[10];
  429. types[0] = QxtMetaType<T1>::name();
  430. types[1] = QxtMetaType<T2>::name();
  431. types[2] = QxtMetaType<T3>::name();
  432. types[3] = QxtMetaType<T4>::name();
  433. types[4] = QxtMetaType<T5>::name();
  434. types[5] = QxtMetaType<T6>::name();
  435. types[6] = QxtMetaType<T7>::name();
  436. types[7] = QxtMetaType<T8>::name();
  437. types[8] = QxtMetaType<T9>::name();
  438. types[9] = QxtMetaType<T10>::name();
  439. return new QxtBoundCFunction<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(0, funcPointer, args, types);
  440. }
  441. /*!
  442. * \relates QxtMetaObject
  443. * \sa QxtMetaObject::connect
  444. * \sa qxtFuncPtr
  445. * \sa QxtBoundFunction
  446. *
  447. * Creates a binding to the provided C/C++ function using the provided parameter list.
  448. * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function.
  449. * The type of each argument is deduced from the type of the QVariant. This function
  450. * cannot bind positional arguments; see the overload using QGenericArgument.
  451. *
  452. * The first template parameter must match the return type of the function, or
  453. * void if the function does not return a value. The remaining template parameters must
  454. * match the types of the function's parameters. If any type does not match, this
  455. * function returns NULL.
  456. *
  457. * The returned QxtBoundFunction will not have a parent. Assigning a parent using
  458. * QObject::setParent() is strongly recommended to avoid memory leaks.
  459. */
  460. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
  461. QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QVariant))
  462. {
  463. QVariant* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };
  464. 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),
  465. QXT_VAR_ARG(5), QXT_VAR_ARG(6), QXT_VAR_ARG(7), QXT_VAR_ARG(8), QXT_VAR_ARG(9), QXT_VAR_ARG(10));
  466. }
  467. // The following overloads exist because C++ doesn't support default parameters in function templates
  468. #ifndef QXT_DOXYGEN_RUN
  469. template <typename RETURN>
  470. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer)
  471. {
  472. return bind<RETURN, void, void, void, void, void, void, void, void, void, void>(funcPointer,
  473. QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  474. }
  475. template <typename RETURN, typename T1>
  476. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1)
  477. {
  478. return bind<RETURN, T1, void, void, void, void, void, void, void, void, void>(funcPointer,
  479. p1, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  480. }
  481. template <typename RETURN, typename T1, typename T2>
  482. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2)
  483. {
  484. return bind<RETURN, T1, T2, void, void, void, void, void, void, void, void>(funcPointer,
  485. p1, p2, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  486. }
  487. template <typename RETURN, typename T1, typename T2, typename T3>
  488. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3)
  489. {
  490. return bind<RETURN, T1, T2, T3, void, void, void, void, void, void, void>(funcPointer,
  491. p1, p2, p3, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  492. }
  493. template <typename RETURN, typename T1, typename T2, typename T3, typename T4>
  494. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4)
  495. {
  496. return bind<RETURN, T1, T2, T3, T4, void, void, void, void, void, void>(funcPointer,
  497. p1, p2, p3, p4, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  498. }
  499. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>
  500. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5)
  501. {
  502. return bind<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void>(funcPointer,
  503. p1, p2, p3, p4, p5, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  504. }
  505. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
  506. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6)
  507. {
  508. return bind<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void>(funcPointer,
  509. p1, p2, p3, p4, p5, p6, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());
  510. }
  511. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
  512. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6, QGenericArgument p7)
  513. {
  514. return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void>(funcPointer,
  515. p1, p2, p3, p4, p5, p6, p7, QGenericArgument(), QGenericArgument(), QGenericArgument());
  516. }
  517. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
  518. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5,
  519. QGenericArgument p6, QGenericArgument p7, QGenericArgument p8)
  520. {
  521. return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QGenericArgument(), QGenericArgument());
  522. }
  523. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  524. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5,
  525. QGenericArgument p6, QGenericArgument p7, QGenericArgument p8, QGenericArgument p9)
  526. {
  527. return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QGenericArgument());
  528. }
  529. template <typename RETURN, typename T1>
  530. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1)
  531. {
  532. return bind<RETURN, T1, void, void, void, void, void, void, void, void, void>(funcPointer, p1, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
  533. }
  534. template <typename RETURN, typename T1, typename T2>
  535. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2)
  536. {
  537. return bind<RETURN, T1, T2, void, void, void, void, void, void, void, void>(funcPointer, p1, p2, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
  538. }
  539. template <typename RETURN, typename T1, typename T2, typename T3>
  540. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3)
  541. {
  542. return bind<RETURN, T1, T2, T3, void, void, void, void, void, void, void>(funcPointer, p1, p2, p3, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
  543. }
  544. template <typename RETURN, typename T1, typename T2, typename T3, typename T4>
  545. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4)
  546. {
  547. return bind<RETURN, T1, T2, T3, T4, void, void, void, void, void, void>(funcPointer, p1, p2, p3, p4, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
  548. }
  549. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>
  550. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5)
  551. {
  552. return bind<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void>(funcPointer, p1, p2, p3, p4, p5, QVariant(), QVariant(), QVariant(), QVariant(), QVariant());
  553. }
  554. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
  555. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6)
  556. {
  557. return bind<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, QVariant(), QVariant(), QVariant(), QVariant());
  558. }
  559. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
  560. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7)
  561. {
  562. return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, QVariant(), QVariant(), QVariant());
  563. }
  564. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
  565. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8)
  566. {
  567. return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QVariant(), QVariant());
  568. }
  569. template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  570. inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8, QVariant p9)
  571. {
  572. return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QVariant());
  573. }
  574. #endif
  575. }
  576. #endif