single_thread_pass.cpp 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. // Copyright (C) 2013,2015 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. // <boost/thread/sync_queue.hpp>
  6. // class sync_queue<T>
  7. // sync_queue();
  8. #define BOOST_THREAD_VERSION 4
  9. #include <boost/thread/sync_queue.hpp>
  10. #include <boost/detail/lightweight_test.hpp>
  11. class non_copyable
  12. {
  13. BOOST_THREAD_MOVABLE_ONLY(non_copyable)
  14. int val;
  15. public:
  16. non_copyable(int v) : val(v){}
  17. non_copyable(BOOST_RV_REF(non_copyable) x): val(x.val) {}
  18. non_copyable& operator=(BOOST_RV_REF(non_copyable) x) { val=x.val; return *this; }
  19. bool operator==(non_copyable const& x) const {return val==x.val;}
  20. template <typename OSTREAM>
  21. friend OSTREAM& operator <<(OSTREAM& os, non_copyable const&x )
  22. {
  23. os << x.val;
  24. return os;
  25. }
  26. };
  27. int main()
  28. {
  29. {
  30. // default queue invariants
  31. boost::sync_queue<int> q;
  32. BOOST_TEST(q.empty());
  33. BOOST_TEST(! q.full());
  34. BOOST_TEST_EQ(q.size(), 0u);
  35. BOOST_TEST(! q.closed());
  36. }
  37. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  38. {
  39. // empty queue push rvalue/non_copyable succeeds
  40. boost::sync_queue<non_copyable> q;
  41. q.push(non_copyable(1));
  42. BOOST_TEST(! q.empty());
  43. BOOST_TEST(! q.full());
  44. BOOST_TEST_EQ(q.size(), 1u);
  45. BOOST_TEST(! q.closed());
  46. }
  47. #endif
  48. {
  49. // empty queue push rvalue/non_copyable succeeds
  50. boost::sync_queue<non_copyable> q;
  51. non_copyable nc(1);
  52. q.push(boost::move(nc));
  53. BOOST_TEST(! q.empty());
  54. BOOST_TEST(! q.full());
  55. BOOST_TEST_EQ(q.size(), 1u);
  56. BOOST_TEST(! q.closed());
  57. }
  58. {
  59. // empty queue push rvalue succeeds
  60. boost::sync_queue<int> q;
  61. q.push(1);
  62. q.push(2);
  63. BOOST_TEST(! q.empty());
  64. BOOST_TEST(! q.full());
  65. BOOST_TEST_EQ(q.size(), 2u);
  66. BOOST_TEST(! q.closed());
  67. }
  68. {
  69. // empty queue push lvalue succeeds
  70. boost::sync_queue<int> q;
  71. int i;
  72. q.push(i);
  73. BOOST_TEST(! q.empty());
  74. BOOST_TEST(! q.full());
  75. BOOST_TEST_EQ(q.size(), 1u);
  76. BOOST_TEST(! q.closed());
  77. }
  78. {
  79. // empty queue try_push rvalue/copyable succeeds
  80. boost::sync_queue<int> q;
  81. BOOST_TEST(boost::queue_op_status::success == q.try_push(1));
  82. BOOST_TEST(! q.empty());
  83. BOOST_TEST(! q.full());
  84. BOOST_TEST_EQ(q.size(), 1u);
  85. BOOST_TEST(! q.closed());
  86. }
  87. {
  88. // empty queue try_push rvalue/copyable succeeds
  89. boost::sync_queue<int> q;
  90. BOOST_TEST(boost::queue_op_status::success == q.try_push(1));
  91. BOOST_TEST(! q.empty());
  92. BOOST_TEST(! q.full());
  93. BOOST_TEST_EQ(q.size(), 1u);
  94. BOOST_TEST(! q.closed());
  95. }
  96. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  97. {
  98. // empty queue try_push rvalue/non-copyable succeeds
  99. boost::sync_queue<non_copyable> q;
  100. BOOST_TEST(boost::queue_op_status::success ==q.try_push(non_copyable(1)));
  101. BOOST_TEST(! q.empty());
  102. BOOST_TEST(! q.full());
  103. BOOST_TEST_EQ(q.size(), 1u);
  104. BOOST_TEST(! q.closed());
  105. }
  106. #endif
  107. {
  108. // empty queue try_push rvalue/non-copyable succeeds
  109. boost::sync_queue<non_copyable> q;
  110. non_copyable nc(1);
  111. BOOST_TEST(boost::queue_op_status::success == q.try_push(boost::move(nc)));
  112. BOOST_TEST(! q.empty());
  113. BOOST_TEST(! q.full());
  114. BOOST_TEST_EQ(q.size(), 1u);
  115. BOOST_TEST(! q.closed());
  116. }
  117. {
  118. // empty queue try_push lvalue succeeds
  119. boost::sync_queue<int> q;
  120. int i=1;
  121. BOOST_TEST(boost::queue_op_status::success == q.try_push(i));
  122. BOOST_TEST(! q.empty());
  123. BOOST_TEST(! q.full());
  124. BOOST_TEST_EQ(q.size(), 1u);
  125. BOOST_TEST(! q.closed());
  126. }
  127. {
  128. // empty queue try_push rvalue succeeds
  129. boost::sync_queue<int> q;
  130. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push(1));
  131. BOOST_TEST(! q.empty());
  132. BOOST_TEST(! q.full());
  133. BOOST_TEST_EQ(q.size(), 1u);
  134. BOOST_TEST(! q.closed());
  135. }
  136. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  137. {
  138. // empty queue nonblocking_push rvalue/non-copyable succeeds
  139. boost::sync_queue<non_copyable> q;
  140. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push(non_copyable(1)));
  141. BOOST_TEST(! q.empty());
  142. BOOST_TEST(! q.full());
  143. BOOST_TEST_EQ(q.size(), 1u);
  144. BOOST_TEST(! q.closed());
  145. }
  146. #endif
  147. {
  148. // empty queue nonblocking_push rvalue/non-copyable succeeds
  149. boost::sync_queue<non_copyable> q;
  150. non_copyable nc(1);
  151. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push(boost::move(nc)));
  152. BOOST_TEST(! q.empty());
  153. BOOST_TEST(! q.full());
  154. BOOST_TEST_EQ(q.size(), 1u);
  155. BOOST_TEST(! q.closed());
  156. }
  157. {
  158. // 1-element queue pull succeed
  159. boost::sync_queue<int> q;
  160. q.push(1);
  161. int i;
  162. q.pull(i);
  163. BOOST_TEST_EQ(i, 1);
  164. BOOST_TEST(q.empty());
  165. BOOST_TEST(! q.full());
  166. BOOST_TEST_EQ(q.size(), 0u);
  167. BOOST_TEST(! q.closed());
  168. }
  169. {
  170. // 1-element queue pull succeed
  171. boost::sync_queue<non_copyable> q;
  172. non_copyable nc1(1);
  173. q.push(boost::move(nc1));
  174. non_copyable nc2(2);
  175. q.pull(nc2);
  176. BOOST_TEST_EQ(nc1, nc2);
  177. BOOST_TEST(q.empty());
  178. BOOST_TEST(! q.full());
  179. BOOST_TEST_EQ(q.size(), 0u);
  180. BOOST_TEST(! q.closed());
  181. }
  182. {
  183. // 1-element queue pull succeed
  184. boost::sync_queue<int> q;
  185. q.push(1);
  186. int i = q.pull();
  187. BOOST_TEST_EQ(i, 1);
  188. BOOST_TEST(q.empty());
  189. BOOST_TEST(! q.full());
  190. BOOST_TEST_EQ(q.size(), 0u);
  191. BOOST_TEST(! q.closed());
  192. }
  193. {
  194. // 1-element queue pull succeed
  195. boost::sync_queue<non_copyable> q;
  196. non_copyable nc1(1);
  197. q.push(boost::move(nc1));
  198. non_copyable nc = q.pull();
  199. BOOST_TEST_EQ(nc, nc1);
  200. BOOST_TEST(q.empty());
  201. BOOST_TEST(! q.full());
  202. BOOST_TEST_EQ(q.size(), 0u);
  203. BOOST_TEST(! q.closed());
  204. }
  205. {
  206. // 1-element queue try_pull succeed
  207. boost::sync_queue<int> q;
  208. q.push(1);
  209. int i;
  210. BOOST_TEST(boost::queue_op_status::success == q.try_pull(i));
  211. BOOST_TEST_EQ(i, 1);
  212. BOOST_TEST(q.empty());
  213. BOOST_TEST(! q.full());
  214. BOOST_TEST_EQ(q.size(), 0u);
  215. BOOST_TEST(! q.closed());
  216. }
  217. {
  218. // 1-element queue try_pull succeed
  219. boost::sync_queue<non_copyable> q;
  220. non_copyable nc1(1);
  221. q.push(boost::move(nc1));
  222. non_copyable nc(2);
  223. BOOST_TEST(boost::queue_op_status::success == q.try_pull(nc));
  224. BOOST_TEST_EQ(nc, nc1);
  225. BOOST_TEST(q.empty());
  226. BOOST_TEST(! q.full());
  227. BOOST_TEST_EQ(q.size(), 0u);
  228. BOOST_TEST(! q.closed());
  229. }
  230. {
  231. // 1-element queue nonblocking_pull succeed
  232. boost::sync_queue<int> q;
  233. q.push(1);
  234. int i;
  235. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_pull(i));
  236. BOOST_TEST_EQ(i, 1);
  237. BOOST_TEST(q.empty());
  238. BOOST_TEST(! q.full());
  239. BOOST_TEST_EQ(q.size(), 0u);
  240. BOOST_TEST(! q.closed());
  241. }
  242. {
  243. // 1-element queue nonblocking_pull succeed
  244. boost::sync_queue<non_copyable> q;
  245. non_copyable nc1(1);
  246. q.push(boost::move(nc1));
  247. non_copyable nc(2);
  248. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_pull(nc));
  249. BOOST_TEST_EQ(nc, nc1);
  250. BOOST_TEST(q.empty());
  251. BOOST_TEST(! q.full());
  252. BOOST_TEST_EQ(q.size(), 0u);
  253. BOOST_TEST(! q.closed());
  254. }
  255. {
  256. // 1-element queue wait_pull succeed
  257. boost::sync_queue<non_copyable> q;
  258. non_copyable nc1(1);
  259. q.push(boost::move(nc1));
  260. non_copyable nc(2);
  261. BOOST_TEST(boost::queue_op_status::success == q.wait_pull(nc));
  262. BOOST_TEST_EQ(nc, nc1);
  263. BOOST_TEST(q.empty());
  264. BOOST_TEST(! q.full());
  265. BOOST_TEST_EQ(q.size(), 0u);
  266. BOOST_TEST(! q.closed());
  267. }
  268. {
  269. // 1-element queue wait_pull succeed
  270. boost::sync_queue<int> q;
  271. q.push(1);
  272. int i;
  273. BOOST_TEST(boost::queue_op_status::success == q.wait_pull(i));
  274. BOOST_TEST_EQ(i, 1);
  275. BOOST_TEST(q.empty());
  276. BOOST_TEST(! q.full());
  277. BOOST_TEST_EQ(q.size(), 0u);
  278. BOOST_TEST(! q.closed());
  279. }
  280. {
  281. // 1-element queue wait_pull succeed
  282. boost::sync_queue<non_copyable> q;
  283. non_copyable nc1(1);
  284. q.push(boost::move(nc1));
  285. non_copyable nc(2);
  286. BOOST_TEST(boost::queue_op_status::success == q.wait_pull(nc));
  287. BOOST_TEST_EQ(nc, nc1);
  288. BOOST_TEST(q.empty());
  289. BOOST_TEST(! q.full());
  290. BOOST_TEST_EQ(q.size(), 0u);
  291. BOOST_TEST(! q.closed());
  292. }
  293. {
  294. // closed invariants
  295. boost::sync_queue<int> q;
  296. q.close();
  297. BOOST_TEST(q.empty());
  298. BOOST_TEST(! q.full());
  299. BOOST_TEST_EQ(q.size(), 0u);
  300. BOOST_TEST(q.closed());
  301. }
  302. {
  303. // closed queue push fails
  304. boost::sync_queue<int> q;
  305. q.close();
  306. try {
  307. q.push(1);
  308. BOOST_TEST(false);
  309. } catch (...) {
  310. BOOST_TEST(q.empty());
  311. BOOST_TEST(! q.full());
  312. BOOST_TEST_EQ(q.size(), 0u);
  313. BOOST_TEST(q.closed());
  314. }
  315. }
  316. {
  317. // 1-element closed queue pull succeed
  318. boost::sync_queue<int> q;
  319. q.push(1);
  320. q.close();
  321. int i;
  322. q.pull(i);
  323. BOOST_TEST_EQ(i, 1);
  324. BOOST_TEST(q.empty());
  325. BOOST_TEST(! q.full());
  326. BOOST_TEST_EQ(q.size(), 0u);
  327. BOOST_TEST(q.closed());
  328. }
  329. {
  330. // 1-element closed queue wait_pull succeed
  331. boost::sync_queue<int> q;
  332. q.push(1);
  333. q.close();
  334. int i;
  335. BOOST_TEST(boost::queue_op_status::success == q.wait_pull(i));
  336. BOOST_TEST_EQ(i, 1);
  337. BOOST_TEST(q.empty());
  338. BOOST_TEST(! q.full());
  339. BOOST_TEST_EQ(q.size(), 0u);
  340. BOOST_TEST(q.closed());
  341. }
  342. {
  343. // closed empty queue wait_pull fails
  344. boost::sync_queue<int> q;
  345. q.close();
  346. BOOST_TEST(q.empty());
  347. BOOST_TEST(q.closed());
  348. int i;
  349. BOOST_TEST(boost::queue_op_status::closed == q.wait_pull(i));
  350. BOOST_TEST(q.empty());
  351. BOOST_TEST(q.closed());
  352. }
  353. return boost::report_errors();
  354. }