invoke_lvalue_pass.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // Copyright (C) 2014 Vicente J. Botet Escriba
  10. //
  11. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  12. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  13. // <boost/thread/detail/invoke.hpp>
  14. #include <boost/thread/detail/invoke.hpp>
  15. #include <boost/detail/lightweight_test.hpp>
  16. int count = 0;
  17. // 1 arg, return void
  18. void f_void_1(int i)
  19. {
  20. count += i;
  21. }
  22. struct A_void_1
  23. {
  24. void operator()(int i)
  25. {
  26. count += i;
  27. }
  28. void mem1() {++count;}
  29. void mem2() const {count += 2;}
  30. };
  31. void
  32. test_void_1()
  33. {
  34. int save_count = count;
  35. // function
  36. #if defined BOOST_THREAD_PROVIDES_INVOKE
  37. {
  38. int i = 2;
  39. boost::detail::invoke(f_void_1, i);
  40. BOOST_TEST(count == save_count + 2);
  41. save_count = count;
  42. }
  43. #endif
  44. {
  45. int i = 2;
  46. boost::detail::invoke<void>(f_void_1, i);
  47. BOOST_TEST(count == save_count + 2);
  48. save_count = count;
  49. }
  50. // function pointer
  51. #if defined BOOST_THREAD_PROVIDES_INVOKE
  52. {
  53. void (*fp)(int) = f_void_1;
  54. int i = 3;
  55. boost::detail::invoke(fp, i);
  56. BOOST_TEST(count == save_count+3);
  57. save_count = count;
  58. }
  59. #endif
  60. {
  61. void (*fp)(int) = f_void_1;
  62. int i = 3;
  63. boost::detail::invoke<void>(fp, i);
  64. BOOST_TEST(count == save_count+3);
  65. save_count = count;
  66. }
  67. #if defined BOOST_THREAD_PROVIDES_INVOKE
  68. {
  69. void (*fp)(int) = f_void_1;
  70. int i = 3;
  71. boost::detail::invoke(fp, i);
  72. BOOST_TEST(count == save_count+3);
  73. save_count = count;
  74. }
  75. #endif
  76. {
  77. void (*fp)(int) = f_void_1;
  78. int i = 3;
  79. boost::detail::invoke<void>(fp, i);
  80. BOOST_TEST(count == save_count+3);
  81. save_count = count;
  82. }
  83. // functor
  84. #if defined BOOST_THREAD_PROVIDES_INVOKE
  85. {
  86. A_void_1 a0;
  87. int i = 4;
  88. boost::detail::invoke(a0, i);
  89. BOOST_TEST(count == save_count+4);
  90. save_count = count;
  91. }
  92. #endif
  93. {
  94. A_void_1 a0;
  95. int i = 4;
  96. boost::detail::invoke<void>(a0, i);
  97. BOOST_TEST(count == save_count+4);
  98. save_count = count;
  99. }
  100. // member function pointer
  101. #if defined BOOST_THREAD_PROVIDES_INVOKE
  102. {
  103. void (A_void_1::*fp)() = &A_void_1::mem1;
  104. A_void_1 a;
  105. boost::detail::invoke(fp, a);
  106. BOOST_TEST(count == save_count+1);
  107. save_count = count;
  108. A_void_1* ap = &a;
  109. boost::detail::invoke(fp, ap);
  110. BOOST_TEST(count == save_count+1);
  111. save_count = count;
  112. }
  113. #endif
  114. {
  115. void (A_void_1::*fp)() = &A_void_1::mem1;
  116. A_void_1 a;
  117. boost::detail::invoke<void>(fp, a);
  118. BOOST_TEST(count == save_count+1);
  119. save_count = count;
  120. A_void_1* ap = &a;
  121. boost::detail::invoke<void>(fp, ap);
  122. BOOST_TEST(count == save_count+1);
  123. save_count = count;
  124. }
  125. // const member function pointer
  126. #if defined BOOST_THREAD_PROVIDES_INVOKE
  127. {
  128. void (A_void_1::*fp)() const = &A_void_1::mem2;
  129. A_void_1 a;
  130. boost::detail::invoke(fp, a);
  131. BOOST_TEST(count == save_count+2);
  132. save_count = count;
  133. A_void_1* ap = &a;
  134. boost::detail::invoke(fp, ap);
  135. BOOST_TEST(count == save_count+2);
  136. save_count = count;
  137. }
  138. #endif
  139. {
  140. void (A_void_1::*fp)() const = &A_void_1::mem2;
  141. A_void_1 a;
  142. boost::detail::invoke<void>(fp, a);
  143. BOOST_TEST(count == save_count+2);
  144. save_count = count;
  145. A_void_1* ap = &a;
  146. boost::detail::invoke<void>(fp, ap);
  147. BOOST_TEST(count == save_count+2);
  148. save_count = count;
  149. }
  150. }
  151. // 1 arg, return int
  152. int f_int_1(int i)
  153. {
  154. return i + 1;
  155. }
  156. struct A_int_1
  157. {
  158. A_int_1() : data_(5) {}
  159. int operator()(int i)
  160. {
  161. return i - 1;
  162. }
  163. int mem1() {return 3;}
  164. int mem2() const {return 4;}
  165. int data_;
  166. };
  167. void
  168. test_int_1()
  169. {
  170. // function
  171. {
  172. int i = 2;
  173. #if defined BOOST_THREAD_PROVIDES_INVOKE
  174. BOOST_TEST(boost::detail::invoke(f_int_1, i) == 3);
  175. #endif
  176. BOOST_TEST(boost::detail::invoke<int>(f_int_1, i) == 3);
  177. }
  178. // function pointer
  179. {
  180. int (*fp)(int) = f_int_1;
  181. int i = 3;
  182. #if defined BOOST_THREAD_PROVIDES_INVOKE
  183. BOOST_TEST(boost::detail::invoke(fp, i) == 4);
  184. #endif
  185. BOOST_TEST(boost::detail::invoke<int>(fp, i) == 4);
  186. }
  187. // functor
  188. {
  189. int i = 4;
  190. #if defined BOOST_THREAD_PROVIDES_INVOKE
  191. BOOST_TEST(boost::detail::invoke(A_int_1(), i) == 3);
  192. #endif
  193. const A_int_1 ca;
  194. A_int_1 a;
  195. BOOST_TEST(boost::detail::invoke<int>(a, i) == 3);
  196. //BOOST_TEST(boost::detail::invoke<int>(ca, i) == 3);
  197. #if defined BOOST_THREAD_PROVIDES_INVOKE
  198. BOOST_TEST(boost::detail::invoke<int>(A_int_1(), i) == 3);
  199. #endif
  200. }
  201. // member function pointer
  202. {
  203. A_int_1 a;
  204. #if defined BOOST_THREAD_PROVIDES_INVOKE
  205. BOOST_TEST(boost::detail::invoke(&A_int_1::mem1, a) == 3);
  206. #endif
  207. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::mem1, a) == 3);
  208. A_int_1* ap = &a;
  209. #if defined BOOST_THREAD_PROVIDES_INVOKE
  210. BOOST_TEST(boost::detail::invoke(&A_int_1::mem1, ap) == 3);
  211. #endif
  212. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::mem1, ap) == 3);
  213. }
  214. // const member function pointer
  215. {
  216. A_int_1 a;
  217. #if defined BOOST_THREAD_PROVIDES_INVOKE
  218. BOOST_TEST(boost::detail::invoke(&A_int_1::mem2, A_int_1()) == 4);
  219. #endif
  220. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::mem2, A_int_1()) == 4);
  221. A_int_1* ap = &a;
  222. #if defined BOOST_THREAD_PROVIDES_INVOKE
  223. BOOST_TEST(boost::detail::invoke(&A_int_1::mem2, ap) == 4);
  224. #endif
  225. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::mem2, ap) == 4);
  226. }
  227. // member data pointer
  228. {
  229. A_int_1 a;
  230. #if defined BOOST_THREAD_PROVIDES_INVOKE
  231. BOOST_TEST(boost::detail::invoke(&A_int_1::data_, a) == 5);
  232. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::data_, a) == 5);
  233. #endif
  234. #if defined BOOST_THREAD_PROVIDES_INVOKE
  235. A_int_1* ap = &a;
  236. boost::detail::invoke(&A_int_1::data_, a) = 6;
  237. BOOST_TEST(boost::detail::invoke(&A_int_1::data_, a) == 6);
  238. boost::detail::invoke<int>(&A_int_1::data_, a) = 6;
  239. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::data_, a) == 6);
  240. #endif
  241. #if defined BOOST_THREAD_PROVIDES_INVOKE
  242. BOOST_TEST(boost::detail::invoke(&A_int_1::data_, ap) == 6);
  243. boost::detail::invoke(&A_int_1::data_, ap) = 7;
  244. BOOST_TEST(boost::detail::invoke(&A_int_1::data_, ap) == 7);
  245. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::data_, ap) == 7);
  246. boost::detail::invoke<int>(&A_int_1::data_, ap) = 8;
  247. BOOST_TEST(boost::detail::invoke<int>(&A_int_1::data_, ap) == 8);
  248. #endif
  249. }
  250. }
  251. // 2 arg, return void
  252. void f_void_2(int i, int j)
  253. {
  254. count += i+j;
  255. }
  256. struct A_void_2
  257. {
  258. void operator()(int i, int j)
  259. {
  260. count += i+j;
  261. }
  262. void mem1(int i) {count += i;}
  263. void mem2(int i) const {count += i;}
  264. };
  265. void
  266. test_void_2()
  267. {
  268. int save_count = count;
  269. // function
  270. {
  271. int i = 2;
  272. int j = 3;
  273. #if defined BOOST_THREAD_PROVIDES_INVOKE
  274. boost::detail::invoke(f_void_2, i, j);
  275. BOOST_TEST(count == save_count+5);
  276. save_count = count;
  277. #endif
  278. boost::detail::invoke<void>(f_void_2, i, j);
  279. BOOST_TEST(count == save_count+5);
  280. save_count = count;
  281. }
  282. // member function pointer
  283. {
  284. #if defined BOOST_THREAD_PROVIDES_INVOKE
  285. int j = 3;
  286. boost::detail::invoke(&A_void_2::mem1, A_void_2(), j);
  287. BOOST_TEST(count == save_count+3);
  288. save_count = count;
  289. boost::detail::invoke<void>(&A_void_2::mem1, A_void_2(), j);
  290. BOOST_TEST(count == save_count+3);
  291. save_count = count;
  292. #endif
  293. // A_void_2 a2;
  294. // boost::detail::invoke<void>(&A_void_2::mem1, a2, j);
  295. // BOOST_TEST(count == save_count+3);
  296. // save_count = count;
  297. }
  298. }
  299. int main()
  300. {
  301. test_void_1();
  302. test_int_1();
  303. test_void_2();
  304. return boost::report_errors();
  305. }