base_test.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. // Test of the base circular buffer container.
  2. // Copyright (c) 2003-2008 Jan Gaspar
  3. // Copyright (c) 2013 Antony Polukhin
  4. // Use, modification, and distribution is subject to the Boost Software
  5. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. #include "test.hpp"
  8. #define CB_CONTAINER circular_buffer
  9. #include "common.ipp"
  10. void iterator_constructor_and_assign_test() {
  11. circular_buffer<MyInteger> cb(4, 3);
  12. circular_buffer<MyInteger>::iterator it = cb.begin();
  13. circular_buffer<MyInteger>::iterator itCopy;
  14. itCopy = it;
  15. it = it;
  16. circular_buffer<MyInteger>::const_iterator cit;
  17. cit = it;
  18. circular_buffer<MyInteger>::const_iterator end1 = cb.end();
  19. circular_buffer<MyInteger>::const_iterator end2 = end1;
  20. BOOST_TEST(itCopy == it);
  21. BOOST_TEST(cit == it);
  22. BOOST_TEST(end1 == end2);
  23. BOOST_TEST(it != end1);
  24. BOOST_TEST(cit != end2);
  25. }
  26. void iterator_reference_test() {
  27. circular_buffer<Dummy> cb(3, Dummy());
  28. circular_buffer<Dummy>::iterator it = cb.begin();
  29. circular_buffer<Dummy>::const_iterator cit = cb.begin() + 1;
  30. BOOST_TEST((*it).m_n == Dummy::eVar);
  31. BOOST_TEST((*it).fnc() == Dummy::eFnc);
  32. BOOST_TEST((*cit).const_fnc() == Dummy::eConst);
  33. BOOST_TEST((*it).virtual_fnc() == Dummy::eVirtual);
  34. BOOST_TEST(it->m_n == Dummy::eVar);
  35. BOOST_TEST(it->fnc() == Dummy::eFnc);
  36. BOOST_TEST(cit->const_fnc() == Dummy::eConst);
  37. BOOST_TEST(it->virtual_fnc() == Dummy::eVirtual);
  38. }
  39. void iterator_difference_test() {
  40. circular_buffer<MyInteger> cb(5, 1);
  41. cb.push_back(2);
  42. circular_buffer<MyInteger>::iterator it1 = cb.begin() + 2;
  43. circular_buffer<MyInteger>::iterator it2 = cb.begin() + 3;
  44. circular_buffer<MyInteger>::const_iterator begin = cb.begin();
  45. circular_buffer<MyInteger>::iterator end = cb.end();
  46. BOOST_TEST(begin - begin == 0);
  47. BOOST_TEST(end - cb.begin() == 5);
  48. BOOST_TEST(end - end == 0);
  49. BOOST_TEST(begin - cb.end() == -5);
  50. BOOST_TEST(it1 - cb.begin() == 2);
  51. BOOST_TEST(it1 - begin == 2);
  52. BOOST_TEST(end - it1 == 3);
  53. BOOST_TEST(it2 - it1 == 1);
  54. BOOST_TEST(it1 - it2 == -1);
  55. BOOST_TEST(it2 - it2 == 0);
  56. }
  57. void iterator_increment_test() {
  58. circular_buffer<MyInteger> cb(10, 1);
  59. cb.push_back(2);
  60. circular_buffer<MyInteger>::iterator it1 = cb.begin();
  61. circular_buffer<MyInteger>::iterator it2 = cb.begin() + 5;
  62. circular_buffer<MyInteger>::iterator it3 = cb.begin() + 9;
  63. it1++;
  64. it2++;
  65. ++it3;
  66. BOOST_TEST(it1 == cb.begin() + 1);
  67. BOOST_TEST(it2 == cb.begin() + 6);
  68. BOOST_TEST(it3 == cb.end());
  69. }
  70. void iterator_decrement_test() {
  71. circular_buffer<MyInteger> cb(10, 1);
  72. cb.push_back(2);
  73. circular_buffer<MyInteger>::iterator it1= cb.end();
  74. circular_buffer<MyInteger>::iterator it2= cb.end() - 5;
  75. circular_buffer<MyInteger>::iterator it3= cb.end() - 9;
  76. --it1;
  77. it2--;
  78. --it3;
  79. BOOST_TEST(it1 == cb.end() - 1);
  80. BOOST_TEST(it2 == cb.end() - 6);
  81. BOOST_TEST(it3 == cb.begin());
  82. }
  83. void iterator_addition_test() {
  84. circular_buffer<MyInteger> cb(10, 1);
  85. cb.push_back(2);
  86. cb.push_back(2);
  87. circular_buffer<MyInteger>::iterator it1 = cb.begin() + 2;
  88. circular_buffer<MyInteger>::iterator it2 = cb.end();
  89. circular_buffer<MyInteger>::iterator it3 = cb.begin() + 5;
  90. circular_buffer<MyInteger>::iterator it4 = cb.begin() + 9;
  91. it1 += 3;
  92. it2 += 0;
  93. it3 += 5;
  94. it4 += -2;
  95. BOOST_TEST(it1 == 5 + cb.begin());
  96. BOOST_TEST(it2 == cb.end());
  97. BOOST_TEST(it3 == cb.end());
  98. BOOST_TEST(it4 + 3 == cb.end());
  99. BOOST_TEST((-3) + it4 == cb.begin() + 4);
  100. BOOST_TEST(cb.begin() + 0 == cb.begin());
  101. }
  102. void iterator_subtraction_test() {
  103. circular_buffer<MyInteger> cb(10, 1);
  104. cb.push_back(2);
  105. cb.push_back(2);
  106. cb.push_back(2);
  107. circular_buffer<MyInteger>::iterator it1 = cb.begin();
  108. circular_buffer<MyInteger>::iterator it2 = cb.end();
  109. circular_buffer<MyInteger>::iterator it3 = cb.end() - 5;
  110. circular_buffer<MyInteger>::iterator it4 = cb.begin() + 7;
  111. it1 -= -2;
  112. it2 -= 0;
  113. it3 -= 5;
  114. BOOST_TEST(it1 == cb.begin() + 2);
  115. BOOST_TEST(it2 == cb.end());
  116. BOOST_TEST(it3 == cb.begin());
  117. BOOST_TEST(it4 - 7 == cb.begin());
  118. BOOST_TEST(it4 - (-3) == cb.end());
  119. BOOST_TEST(cb.begin() - 0 == cb.begin());
  120. }
  121. void iterator_element_access_test() {
  122. circular_buffer<MyInteger> cb(10);
  123. cb.push_back(1);
  124. cb.push_back(2);
  125. cb.push_back(3);
  126. cb.push_back(4);
  127. cb.push_back(5);
  128. cb.push_back(6);
  129. circular_buffer<MyInteger>::iterator it = cb.begin() + 1;
  130. BOOST_TEST(it[0] == 2);
  131. BOOST_TEST(it[-1] == 1);
  132. BOOST_TEST(it[2] == 4);
  133. }
  134. void iterator_comparison_test() {
  135. circular_buffer<MyInteger> cb(5, 1);
  136. cb.push_back(2);
  137. circular_buffer<MyInteger>::iterator it = cb.begin() + 2;
  138. circular_buffer<MyInteger>::const_iterator begin = cb.begin();
  139. circular_buffer<MyInteger>::iterator end = cb.end();
  140. BOOST_TEST(begin == begin);
  141. BOOST_TEST(end > cb.begin());
  142. BOOST_TEST(begin < end);
  143. BOOST_TEST(end > begin);
  144. BOOST_TEST(end == end);
  145. BOOST_TEST(begin < cb.end());
  146. BOOST_TEST(!(begin + 1 > cb.end()));
  147. BOOST_TEST(it > cb.begin());
  148. BOOST_TEST(end > it);
  149. BOOST_TEST(begin >= begin);
  150. BOOST_TEST(end >= cb.begin());
  151. BOOST_TEST(end <= end);
  152. BOOST_TEST(begin <= cb.end());
  153. BOOST_TEST(it >= cb.begin());
  154. BOOST_TEST(end >= it);
  155. BOOST_TEST(!(begin + 4 < begin + 4));
  156. BOOST_TEST(begin + 4 < begin + 5);
  157. BOOST_TEST(!(begin + 5 < begin + 4));
  158. BOOST_TEST(it < end - 1);
  159. BOOST_TEST(!(end - 1 < it));
  160. }
  161. void iterator_invalidation_test() {
  162. #if BOOST_CB_ENABLE_DEBUG
  163. circular_buffer<MyInteger>::iterator it1;
  164. circular_buffer<MyInteger>::const_iterator it2;
  165. circular_buffer<MyInteger>::iterator it3;
  166. circular_buffer<MyInteger>::const_iterator it4;
  167. circular_buffer<MyInteger>::const_iterator it5;
  168. circular_buffer<MyInteger>::const_iterator it6;
  169. BOOST_TEST(it1.is_valid(0));
  170. BOOST_TEST(it2.is_valid(0));
  171. BOOST_TEST(it3.is_valid(0));
  172. BOOST_TEST(it4.is_valid(0));
  173. BOOST_TEST(it5.is_valid(0));
  174. BOOST_TEST(it6.is_valid(0));
  175. {
  176. circular_buffer<MyInteger> cb(5, 0);
  177. const circular_buffer<MyInteger> ccb(5, 0);
  178. it1 = cb.begin();
  179. it2 = ccb.begin();
  180. it3 = cb.end();
  181. it4 = it1;
  182. it5 = it2;
  183. it6 = it1;
  184. BOOST_TEST(it1.is_valid(&cb));
  185. BOOST_TEST(it2.is_valid(&ccb));
  186. BOOST_TEST(it3.is_valid(&cb));
  187. BOOST_TEST(it4.is_valid(&cb));
  188. BOOST_TEST(it5.is_valid(&ccb));
  189. BOOST_TEST(it6.is_valid(&cb));
  190. }
  191. BOOST_TEST(it1.is_valid(0));
  192. BOOST_TEST(it2.is_valid(0));
  193. BOOST_TEST(it3.is_valid(0));
  194. BOOST_TEST(it4.is_valid(0));
  195. BOOST_TEST(it5.is_valid(0));
  196. BOOST_TEST(it6.is_valid(0));
  197. circular_buffer<MyInteger> cb(10, 0);
  198. it1 = cb.end();
  199. cb.clear();
  200. BOOST_TEST(it1.is_valid(&cb));
  201. cb.push_back(1);
  202. cb.push_back(2);
  203. cb.push_back(3);
  204. int i = 0;
  205. for (it2 = cb.begin(); it2 != it1; it2++, i++);
  206. BOOST_TEST(i == 3);
  207. circular_buffer<MyInteger> cb1(10, 0);
  208. circular_buffer<MyInteger> cb2(20, 0);
  209. it1 = cb1.end();
  210. it2 = cb2.begin();
  211. BOOST_TEST(it1.is_valid(&cb1));
  212. BOOST_TEST(it2.is_valid(&cb2));
  213. cb1.swap(cb2);
  214. BOOST_TEST(!it1.is_valid(&cb1));
  215. BOOST_TEST(!it2.is_valid(&cb2));
  216. it1 = cb1.begin() + 3;
  217. it2 = cb1.begin();
  218. cb1.push_back(1);
  219. BOOST_TEST(it1.is_valid(&cb1));
  220. BOOST_TEST(!it2.is_valid(&cb1));
  221. BOOST_TEST(*it2.m_it == 1);
  222. circular_buffer<MyInteger> cb3(5);
  223. cb3.push_back(1);
  224. cb3.push_back(2);
  225. cb3.push_back(3);
  226. cb3.push_back(4);
  227. cb3.push_back(5);
  228. it1 = cb3.begin() + 2;
  229. it2 = cb3.begin();
  230. cb3.insert(cb3.begin() + 3, 6);
  231. BOOST_TEST(it1.is_valid(&cb3));
  232. BOOST_TEST(!it2.is_valid(&cb3));
  233. BOOST_TEST(*it2.m_it == 5);
  234. it1 = cb3.begin() + 3;
  235. it2 = cb3.end() - 1;
  236. cb3.push_front(7);
  237. BOOST_TEST(it1.is_valid(&cb3));
  238. BOOST_TEST(!it2.is_valid(&cb3));
  239. BOOST_TEST(*it2.m_it == 7);
  240. circular_buffer<MyInteger> cb4(5);
  241. cb4.push_back(1);
  242. cb4.push_back(2);
  243. cb4.push_back(3);
  244. cb4.push_back(4);
  245. cb4.push_back(5);
  246. it1 = cb4.begin() + 3;
  247. it2 = cb4.begin();
  248. cb4.rinsert(cb4.begin() + 2, 6);
  249. BOOST_TEST(it1.is_valid(&cb4));
  250. BOOST_TEST(!it2.is_valid(&cb4));
  251. BOOST_TEST(*it2.m_it == 2);
  252. it1 = cb1.begin() + 5;
  253. it2 = cb1.end() - 1;
  254. cb1.pop_back();
  255. BOOST_TEST(it1.is_valid(&cb1));
  256. BOOST_TEST(!it2.is_valid(&cb1));
  257. it1 = cb1.begin() + 5;
  258. it2 = cb1.begin();
  259. cb1.pop_front();
  260. BOOST_TEST(it1.is_valid(&cb1));
  261. BOOST_TEST(!it2.is_valid(&cb1));
  262. circular_buffer<MyInteger> cb5(20, 0);
  263. it1 = cb5.begin() + 5;
  264. it2 = it3 = cb5.begin() + 15;
  265. cb5.erase(cb5.begin() + 10);
  266. BOOST_TEST(it1.is_valid(&cb5));
  267. BOOST_TEST(!it2.is_valid(&cb5));
  268. BOOST_TEST(!it3.is_valid(&cb5));
  269. it1 = cb5.begin() + 1;
  270. it2 = it3 = cb5.begin() + 8;
  271. cb5.erase(cb5.begin() + 3, cb5.begin() + 7);
  272. BOOST_TEST(it1.is_valid(&cb5));
  273. BOOST_TEST(!it2.is_valid(&cb5));
  274. BOOST_TEST(!it3.is_valid(&cb5));
  275. circular_buffer<MyInteger> cb6(20, 0);
  276. it4 = it1 = cb6.begin() + 5;
  277. it2 = cb6.begin() + 15;
  278. cb6.rerase(cb6.begin() + 10);
  279. BOOST_TEST(!it1.is_valid(&cb6));
  280. BOOST_TEST(!it4.is_valid(&cb6));
  281. BOOST_TEST(it2.is_valid(&cb6));
  282. it4 = it1 = cb6.begin() + 1;
  283. it2 = cb6.begin() + 8;
  284. cb6.rerase(cb6.begin() + 3, cb6.begin() + 7);
  285. BOOST_TEST(!it1.is_valid(&cb6));
  286. BOOST_TEST(!it4.is_valid(&cb6));
  287. BOOST_TEST(it2.is_valid(&cb6));
  288. circular_buffer<MyInteger> cb7(10, 1);
  289. cb7.push_back(2);
  290. cb7.push_back(3);
  291. cb7.push_back(4);
  292. it1 = cb7.end();
  293. it2 = cb7.begin();
  294. it3 = cb7.begin() + 6;
  295. cb7.linearize();
  296. BOOST_TEST(it1.is_valid(&cb7));
  297. BOOST_TEST(!it2.is_valid(&cb7));
  298. BOOST_TEST(!it3.is_valid(&cb7));
  299. it1 = cb7.end();
  300. it2 = cb7.begin();
  301. it3 = cb7.begin() + 6;
  302. cb7.linearize();
  303. BOOST_TEST(it1.is_valid(&cb7));
  304. BOOST_TEST(it2.is_valid(&cb7));
  305. BOOST_TEST(it3.is_valid(&cb7));
  306. cb7.push_back(5);
  307. cb7.push_back(6);
  308. it1 = cb7.end();
  309. it2 = cb7.begin();
  310. it3 = cb7.begin() + 6;
  311. cb7.set_capacity(10);
  312. BOOST_TEST(it1.is_valid(&cb7));
  313. BOOST_TEST(it2.is_valid(&cb7));
  314. BOOST_TEST(it3.is_valid(&cb7));
  315. cb7.set_capacity(20);
  316. BOOST_TEST(it1.is_valid(&cb7));
  317. BOOST_TEST(!it2.is_valid(&cb7));
  318. BOOST_TEST(!it3.is_valid(&cb7));
  319. cb7.push_back(7);
  320. it1 = cb7.end();
  321. it2 = cb7.begin();
  322. it3 = cb7.begin() + 6;
  323. cb7.set_capacity(10);
  324. BOOST_TEST(it1.is_valid(&cb7));
  325. BOOST_TEST(!it2.is_valid(&cb7));
  326. BOOST_TEST(!it3.is_valid(&cb7));
  327. cb7.push_back(8);
  328. cb7.push_back(9);
  329. it1 = cb7.end();
  330. it2 = cb7.begin();
  331. it3 = cb7.begin() + 6;
  332. cb7.rset_capacity(10);
  333. BOOST_TEST(it1.is_valid(&cb7));
  334. BOOST_TEST(it2.is_valid(&cb7));
  335. BOOST_TEST(it3.is_valid(&cb7));
  336. cb7.rset_capacity(20);
  337. BOOST_TEST(it1.is_valid(&cb7));
  338. BOOST_TEST(!it2.is_valid(&cb7));
  339. BOOST_TEST(!it3.is_valid(&cb7));
  340. cb7.push_back(10);
  341. it1 = cb7.end();
  342. it2 = cb7.begin();
  343. it3 = cb7.begin() + 6;
  344. cb7.rset_capacity(10);
  345. BOOST_TEST(it1.is_valid(&cb7));
  346. BOOST_TEST(!it2.is_valid(&cb7));
  347. BOOST_TEST(!it3.is_valid(&cb7));
  348. circular_buffer<MyInteger> cb8(10, 1);
  349. cb8.push_back(2);
  350. cb8.push_back(3);
  351. it1 = cb8.end();
  352. it2 = cb8.begin();
  353. it3 = cb8.begin() + 6;
  354. cb8.resize(10);
  355. BOOST_TEST(it1.is_valid(&cb8));
  356. BOOST_TEST(it2.is_valid(&cb8));
  357. BOOST_TEST(it3.is_valid(&cb8));
  358. cb8.resize(20);
  359. BOOST_TEST(it1.is_valid(&cb8));
  360. BOOST_TEST(!it2.is_valid(&cb8));
  361. BOOST_TEST(!it3.is_valid(&cb8));
  362. cb8.push_back(4);
  363. it1 = cb8.end();
  364. it2 = cb8.begin();
  365. it3 = cb8.begin() + 6;
  366. it4 = cb8.begin() + 12;
  367. cb8.resize(10);
  368. BOOST_TEST(it1.is_valid(&cb8));
  369. BOOST_TEST(it2.is_valid(&cb8));
  370. BOOST_TEST(it3.is_valid(&cb8));
  371. BOOST_TEST(!it4.is_valid(&cb8));
  372. cb8.set_capacity(10);
  373. cb8.push_back(5);
  374. cb8.push_back(6);
  375. it1 = cb8.end();
  376. it2 = cb8.begin();
  377. it3 = cb8.begin() + 6;
  378. cb8.rresize(10);
  379. BOOST_TEST(it1.is_valid(&cb8));
  380. BOOST_TEST(it2.is_valid(&cb8));
  381. BOOST_TEST(it3.is_valid(&cb8));
  382. cb8.rresize(20);
  383. BOOST_TEST(it1.is_valid(&cb8));
  384. BOOST_TEST(!it2.is_valid(&cb8));
  385. BOOST_TEST(!it3.is_valid(&cb8));
  386. cb8.push_back(7);
  387. it1 = cb8.end();
  388. it2 = cb8.begin();
  389. it3 = cb8.begin() + 6;
  390. it4 = cb8.begin() + 12;
  391. cb8.rresize(10);
  392. BOOST_TEST(it1.is_valid(&cb8));
  393. BOOST_TEST(!it2.is_valid(&cb8));
  394. BOOST_TEST(!it3.is_valid(&cb8));
  395. BOOST_TEST(it4.is_valid(&cb8));
  396. circular_buffer<MyInteger> cb9(15, 1);
  397. it1 = cb9.end();
  398. it2 = cb9.begin();
  399. it3 = cb9.begin() + 6;
  400. it4 = cb9.begin() + 12;
  401. cb9 = cb8;
  402. BOOST_TEST(it1.is_valid(&cb9));
  403. BOOST_TEST(!it2.is_valid(&cb9));
  404. BOOST_TEST(!it3.is_valid(&cb9));
  405. BOOST_TEST(!it4.is_valid(&cb9));
  406. circular_buffer<MyInteger> cb10(10, 1);
  407. it1 = cb10.end();
  408. it2 = cb10.begin();
  409. it3 = cb10.begin() + 3;
  410. it4 = cb10.begin() + 7;
  411. cb10.assign(5, 2);
  412. BOOST_TEST(it1.is_valid(&cb10));
  413. BOOST_TEST(!it2.is_valid(&cb10));
  414. BOOST_TEST(!it3.is_valid(&cb10));
  415. BOOST_TEST(!it4.is_valid(&cb10));
  416. circular_buffer<MyInteger> cb11(10, 1);
  417. it1 = cb11.end();
  418. it2 = cb11.begin();
  419. it3 = cb11.begin() + 3;
  420. it4 = cb11.begin() + 7;
  421. cb11.assign(15, 5, 2);
  422. BOOST_TEST(it1.is_valid(&cb11));
  423. BOOST_TEST(!it2.is_valid(&cb11));
  424. BOOST_TEST(!it3.is_valid(&cb11));
  425. BOOST_TEST(!it4.is_valid(&cb11));
  426. circular_buffer<MyInteger> cb12(10, 1);
  427. it1 = cb12.end();
  428. it2 = cb12.begin();
  429. it3 = cb12.begin() + 3;
  430. it4 = cb12.begin() + 7;
  431. cb12.assign(cb11.begin(), cb11.end());
  432. BOOST_TEST(it1.is_valid(&cb12));
  433. BOOST_TEST(!it2.is_valid(&cb12));
  434. BOOST_TEST(!it3.is_valid(&cb12));
  435. BOOST_TEST(!it4.is_valid(&cb12));
  436. circular_buffer<MyInteger> cb13(10, 1);
  437. it1 = cb13.end();
  438. it2 = cb13.begin();
  439. it3 = cb13.begin() + 3;
  440. it4 = cb13.begin() + 7;
  441. cb13.assign(15, cb11.begin(), cb11.end());
  442. BOOST_TEST(it1.is_valid(&cb13));
  443. BOOST_TEST(!it2.is_valid(&cb13));
  444. BOOST_TEST(!it3.is_valid(&cb13));
  445. BOOST_TEST(!it4.is_valid(&cb13));
  446. circular_buffer<MyInteger> cb14(10);
  447. cb14.push_back(1);
  448. cb14.push_back(2);
  449. cb14.push_back(3);
  450. cb14.push_back(4);
  451. cb14.push_back(5);
  452. cb14.push_back(6);
  453. cb14.push_back(7);
  454. it1 = cb14.end();
  455. it2 = cb14.begin() + 2;
  456. it3 = cb14.begin() + 1;
  457. it4 = cb14.begin() + 5;
  458. cb14.rotate(it2);
  459. BOOST_TEST(it1.is_valid(&cb14));
  460. BOOST_TEST(it2.is_valid(&cb14));
  461. BOOST_TEST(!it3.is_valid(&cb14));
  462. BOOST_TEST(it4.is_valid(&cb14));
  463. circular_buffer<MyInteger> cb15(7);
  464. cb15.push_back(1);
  465. cb15.push_back(2);
  466. cb15.push_back(3);
  467. cb15.push_back(4);
  468. cb15.push_back(5);
  469. cb15.push_back(6);
  470. cb15.push_back(7);
  471. cb15.push_back(8);
  472. cb15.push_back(9);
  473. it1 = cb15.end();
  474. it2 = cb15.begin() + 2;
  475. it3 = cb15.begin() + 1;
  476. it4 = cb15.begin() + 5;
  477. cb15.rotate(it3);
  478. BOOST_TEST(it1.is_valid(&cb15));
  479. BOOST_TEST(it2.is_valid(&cb15));
  480. BOOST_TEST(it3.is_valid(&cb15));
  481. BOOST_TEST(it4.is_valid(&cb15));
  482. circular_buffer<MyInteger> cb16(10);
  483. cb16.push_back(1);
  484. cb16.push_back(2);
  485. cb16.push_back(3);
  486. cb16.push_back(4);
  487. cb16.push_back(5);
  488. cb16.push_back(6);
  489. cb16.push_back(7);
  490. it1 = cb16.end();
  491. it2 = cb16.begin() + 6;
  492. it3 = cb16.begin();
  493. it4 = cb16.begin() + 5;
  494. cb16.rotate(it4);
  495. BOOST_TEST(it1.is_valid(&cb16));
  496. BOOST_TEST(!it2.is_valid(&cb16));
  497. BOOST_TEST(it3.is_valid(&cb16));
  498. BOOST_TEST(!it4.is_valid(&cb16));
  499. #endif // #if BOOST_CB_ENABLE_DEBUG
  500. }
  501. // basic exception safety test (it is useful to use any memory-leak detection tool)
  502. void exception_safety_test() {
  503. #if !defined(BOOST_NO_EXCEPTIONS)
  504. circular_buffer<MyInteger> cb1(3, 5);
  505. MyInteger::set_exception_trigger(3);
  506. BOOST_TEST_THROWS(cb1.set_capacity(5), std::exception);
  507. BOOST_TEST(cb1.capacity() == 3);
  508. MyInteger::set_exception_trigger(3);
  509. BOOST_TEST_THROWS(cb1.rset_capacity(5), std::exception);
  510. BOOST_TEST(cb1.capacity() == 3);
  511. generic_test(cb1);
  512. MyInteger::set_exception_trigger(3);
  513. BOOST_TEST_THROWS(circular_buffer<MyInteger> cb2(5, 10), std::exception);
  514. circular_buffer<MyInteger> cb3(5, 10);
  515. MyInteger::set_exception_trigger(3);
  516. BOOST_TEST_THROWS(circular_buffer<MyInteger> cb4(cb3), std::exception);
  517. vector<MyInteger> v(5, MyInteger(10));
  518. MyInteger::set_exception_trigger(3);
  519. BOOST_TEST_THROWS(circular_buffer<MyInteger> cb5(8, v.begin(), v.end()), std::exception);
  520. circular_buffer<MyInteger> cb6(5, 10);
  521. circular_buffer<MyInteger> cb7(8, 3);
  522. MyInteger::set_exception_trigger(3);
  523. BOOST_TEST_THROWS(cb7 = cb6, std::exception);
  524. BOOST_TEST(cb7.size() == 8);
  525. BOOST_TEST(cb7.capacity() == 8);
  526. BOOST_TEST(cb7[0] == 3);
  527. BOOST_TEST(cb7[7] == 3);
  528. generic_test(cb7);
  529. circular_buffer<MyInteger> cb8(5, 10);
  530. MyInteger::set_exception_trigger(2);
  531. BOOST_TEST_THROWS(cb8.push_front(1), std::exception);
  532. circular_buffer<MyInteger> cb9(5);
  533. cb9.push_back(1);
  534. cb9.push_back(2);
  535. cb9.push_back(3);
  536. MyInteger::set_exception_trigger(3);
  537. BOOST_TEST_THROWS(cb9.insert(cb9.begin() + 1, 4), std::exception);
  538. circular_buffer<MyInteger> cb10(5);
  539. cb10.push_back(1);
  540. cb10.push_back(2);
  541. cb10.push_back(3);
  542. MyInteger::set_exception_trigger(3);
  543. BOOST_TEST_THROWS(cb10.rinsert(cb10.begin() + 1, 4), std::exception);
  544. circular_buffer<MyInteger> cb11(5);
  545. cb11.push_back(1);
  546. cb11.push_back(2);
  547. MyInteger::set_exception_trigger(2);
  548. BOOST_TEST_THROWS(cb11.rinsert(cb11.begin(), 1), std::exception);
  549. circular_buffer<MyInteger> cb12(5, 1);
  550. MyInteger::set_exception_trigger(3);
  551. BOOST_TEST_THROWS(cb12.assign(4, 2), std::exception);
  552. circular_buffer<MyInteger> cb13(5, 1);
  553. MyInteger::set_exception_trigger(3);
  554. BOOST_TEST_THROWS(cb13.assign(6, 2), std::exception);
  555. circular_buffer<MyInteger> cb14(5);
  556. cb14.push_back(1);
  557. cb14.push_back(2);
  558. MyInteger::set_exception_trigger(3);
  559. BOOST_TEST_THROWS(cb14.insert(cb14.begin(), 10, 3), std::exception);
  560. circular_buffer<MyInteger> cb15(5);
  561. cb15.push_back(1);
  562. cb15.push_back(2);
  563. MyInteger::set_exception_trigger(3);
  564. BOOST_TEST_THROWS(cb15.insert(cb15.end(), 10, 3), std::exception);
  565. circular_buffer<MyInteger> cb16(5);
  566. cb16.push_back(1);
  567. cb16.push_back(2);
  568. MyInteger::set_exception_trigger(3);
  569. BOOST_TEST_THROWS(cb16.rinsert(cb16.begin(), 10, 3), std::exception);
  570. circular_buffer<MyInteger> cb17(5);
  571. cb17.push_back(1);
  572. cb17.push_back(2);
  573. MyInteger::set_exception_trigger(3);
  574. BOOST_TEST_THROWS(cb17.rinsert(cb17.end(), 10, 3), std::exception);
  575. circular_buffer<MyInteger> cb18(5, 0);
  576. cb18.push_back(1);
  577. cb18.push_back(2);
  578. cb18.pop_front();
  579. MyInteger::set_exception_trigger(4);
  580. BOOST_TEST_THROWS(cb18.linearize(), std::exception);
  581. circular_buffer<MyInteger> cb19(5, 0);
  582. cb19.push_back(1);
  583. cb19.push_back(2);
  584. MyInteger::set_exception_trigger(5);
  585. BOOST_TEST_THROWS(cb19.linearize(), std::exception);
  586. circular_buffer<MyInteger> cb20(5, 0);
  587. cb20.push_back(1);
  588. cb20.push_back(2);
  589. MyInteger::set_exception_trigger(6);
  590. BOOST_TEST_THROWS(cb20.linearize(), std::exception);
  591. circular_buffer<MyInteger> cb21(5);
  592. cb21.push_back(1);
  593. cb21.push_back(2);
  594. cb21.push_back(3);
  595. MyInteger::set_exception_trigger(2);
  596. BOOST_TEST_THROWS(cb21.insert(cb21.begin() + 1, 4), std::exception);
  597. circular_buffer<MyInteger> cb22(5);
  598. cb22.push_back(1);
  599. cb22.push_back(2);
  600. cb22.push_back(3);
  601. MyInteger::set_exception_trigger(2);
  602. BOOST_TEST_THROWS(cb22.insert(cb22.end(), 4), std::exception);
  603. circular_buffer<MyInteger> cb23(5, 0);
  604. MyInteger::set_exception_trigger(2);
  605. BOOST_TEST_THROWS(cb23.insert(cb23.begin() + 1, 4), std::exception);
  606. circular_buffer<MyInteger> cb24(5);
  607. cb24.push_back(1);
  608. cb24.push_back(2);
  609. cb24.push_back(3);
  610. MyInteger::set_exception_trigger(2);
  611. BOOST_TEST_THROWS(cb24.rinsert(cb24.begin() + 1, 4), std::exception);
  612. circular_buffer<MyInteger> cb25(5, 0);
  613. MyInteger::set_exception_trigger(2);
  614. BOOST_TEST_THROWS(cb25.rinsert(cb25.begin() + 3, 4), std::exception);
  615. circular_buffer<MyInteger> cb26(5);
  616. cb26.push_back(1);
  617. cb26.push_back(2);
  618. MyInteger::set_exception_trigger(5);
  619. BOOST_TEST_THROWS(cb26.insert(cb26.begin(), 10, 3), std::exception);
  620. circular_buffer<MyInteger> cb27(5);
  621. cb27.push_back(1);
  622. cb27.push_back(2);
  623. MyInteger::set_exception_trigger(5);
  624. BOOST_TEST_THROWS(cb27.insert(cb27.end(), 10, 3), std::exception);
  625. circular_buffer<MyInteger> cb28(5);
  626. cb28.push_back(1);
  627. cb28.push_back(2);
  628. MyInteger::set_exception_trigger(5);
  629. BOOST_TEST_THROWS(cb28.rinsert(cb28.begin(), 10, 3), std::exception);
  630. circular_buffer<MyInteger> cb29(5);
  631. cb29.push_back(1);
  632. cb29.push_back(2);
  633. MyInteger::set_exception_trigger(5);
  634. BOOST_TEST_THROWS(cb29.rinsert(cb29.end(), 10, 3), std::exception);
  635. circular_buffer<MyInteger> cb30(10);
  636. cb30.push_back(1);
  637. cb30.push_back(2);
  638. cb30.push_back(3);
  639. MyInteger::set_exception_trigger(2);
  640. BOOST_TEST_THROWS(cb30.rinsert(cb30.begin(), 10, 3), std::exception);
  641. #endif // #if !defined(BOOST_NO_EXCEPTIONS)
  642. }
  643. void move_container_values_except() {
  644. move_container_values_impl<noncopyable_movable_except_t>();
  645. }
  646. template <class T>
  647. void move_container_values_resetting_impl() {
  648. typedef T noncopyable_movable_test_t;
  649. CB_CONTAINER<noncopyable_movable_test_t> cb1(1);
  650. noncopyable_movable_test_t var;
  651. cb1.push_back();
  652. cb1.push_back(boost::move(var));
  653. BOOST_TEST(!cb1.back().is_moved());
  654. BOOST_TEST(var.is_moved());
  655. BOOST_TEST(cb1.size() == 1);
  656. var = boost::move(cb1.back());
  657. BOOST_TEST(cb1.back().is_moved());
  658. cb1.push_front(boost::move(var));
  659. BOOST_TEST(!cb1.front().is_moved());
  660. BOOST_TEST(var.is_moved());
  661. BOOST_TEST(cb1.size() == 1);
  662. var = boost::move(cb1.back());
  663. BOOST_TEST(cb1.back().is_moved());
  664. cb1.push_back();
  665. BOOST_TEST(!cb1.back().is_moved());
  666. BOOST_TEST(cb1.size() == 1);
  667. var = boost::move(cb1.back());
  668. BOOST_TEST(cb1.back().is_moved());
  669. cb1.push_front();
  670. BOOST_TEST(!cb1.front().is_moved());
  671. BOOST_TEST(cb1.size() == 1);
  672. var = boost::move(cb1.back());
  673. BOOST_TEST(cb1.back().is_moved());
  674. cb1.insert(cb1.begin());
  675. // If the circular_buffer is full and the pos points to begin(),
  676. // then the item will not be inserted.
  677. BOOST_TEST(cb1.front().is_moved());
  678. BOOST_TEST(cb1.size() == 1);
  679. var = boost::move(cb1.back());
  680. BOOST_TEST(cb1.back().is_moved());
  681. cb1.insert(cb1.begin(), boost::move(var));
  682. // If the circular_buffer is full and the pos points to begin(),
  683. // then the item will not be inserted.
  684. BOOST_TEST(cb1.front().is_moved());
  685. BOOST_TEST(cb1.size() == 1);
  686. var = boost::move(cb1.back());
  687. BOOST_TEST(cb1.back().is_moved());
  688. cb1.rinsert(cb1.begin());
  689. BOOST_TEST(!cb1.back().is_moved());
  690. BOOST_TEST(cb1.size() == 1);
  691. var = boost::move(cb1.back());
  692. BOOST_TEST(cb1.back().is_moved());
  693. var.reinit();
  694. cb1.rinsert(cb1.begin(), boost::move(var));
  695. BOOST_TEST(!cb1.back().is_moved());
  696. BOOST_TEST(cb1.size() == 1);
  697. var = boost::move(cb1.back());
  698. BOOST_TEST(cb1.back().is_moved());
  699. cb1.rinsert(cb1.end());
  700. BOOST_TEST(cb1.back().is_moved());
  701. BOOST_TEST(cb1.size() == 1);
  702. var = boost::move(cb1.back());
  703. BOOST_TEST(cb1.back().is_moved());
  704. var.reinit();
  705. cb1.rinsert(cb1.end(), boost::move(var));
  706. BOOST_TEST(cb1.back().is_moved());
  707. BOOST_TEST(cb1.size() == 1);
  708. var = boost::move(cb1.back());
  709. BOOST_TEST(cb1.back().is_moved());
  710. cb1.push_back();
  711. BOOST_TEST(!cb1[0].is_moved());
  712. const int val = cb1[0].value();
  713. cb1.linearize();
  714. BOOST_TEST(!cb1[0].is_moved());
  715. BOOST_TEST(cb1[0].value() == val);
  716. cb1.rotate(cb1.begin());
  717. BOOST_TEST(!cb1[0].is_moved());
  718. BOOST_TEST(cb1[0].value() == val);
  719. }
  720. void move_container_values_resetting_except() {
  721. move_container_values_resetting_impl<noncopyable_movable_except_t>();
  722. }
  723. void move_container_values_resetting_noexcept() {
  724. move_container_values_resetting_impl<noncopyable_movable_noexcept_t>();
  725. }
  726. // test main
  727. int main()
  728. {
  729. run_common_tests();
  730. iterator_constructor_and_assign_test();
  731. iterator_reference_test();
  732. iterator_difference_test();
  733. iterator_increment_test();
  734. iterator_decrement_test();
  735. iterator_addition_test();
  736. iterator_subtraction_test();
  737. iterator_element_access_test();
  738. iterator_comparison_test();
  739. iterator_invalidation_test();
  740. exception_safety_test();
  741. move_container_values_except();
  742. move_container_values_resetting_except();
  743. move_container_values_resetting_noexcept();
  744. return boost::report_errors();
  745. }