invoke.hpp 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351
  1. // Copyright (C) 2012-2013 Vicente J. Botet Escriba
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. // 2013/04 Vicente J. Botet Escriba
  6. // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
  7. // Make use of Boost.Move
  8. // Make use of Boost.Tuple (movable)
  9. // 2012 Vicente J. Botet Escriba
  10. // Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined
  11. // 2012 Vicente J. Botet Escriba
  12. // Adapt to boost libc++ implementation
  13. //===----------------------------------------------------------------------===//
  14. //
  15. // The LLVM Compiler Infrastructure
  16. //
  17. // This file is dual licensed under the MIT and the University of Illinois Open
  18. // Source Licenses. See LICENSE.TXT for details.
  19. //
  20. // The invoke code is based on the one from libcxx.
  21. //===----------------------------------------------------------------------===//
  22. #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP
  23. #define BOOST_THREAD_DETAIL_INVOKE_HPP
  24. #include <boost/config.hpp>
  25. #include <boost/static_assert.hpp>
  26. #include <boost/thread/detail/move.hpp>
  27. #include <boost/type_traits/is_base_of.hpp>
  28. #include <boost/type_traits/remove_reference.hpp>
  29. #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
  30. #include <functional>
  31. #endif
  32. namespace boost
  33. {
  34. namespace detail
  35. {
  36. #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
  37. ! defined(BOOST_NO_SFINAE_EXPR) && \
  38. ! defined(BOOST_NO_CXX11_DECLTYPE) && \
  39. ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
  40. ! defined(BOOST_NO_CXX11_AUTO)
  41. #define BOOST_THREAD_PROVIDES_INVOKE
  42. #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
  43. // bullets 1 and 2
  44. template <class Fp, class A0, class ...Args>
  45. inline auto
  46. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  47. -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
  48. {
  49. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
  50. }
  51. template <class Fp, class A0, class ...Args>
  52. inline auto
  53. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  54. -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
  55. {
  56. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
  57. }
  58. // bullets 3 and 4
  59. template <class Fp, class A0>
  60. inline auto
  61. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
  62. -> decltype(boost::forward<A0>(a0).*f)
  63. {
  64. return boost::forward<A0>(a0).*f;
  65. }
  66. template <class Fp, class A0>
  67. inline auto
  68. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
  69. -> decltype((*boost::forward<A0>(a0)).*f)
  70. {
  71. return (*boost::forward<A0>(a0)).*f;
  72. }
  73. // bullet 5
  74. template <class Fp, class ...Args>
  75. inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
  76. -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
  77. {
  78. return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
  79. }
  80. #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
  81. // bullets 1 and 2
  82. template <class Fp, class A0>
  83. inline
  84. auto
  85. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
  86. -> decltype((boost::forward<A0>(a0).*f)())
  87. {
  88. return (boost::forward<A0>(a0).*f)();
  89. }
  90. template <class Fp, class A0, class A1>
  91. inline
  92. auto
  93. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  94. -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)))
  95. {
  96. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1));
  97. }
  98. template <class Fp, class A0, class A1, class A2>
  99. inline
  100. auto
  101. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  102. -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
  103. {
  104. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
  105. }
  106. template <class Fp, class A0>
  107. inline
  108. auto
  109. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
  110. -> decltype(((*boost::forward<A0>(a0)).*f)())
  111. {
  112. return ((*boost::forward<A0>(a0)).*f)();
  113. }
  114. template <class Fp, class A0, class A1>
  115. inline
  116. auto
  117. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  118. -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)))
  119. {
  120. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1));
  121. }
  122. template <class Fp, class A0, class A1>
  123. inline
  124. auto
  125. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  126. -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
  127. {
  128. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
  129. }
  130. // bullets 3 and 4
  131. template <class Fp, class A0>
  132. inline
  133. auto
  134. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
  135. -> decltype(boost::forward<A0>(a0).*f)
  136. {
  137. return boost::forward<A0>(a0).*f;
  138. }
  139. template <class Fp, class A0>
  140. inline
  141. auto
  142. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
  143. -> decltype((*boost::forward<A0>(a0)).*f)
  144. {
  145. return (*boost::forward<A0>(a0)).*f;
  146. }
  147. // bullet 5
  148. template <class Fp>
  149. inline
  150. auto invoke(BOOST_THREAD_RV_REF(Fp) f)
  151. -> decltype(boost::forward<Fp>(f)())
  152. {
  153. return boost::forward<Fp>(f)();
  154. }
  155. template <class Fp, class A1>
  156. inline
  157. auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1)
  158. -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
  159. {
  160. return boost::forward<Fp>(f)(boost::forward<A1>(a1));
  161. } template <class Fp, class A1, class A2>
  162. inline
  163. auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  164. -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
  165. {
  166. return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  167. }
  168. template <class Fp, class A1, class A2, class A3>
  169. inline
  170. auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  171. -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
  172. {
  173. return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  174. }
  175. #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
  176. #elif ! defined(BOOST_NO_SFINAE_EXPR) && \
  177. ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \
  178. defined BOOST_MSVC
  179. template <class Ret, class Fp>
  180. inline
  181. Ret invoke(BOOST_THREAD_RV_REF(Fp) f)
  182. {
  183. return f();
  184. }
  185. template <class Ret, class Fp, class A1>
  186. inline
  187. Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
  188. {
  189. return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))();
  190. }
  191. template <class Ret, class Fp, class A1, class A2>
  192. inline
  193. Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  194. {
  195. return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))();
  196. }
  197. template <class Ret, class Fp, class A1, class A2, class A3>
  198. inline
  199. Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  200. {
  201. return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))();
  202. }
  203. #define BOOST_THREAD_PROVIDES_INVOKE_RET
  204. #elif ! defined BOOST_MSVC
  205. //!!!!! WARNING !!!!! THIS DOESN'T WORKS YET
  206. #define BOOST_THREAD_PROVIDES_INVOKE_RET
  207. #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
  208. // bullet 1
  209. // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
  210. // type T or a reference to an object of type T or a reference to an object of a type derived from T
  211. template <class Ret, class A, class A0, class ...Args>
  212. inline
  213. typename enable_if_c
  214. <
  215. is_base_of<A, typename remove_reference<A0>::type>::value,
  216. Ret
  217. >::type
  218. invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  219. {
  220. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
  221. }
  222. template <class Ret, class A, class A0, class ...Args>
  223. inline
  224. typename enable_if_c
  225. <
  226. is_base_of<A, typename remove_reference<A0>::type>::value,
  227. Ret
  228. >::type
  229. invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  230. {
  231. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
  232. }
  233. template <class Ret, class A, class A0, class ...Args>
  234. inline
  235. typename enable_if_c
  236. <
  237. is_base_of<A, typename remove_reference<A0>::type>::value,
  238. Ret
  239. >::type
  240. invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  241. {
  242. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
  243. }
  244. template <class Ret, class A, class A0, class ...Args>
  245. inline
  246. typename enable_if_c
  247. <
  248. is_base_of<A, typename remove_reference<A0>::type>::value,
  249. Ret
  250. >::type
  251. invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  252. {
  253. return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
  254. }
  255. // bullet 2
  256. // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
  257. // the types described in the previous item;
  258. template <class Ret, class A, class A0, class ...Args>
  259. inline
  260. typename enable_if_c
  261. <
  262. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  263. Ret
  264. >::type
  265. invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  266. {
  267. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
  268. }
  269. template <class Ret, class A, class A0, class ...Args>
  270. inline
  271. typename enable_if_c
  272. <
  273. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  274. Ret
  275. >::type
  276. invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  277. {
  278. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
  279. }
  280. template <class Ret, class A, class A0, class ...Args>
  281. inline
  282. typename enable_if_c
  283. <
  284. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  285. Ret
  286. >::type
  287. invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  288. {
  289. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
  290. }
  291. template <class Ret, class A, class A0, class ...Args>
  292. inline
  293. typename enable_if_c
  294. <
  295. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  296. Ret
  297. >::type
  298. invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
  299. {
  300. return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
  301. }
  302. // bullet 3
  303. // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
  304. // reference to an object of type T or a reference to an object of a type derived from T;
  305. // template <class Ret, class A, class A0>
  306. // inline
  307. // typename enable_if_c
  308. // <
  309. // is_base_of<A, typename remove_reference<A0>::type>::value,
  310. // typename detail::apply_cv<A0, A>::type&
  311. // >::type
  312. // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
  313. // {
  314. // return boost::forward<A0>(a0).*f;
  315. // }
  316. // bullet 4
  317. // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
  318. //described in the previous item;
  319. // template <class A0, class Ret, bool>
  320. // struct d4th_helper
  321. // {
  322. // };
  323. //
  324. // template <class A0, class Ret>
  325. // struct d4th_helper<A0, Ret, true>
  326. // {
  327. // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
  328. // };
  329. //
  330. // template <class Ret, class A, class A0>
  331. // inline
  332. // typename detail::4th_helper<A, Ret,
  333. // !is_base_of<A,
  334. // typename remove_reference<A0>::type
  335. // >::value
  336. // >::type&
  337. // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
  338. // {
  339. // return (*boost::forward<A0>(a0)).*f;
  340. // }
  341. // template <class Ret, class A, class A0>
  342. // inline
  343. // typename enable_if_c
  344. // <
  345. // !is_base_of<A, typename remove_reference<A0>::type>::value,
  346. // typename detail::ref_return1<Ret A::*, A0>::type
  347. // >::type
  348. // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
  349. // {
  350. // return (*boost::forward<A0>(a0)).*f;
  351. // }
  352. // bullet 5
  353. // f(t1, t2, ..., tN) in all other cases.
  354. template <class Ret, class Fp, class ...Args>
  355. inline
  356. typename enable_if_c
  357. <
  358. ! is_member_function_pointer<Fp>::value,
  359. Ret
  360. >::type
  361. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
  362. {
  363. return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
  364. }
  365. template <class Ret, class ...Args>
  366. inline Ret
  367. invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args)
  368. {
  369. return f(boost::forward<Args>(args)...);
  370. }
  371. #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
  372. // bullet 1
  373. // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
  374. // type T or a reference to an object of type T or a reference to an object of a type derived from T
  375. template <class Ret, class A, class A0>
  376. inline
  377. typename enable_if_c
  378. <
  379. is_base_of<A, typename remove_reference<A0>::type>::value,
  380. Ret
  381. >::type
  382. invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
  383. {
  384. return (boost::forward<A0>(a0).*f)();
  385. }
  386. template <class Ret, class A, class A0, class A1>
  387. inline
  388. typename enable_if_c
  389. <
  390. is_base_of<A, typename remove_reference<A0>::type>::value,
  391. Ret
  392. >::type
  393. invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  394. {
  395. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
  396. }
  397. template <class Ret, class A, class A0, class A1>
  398. inline
  399. typename enable_if_c
  400. <
  401. is_base_of<A, typename remove_reference<A0>::type>::value,
  402. Ret
  403. >::type
  404. invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
  405. {
  406. return (a0.*f)(a1);
  407. }
  408. template <class Ret, class A, class A0, class A1, class A2>
  409. inline
  410. typename enable_if_c
  411. <
  412. is_base_of<A, typename remove_reference<A0>::type>::value,
  413. Ret
  414. >::type
  415. invoke(Ret (A::*f)(A1, A2),
  416. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
  417. )
  418. {
  419. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  420. }
  421. template <class Ret, class A, class A0, class A1, class A2>
  422. inline
  423. typename enable_if_c
  424. <
  425. is_base_of<A, typename remove_reference<A0>::type>::value,
  426. Ret
  427. >::type
  428. invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
  429. {
  430. return (a0.*f)(a1, a2);
  431. }
  432. template <class Ret, class A, class A0, class A1, class A2, class A3>
  433. inline
  434. typename enable_if_c
  435. <
  436. is_base_of<A, typename remove_reference<A0>::type>::value,
  437. Ret
  438. >::type
  439. invoke(Ret (A::*f)(A1, A2, A3),
  440. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  441. {
  442. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  443. }
  444. template <class Ret, class A, class A0, class A1, class A2, class A3>
  445. inline
  446. typename enable_if_c
  447. <
  448. is_base_of<A, typename remove_reference<A0>::type>::value,
  449. Ret
  450. >::type
  451. invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
  452. {
  453. return (a0.*f)(a1, a2, a3);
  454. }
  455. ///
  456. template <class Ret, class A, class A0>
  457. inline
  458. typename enable_if_c
  459. <
  460. is_base_of<A, typename remove_reference<A0>::type>::value,
  461. Ret
  462. >::type
  463. invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
  464. {
  465. return (boost::forward<A0>(a0).*f)();
  466. }
  467. template <class Ret, class A, class A0, class A1>
  468. inline
  469. typename enable_if_c
  470. <
  471. is_base_of<A, typename remove_reference<A0>::type>::value,
  472. Ret
  473. >::type
  474. invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  475. {
  476. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
  477. }
  478. template <class Ret, class A, class A0, class A1>
  479. inline
  480. typename enable_if_c
  481. <
  482. is_base_of<A, typename remove_reference<A0>::type>::value,
  483. Ret
  484. >::type
  485. invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
  486. {
  487. return (a0.*f)(a1);
  488. }
  489. template <class Ret, class A, class A0, class A1, class A2>
  490. inline
  491. typename enable_if_c
  492. <
  493. is_base_of<A, typename remove_reference<A0>::type>::value,
  494. Ret
  495. >::type
  496. invoke(Ret (A::*f)(A1, A2) const,
  497. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
  498. )
  499. {
  500. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
  501. );
  502. }
  503. template <class Ret, class A, class A0, class A1, class A2>
  504. inline
  505. typename enable_if_c
  506. <
  507. is_base_of<A, typename remove_reference<A0>::type>::value,
  508. Ret
  509. >::type
  510. invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
  511. {
  512. return (a0.*f)(a1, a2);
  513. }
  514. template <class Ret, class A, class A0, class A1, class A2, class A3>
  515. inline
  516. typename enable_if_c
  517. <
  518. is_base_of<A, typename remove_reference<A0>::type>::value,
  519. Ret
  520. >::type
  521. invoke(Ret (A::*f)(A1, A2, A3) const,
  522. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
  523. )
  524. {
  525. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  526. }
  527. template <class Ret, class A, class A0, class A1, class A2, class A3>
  528. inline
  529. typename enable_if_c
  530. <
  531. is_base_of<A, typename remove_reference<A0>::type>::value,
  532. Ret
  533. >::type
  534. invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3)
  535. {
  536. return (a0.*f)(a1, a2, a3);
  537. }
  538. ///
  539. template <class Ret, class A, class A0>
  540. inline
  541. typename enable_if_c
  542. <
  543. is_base_of<A, typename remove_reference<A0>::type>::value,
  544. Ret
  545. >::type
  546. invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
  547. {
  548. return (boost::forward<A0>(a0).*f)();
  549. }
  550. template <class Ret, class A, class A0, class A1>
  551. inline
  552. typename enable_if_c
  553. <
  554. is_base_of<A, typename remove_reference<A0>::type>::value,
  555. Ret
  556. >::type
  557. invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  558. {
  559. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
  560. }
  561. template <class Ret, class A, class A0, class A1>
  562. inline
  563. typename enable_if_c
  564. <
  565. is_base_of<A, typename remove_reference<A0>::type>::value,
  566. Ret
  567. >::type
  568. invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
  569. {
  570. return (a0.*f)(a1);
  571. }
  572. template <class Ret, class A, class A0, class A1, class A2>
  573. inline
  574. typename enable_if_c
  575. <
  576. is_base_of<A, typename remove_reference<A0>::type>::value,
  577. Ret
  578. >::type
  579. invoke(Ret (A::*f)(A1, A2) volatile,
  580. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  581. {
  582. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  583. }
  584. template <class Ret, class A, class A0, class A1, class A2>
  585. inline
  586. typename enable_if_c
  587. <
  588. is_base_of<A, typename remove_reference<A0>::type>::value,
  589. Ret
  590. >::type
  591. invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 )
  592. {
  593. return (a0.*f)(a1, a2);
  594. }
  595. template <class Ret, class A, class A0, class A1, class A2, class A3>
  596. inline
  597. typename enable_if_c
  598. <
  599. is_base_of<A, typename remove_reference<A0>::type>::value,
  600. Ret
  601. >::type
  602. invoke(Ret (A::*f)(A1, A2, A3) volatile,
  603. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
  604. )
  605. {
  606. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  607. }
  608. template <class Ret, class A, class A0, class A1, class A2, class A3>
  609. inline
  610. typename enable_if_c
  611. <
  612. is_base_of<A, typename remove_reference<A0>::type>::value,
  613. Ret
  614. >::type
  615. invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
  616. {
  617. return (a0.*f)(a1, a2, a3);
  618. }
  619. ///
  620. template <class Ret, class A, class A0>
  621. inline
  622. typename enable_if_c
  623. <
  624. is_base_of<A, typename remove_reference<A0>::type>::value,
  625. Ret
  626. >::type
  627. invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
  628. {
  629. return (boost::forward<A0>(a0).*f)();
  630. }
  631. template <class Ret, class A, class A0, class A1>
  632. inline
  633. typename enable_if_c
  634. <
  635. is_base_of<A, typename remove_reference<A0>::type>::value,
  636. Ret
  637. >::type
  638. invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  639. {
  640. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
  641. }
  642. template <class Ret, class A, class A0, class A1>
  643. inline
  644. typename enable_if_c
  645. <
  646. is_base_of<A, typename remove_reference<A0>::type>::value,
  647. Ret
  648. >::type
  649. invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
  650. {
  651. return (a0.*f)(a1);
  652. }
  653. template <class Ret, class A, class A0, class A1, class A2>
  654. inline
  655. typename enable_if_c
  656. <
  657. is_base_of<A, typename remove_reference<A0>::type>::value,
  658. Ret
  659. >::type
  660. invoke(Ret (A::*f)(A1, A2) const volatile,
  661. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
  662. )
  663. {
  664. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  665. }
  666. template <class Ret, class A, class A0, class A1, class A2>
  667. inline
  668. typename enable_if_c
  669. <
  670. is_base_of<A, typename remove_reference<A0>::type>::value,
  671. Ret
  672. >::type
  673. invoke(Ret (A::*f)(A1, A2) const volatile,
  674. A0 a0, A1 a1, A2 a2
  675. )
  676. {
  677. return (a0.*f)(a1, a2);
  678. }
  679. template <class Ret, class A, class A0, class A1, class A2, class A3>
  680. inline
  681. typename enable_if_c
  682. <
  683. is_base_of<A, typename remove_reference<A0>::type>::value,
  684. Ret
  685. >::type
  686. invoke(Ret (A::*f)(A1, A2, A3) const volatile,
  687. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
  688. )
  689. {
  690. return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  691. }
  692. template <class Ret, class A, class A0, class A1, class A2, class A3>
  693. inline
  694. typename enable_if_c
  695. <
  696. is_base_of<A, typename remove_reference<A0>::type>::value,
  697. Ret
  698. >::type
  699. invoke(Ret (A::*f)(A1, A2, A3) const volatile,
  700. A0 a0, A1 a1, A2 a2, A3 a3
  701. )
  702. {
  703. return (a0.*f)(a1, a2, a3);
  704. }
  705. // bullet 2
  706. // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
  707. // the types described in the previous item;
  708. template <class Ret, class A, class A0>
  709. inline
  710. typename enable_if_c
  711. <
  712. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  713. Ret
  714. >::type
  715. invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
  716. {
  717. return ((*boost::forward<A0>(a0)).*f)();
  718. }
  719. template <class Ret, class A, class A0, class A1>
  720. inline
  721. typename enable_if_c
  722. <
  723. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  724. Ret
  725. >::type
  726. invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  727. {
  728. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
  729. }
  730. template <class Ret, class A, class A0, class A1>
  731. inline
  732. typename enable_if_c
  733. <
  734. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  735. Ret
  736. >::type
  737. invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
  738. {
  739. return ((*a0).*f)(a1);
  740. }
  741. template <class Ret, class A, class A0, class A1, class A2>
  742. inline
  743. typename enable_if_c
  744. <
  745. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  746. Ret
  747. >::type
  748. invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)),
  749. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  750. {
  751. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  752. }
  753. template <class Ret, class A, class A0, class A1, class A2>
  754. inline
  755. typename enable_if_c
  756. <
  757. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  758. Ret
  759. >::type
  760. invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
  761. {
  762. return ((*a0).*f)(a1, a2);
  763. }
  764. template <class Ret, class A, class A0, class A1, class A2, class A3>
  765. inline
  766. typename enable_if_c
  767. <
  768. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  769. Ret
  770. >::type
  771. invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)),
  772. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  773. {
  774. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)
  775. );
  776. }
  777. template <class Ret, class A, class A0, class A1, class A2, class A3>
  778. inline
  779. typename enable_if_c
  780. <
  781. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  782. Ret
  783. >::type
  784. invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
  785. {
  786. return ((*a0).*f)(a1, a2, a3);
  787. }
  788. ///
  789. template <class Ret, class A, class A0>
  790. inline
  791. typename enable_if_c
  792. <
  793. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  794. Ret
  795. >::type
  796. invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
  797. {
  798. return ((*boost::forward<A0>(a0)).*f)();
  799. }
  800. template <class Ret, class A, class A0, class A1>
  801. inline
  802. typename enable_if_c
  803. <
  804. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  805. Ret
  806. >::type
  807. invoke(Ret (A::*f)(A1) const,
  808. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  809. {
  810. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
  811. }
  812. template <class Ret, class A, class A0, class A1>
  813. inline
  814. typename enable_if_c
  815. <
  816. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  817. Ret
  818. >::type
  819. invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1)
  820. {
  821. return ((*boost::forward<A0>(a0)).*f)(a1);
  822. }
  823. template <class Ret, class A, class A0, class A1>
  824. inline
  825. typename enable_if_c
  826. <
  827. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  828. Ret
  829. >::type
  830. invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
  831. {
  832. return ((*a0).*f)(a1);
  833. }
  834. template <class Ret, class A, class A0, class A1, class A2>
  835. inline
  836. typename enable_if_c
  837. <
  838. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  839. Ret
  840. >::type
  841. invoke(Ret (A::*f)(A1, A2) const,
  842. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  843. {
  844. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  845. }
  846. template <class Ret, class A, class A0, class A1, class A2>
  847. inline
  848. typename enable_if_c
  849. <
  850. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  851. Ret
  852. >::type
  853. invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
  854. {
  855. return ((*a0).*f)(a1, a2);
  856. }
  857. template <class Ret, class A, class A0, class A1, class A2, class A3>
  858. inline
  859. typename enable_if_c
  860. <
  861. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  862. Ret
  863. >::type
  864. invoke(Ret (A::*f)(A1, A2, A3) const,
  865. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  866. {
  867. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  868. }
  869. template <class Ret, class A, class A0, class A1, class A2, class A3>
  870. inline
  871. typename enable_if_c
  872. <
  873. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  874. Ret
  875. >::type
  876. invoke(Ret (A::*f)(A1, A2, A3) const,
  877. A0 a0, A1 a1, A2 a2, A3 a3)
  878. {
  879. return ((*a0).*f)(a1, a2, a3);
  880. }
  881. ///
  882. template <class Ret, class A, class A0>
  883. inline
  884. typename enable_if_c
  885. <
  886. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  887. Ret
  888. >::type
  889. invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
  890. {
  891. return ((*boost::forward<A0>(a0)).*f)();
  892. }
  893. template <class Ret, class A, class A0, class A1>
  894. inline
  895. typename enable_if_c
  896. <
  897. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  898. Ret
  899. >::type
  900. invoke(Ret (A::*f)(A1) volatile,
  901. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  902. {
  903. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
  904. }
  905. template <class Ret, class A, class A0, class A1>
  906. inline
  907. typename enable_if_c
  908. <
  909. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  910. Ret
  911. >::type
  912. invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
  913. {
  914. return ((*a0).*f)(a1);
  915. }
  916. template <class Ret, class A, class A0, class A1, class A2>
  917. inline
  918. typename enable_if_c
  919. <
  920. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  921. Ret
  922. >::type
  923. invoke(Ret (A::*f)(A1, A2) volatile,
  924. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  925. {
  926. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  927. }
  928. template <class Ret, class A, class A0, class A1, class A2>
  929. inline
  930. typename enable_if_c
  931. <
  932. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  933. Ret
  934. >::type
  935. invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2)
  936. {
  937. return ((*a0).*f)(a1, a2);
  938. }
  939. template <class Ret, class A, class A0, class A1, class A2, class A3>
  940. inline
  941. typename enable_if_c
  942. <
  943. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  944. Ret
  945. >::type
  946. invoke(Ret (A::*f)(A1, A2, A3) volatile,
  947. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  948. {
  949. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  950. }
  951. template <class Ret, class A, class A0, class A1, class A2, class A3>
  952. inline
  953. typename enable_if_c
  954. <
  955. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  956. Ret
  957. >::type
  958. invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
  959. {
  960. return ((*a0).*f)(a1, a2, a3);
  961. }
  962. ///
  963. template <class Ret, class A, class A0>
  964. inline
  965. typename enable_if_c
  966. <
  967. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  968. Ret
  969. >::type
  970. invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
  971. {
  972. return ((*boost::forward<A0>(a0)).*f)();
  973. }
  974. template <class Ret, class A, class A0>
  975. inline
  976. typename enable_if_c
  977. <
  978. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  979. Ret
  980. >::type
  981. invoke(Ret (A::*f)() const volatile, A0 a0)
  982. {
  983. return ((*a0).*f)();
  984. }
  985. template <class Ret, class A, class A0, class A1>
  986. inline
  987. typename enable_if_c
  988. <
  989. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  990. Ret
  991. >::type
  992. invoke(Ret (A::*f)(A1) const volatile,
  993. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
  994. {
  995. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
  996. }
  997. template <class Ret, class A, class A0, class A1>
  998. inline
  999. typename enable_if_c
  1000. <
  1001. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  1002. Ret
  1003. >::type
  1004. invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
  1005. {
  1006. return ((*a0).*f)(a1);
  1007. }
  1008. template <class Ret, class A, class A0, class A1, class A2>
  1009. inline
  1010. typename enable_if_c
  1011. <
  1012. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  1013. Ret
  1014. >::type
  1015. invoke(Ret (A::*f)(A1, A2) const volatile,
  1016. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  1017. {
  1018. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  1019. }
  1020. template <class Ret, class A, class A0, class A1, class A2>
  1021. inline
  1022. typename enable_if_c
  1023. <
  1024. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  1025. Ret
  1026. >::type
  1027. invoke(Ret (A::*f)(A1, A2) const volatile,
  1028. A0 a0, A1 a1, A2 a2)
  1029. {
  1030. return ((*a0).*f)(a1, a2);
  1031. }
  1032. template <class Ret, class A, class A0, class A1, class A2, class A3>
  1033. inline
  1034. typename enable_if_c
  1035. <
  1036. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  1037. Ret
  1038. >::type
  1039. invoke(Ret (A::*f)(A1, A2, A3) const volatile,
  1040. BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  1041. {
  1042. return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  1043. }
  1044. template <class Ret, class A, class A0, class A1, class A2, class A3>
  1045. inline
  1046. typename enable_if_c
  1047. <
  1048. ! is_base_of<A, typename remove_reference<A0>::type>::value,
  1049. Ret
  1050. >::type
  1051. invoke(Ret (A::*f)(A1, A2, A3) const volatile,
  1052. A0 a0, A1 a1, A2 a2, A3 a3)
  1053. {
  1054. return ((*a0).*f)(a1, a2, a3);
  1055. }
  1056. // bullet 3
  1057. // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
  1058. // reference to an object of type T or a reference to an object of a type derived from T;
  1059. // template <class Ret, class A, class A0>
  1060. // inline
  1061. // typename enable_if_c
  1062. // <
  1063. // is_base_of<A, typename remove_reference<A0>::type>::value,
  1064. // typename detail::apply_cv<A0, A>::type&
  1065. // >::type
  1066. // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
  1067. // {
  1068. // return boost::forward<A0>(a0).*f;
  1069. // }
  1070. // bullet 4
  1071. // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
  1072. //described in the previous item;
  1073. // template <class A0, class Ret, bool>
  1074. // struct d4th_helper
  1075. // {
  1076. // };
  1077. //
  1078. // template <class A0, class Ret>
  1079. // struct d4th_helper<A0, Ret, true>
  1080. // {
  1081. // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
  1082. // };
  1083. //
  1084. // template <class Ret, class A, class A0>
  1085. // inline
  1086. // typename detail::4th_helper<A, Ret,
  1087. // !is_base_of<A,
  1088. // typename remove_reference<A0>::type
  1089. // >::value
  1090. // >::type&
  1091. // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
  1092. // {
  1093. // return (*boost::forward<A0>(a0)).*f;
  1094. // }
  1095. // template <class Ret, class A, class A0>
  1096. // inline
  1097. // typename enable_if_c
  1098. // <
  1099. // !is_base_of<A, typename remove_reference<A0>::type>::value,
  1100. // typename detail::ref_return1<Ret A::*, A0>::type
  1101. // >::type
  1102. // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
  1103. // {
  1104. // return (*boost::forward<A0>(a0)).*f;
  1105. // }
  1106. // bullet 5
  1107. // f(t1, t2, ..., tN) in all other cases.
  1108. template <class Ret, class Fp>
  1109. inline
  1110. typename enable_if_c
  1111. <
  1112. ! is_member_function_pointer<Fp>::value,
  1113. Ret
  1114. >::type
  1115. invoke(BOOST_THREAD_RV_REF(Fp) f)
  1116. {
  1117. return boost::forward<Fp>(f)();
  1118. }
  1119. template <class Ret, class Fp, class A1>
  1120. inline
  1121. typename enable_if_c
  1122. <
  1123. ! is_member_function_pointer<Fp>::value,
  1124. Ret
  1125. >::type
  1126. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
  1127. {
  1128. return boost::forward<Fp>(f)(boost::forward<A1>(a1));
  1129. }
  1130. template <class Ret, class Fp, class A1>
  1131. inline
  1132. typename enable_if_c
  1133. <
  1134. ! is_member_function_pointer<Fp>::value,
  1135. Ret
  1136. >::type
  1137. invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1)
  1138. {
  1139. return boost::forward<Fp>(f)(a1);
  1140. }
  1141. template <class Ret, class Fp, class A1, class A2>
  1142. inline
  1143. typename enable_if_c
  1144. <
  1145. ! is_member_function_pointer<Fp>::value,
  1146. Ret
  1147. >::type
  1148. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  1149. {
  1150. return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
  1151. }
  1152. template <class Ret, class Fp, class A1, class A2>
  1153. inline
  1154. typename enable_if_c
  1155. <
  1156. ! is_member_function_pointer<Fp>::value,
  1157. Ret
  1158. >::type
  1159. invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2)
  1160. {
  1161. return boost::forward<Fp>(f)(a1, a2);
  1162. }
  1163. template <class Ret, class Fp, class A1, class A2, class A3>
  1164. inline
  1165. typename enable_if_c
  1166. <
  1167. ! is_member_function_pointer<Fp>::value,
  1168. Ret
  1169. >::type
  1170. invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  1171. {
  1172. return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  1173. }
  1174. template <class Ret, class Fp, class A1, class A2, class A3>
  1175. inline
  1176. typename enable_if_c
  1177. <
  1178. ! is_member_function_pointer<Fp>::value,
  1179. Ret
  1180. >::type
  1181. invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3)
  1182. {
  1183. return boost::forward<Fp>(f)(a1, a2, a3);
  1184. }
  1185. ///
  1186. template <class Ret, class Fp>
  1187. inline
  1188. typename enable_if_c
  1189. <
  1190. ! is_member_function_pointer<Fp>::value,
  1191. Ret
  1192. >::type
  1193. invoke(Fp const &f)
  1194. {
  1195. return f();
  1196. }
  1197. template <class Ret, class Fp, class A1>
  1198. inline
  1199. typename enable_if_c
  1200. <
  1201. ! is_member_function_pointer<Fp>::value,
  1202. Ret
  1203. >::type
  1204. invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1)
  1205. {
  1206. return f(boost::forward<A1>(a1));
  1207. }
  1208. template <class Ret, class Fp, class A1>
  1209. inline
  1210. typename enable_if_c
  1211. <
  1212. ! is_member_function_pointer<Fp>::value,
  1213. Ret
  1214. >::type
  1215. invoke(Fp const &f, A1 a1)
  1216. {
  1217. return f(a1);
  1218. }
  1219. template <class Ret, class Fp, class A1, class A2>
  1220. inline
  1221. typename enable_if_c
  1222. <
  1223. ! is_member_function_pointer<Fp>::value,
  1224. Ret
  1225. >::type
  1226. invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  1227. {
  1228. return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
  1229. }
  1230. template <class Ret, class Fp, class A1, class A2>
  1231. inline
  1232. typename enable_if_c
  1233. <
  1234. ! is_member_function_pointer<Fp>::value,
  1235. Ret
  1236. >::type
  1237. invoke(Fp const &f, A1 a1, A2 a2)
  1238. {
  1239. return f(a1, a2);
  1240. }
  1241. template <class Ret, class Fp, class A1, class A2, class A3>
  1242. inline
  1243. typename enable_if_c
  1244. <
  1245. ! is_member_function_pointer<Fp>::value,
  1246. Ret
  1247. >::type
  1248. invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  1249. {
  1250. return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  1251. }
  1252. template <class Ret, class Fp, class A1, class A2, class A3>
  1253. inline
  1254. typename enable_if_c
  1255. <
  1256. ! is_member_function_pointer<Fp>::value,
  1257. Ret
  1258. >::type
  1259. invoke(Fp const &f, A1 a1, A2 a2, A3 a3)
  1260. {
  1261. return f(a1, a2, a3);
  1262. }
  1263. ///
  1264. template <class Ret>
  1265. inline Ret
  1266. invoke(Ret(*f)())
  1267. {
  1268. return f();
  1269. }
  1270. template <class Ret, class A1>
  1271. inline Ret
  1272. invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1)
  1273. {
  1274. return f(boost::forward<A1>(a1));
  1275. }
  1276. template <class Ret, class A1, class A2>
  1277. inline Ret
  1278. invoke(Ret(*f)(A1, A2),
  1279. BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
  1280. {
  1281. return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
  1282. }
  1283. template <class Ret, class A1, class A2, class A3>
  1284. inline Ret
  1285. invoke(Ret(*f)(A1, A2, A3),
  1286. BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
  1287. {
  1288. return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
  1289. }
  1290. #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
  1291. #endif // all
  1292. }
  1293. }
  1294. #endif // header