common.ipp 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497
  1. // Common tests for the circular buffer and its adaptor.
  2. // Copyright (c) 2003-2008 Jan Gaspar
  3. // Copyright (c) 2013 Antony Polukhin
  4. // Copyright 2014,2018 Glen Joseph Fernandes
  5. // (glenjofe@gmail.com)
  6. // Use, modification, and distribution is subject to the Boost Software
  7. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #include <boost/type_traits/is_nothrow_move_constructible.hpp>
  10. #include <boost/type_traits/is_nothrow_move_assignable.hpp>
  11. #include <boost/type_traits/has_nothrow_constructor.hpp>
  12. template <class Alloc>
  13. void generic_test(CB_CONTAINER<MyInteger, Alloc>& cb) {
  14. vector<int> v;
  15. v.push_back(11);
  16. v.push_back(12);
  17. v.push_back(13);
  18. v.push_back(14);
  19. v.push_back(15);
  20. v.push_back(16);
  21. v.push_back(17);
  22. if (cb.capacity() == 0) {
  23. cb.insert(cb.begin(), 1);
  24. cb.insert(cb.begin(), v.begin(), v.end());
  25. cb.rinsert(cb.end(), 2);
  26. cb.rinsert(cb.end(), v.begin(), v.end());
  27. cb.push_back(3);
  28. cb.push_front(4);
  29. cb.linearize();
  30. BOOST_TEST(cb.empty());
  31. BOOST_TEST(cb.full());
  32. } else {
  33. cb.insert(cb.end(), 1);
  34. BOOST_TEST(!cb.empty());
  35. BOOST_TEST(cb[cb.size() - 1] == 1);
  36. size_t size = cb.size();
  37. cb.rerase(cb.end() - 1, cb.end());
  38. BOOST_TEST(size == cb.size() + 1);
  39. cb.insert(cb.end(), v.begin(), v.end());
  40. BOOST_TEST(!cb.empty());
  41. BOOST_TEST(cb[cb.size() - 1] == 17);
  42. size = cb.size();
  43. cb.erase(cb.end() - 1, cb.end());
  44. BOOST_TEST(size == cb.size() + 1);
  45. size = cb.size();
  46. cb.rinsert(cb.begin(), 2);
  47. BOOST_TEST(size + 1 == cb.size());
  48. BOOST_TEST(cb[0] == 2);
  49. size = cb.size();
  50. cb.erase(cb.begin());
  51. BOOST_TEST(size == cb.size() + 1);
  52. cb.rinsert(cb.begin(), v.begin(), v.end());
  53. BOOST_TEST(!cb.empty());
  54. BOOST_TEST(cb[0] == 11);
  55. size = cb.size();
  56. cb.pop_front();
  57. BOOST_TEST(size == cb.size() + 1);
  58. cb.push_back(3);
  59. BOOST_TEST(!cb.empty());
  60. BOOST_TEST(cb[cb.size() - 1] == 3);
  61. size = cb.size();
  62. cb.pop_back();
  63. BOOST_TEST(size == cb.size() + 1);
  64. cb.push_front(4);
  65. BOOST_TEST(!cb.empty());
  66. BOOST_TEST(cb[0] == 4);
  67. cb.linearize();
  68. BOOST_TEST(!cb.empty());
  69. BOOST_TEST(cb[0] == 4);
  70. size = cb.size();
  71. cb.rerase(cb.begin());
  72. BOOST_TEST(size == cb.size() + 1);
  73. }
  74. }
  75. void basic_test() {
  76. vector<int> v;
  77. v.push_back(1);
  78. v.push_back(2);
  79. v.push_back(3);
  80. v.push_back(4);
  81. v.push_back(5);
  82. v.push_back(6);
  83. v.push_back(7);
  84. CB_CONTAINER<MyInteger> cb1(3, v.begin(), v.end());
  85. CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.end());
  86. CB_CONTAINER<MyInteger> cb3(7, v.begin(), v.end());
  87. BOOST_TEST(cb1.full());
  88. BOOST_TEST(cb1.capacity() == 3);
  89. BOOST_TEST(cb1.size() == 3);
  90. BOOST_TEST(cb1[0] == 5);
  91. BOOST_TEST(cb1[2] == 7);
  92. BOOST_TEST(!cb2.full());
  93. BOOST_TEST(cb2[2] == 3);
  94. BOOST_TEST(cb3.full());
  95. BOOST_TEST(cb3[0] == 1);
  96. BOOST_TEST(cb3[6] == 7);
  97. generic_test(cb1);
  98. generic_test(cb2);
  99. generic_test(cb3);
  100. }
  101. void constructor_and_element_access_test() {
  102. CB_CONTAINER<int> cb(5, 3);
  103. cb[1] = 10;
  104. BOOST_TEST(cb.full());
  105. BOOST_TEST(cb[1] == 10);
  106. BOOST_TEST(cb[4] == 3);
  107. }
  108. void size_test() {
  109. CB_CONTAINER<MyInteger> cb1(3);
  110. cb1.push_back(1);
  111. cb1.push_back(2);
  112. cb1.push_back(3);
  113. cb1.push_back(4);
  114. CB_CONTAINER<MyInteger> cb2(5);
  115. BOOST_TEST(cb1.size() == 3);
  116. BOOST_TEST(cb2.size() == 0);
  117. BOOST_TEST(cb1.max_size() == cb2.max_size());
  118. generic_test(cb1);
  119. generic_test(cb2);
  120. }
  121. template<class T>
  122. class my_allocator {
  123. public:
  124. typedef T value_type;
  125. typedef std::size_t size_type;
  126. typedef std::ptrdiff_t difference_type;
  127. private:
  128. template<class U>
  129. struct const_pointer_;
  130. template<class U>
  131. struct pointer_ {
  132. pointer_() : hidden_ptr_(0) {}
  133. pointer_(void* p) : hidden_ptr_(static_cast<U*>(p)) {}
  134. difference_type operator-(const const_pointer_<U>& rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
  135. difference_type operator-(pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
  136. pointer_ operator-(size_type rhs) const { return hidden_ptr_ - rhs; }
  137. bool operator == (pointer_ rhs) const { return hidden_ptr_ == rhs.hidden_ptr_; }
  138. bool operator != (pointer_ rhs) const { return hidden_ptr_ != rhs.hidden_ptr_; }
  139. bool operator < (pointer_ rhs) const { return hidden_ptr_ < rhs.hidden_ptr_; }
  140. bool operator >= (pointer_ rhs) const { return hidden_ptr_ >= rhs.hidden_ptr_; }
  141. pointer_& operator++() { ++hidden_ptr_; return *this; }
  142. pointer_& operator--() { --hidden_ptr_; return *this; }
  143. pointer_& operator+=(size_type s) { hidden_ptr_ += s; return *this; }
  144. pointer_ operator+(size_type s) const { return hidden_ptr_ + s; }
  145. pointer_ operator++(int) { pointer_ p = *this; ++hidden_ptr_; return p; }
  146. pointer_ operator--(int) { pointer_ p = *this; --hidden_ptr_; return p; }
  147. U& operator*() const { return *hidden_ptr_; }
  148. U* operator->() const { return hidden_ptr_; }
  149. U* hidden_ptr_;
  150. };
  151. template<class U>
  152. struct const_pointer_ {
  153. const_pointer_() : hidden_ptr_(0) {}
  154. const_pointer_(pointer_<U> p) : hidden_ptr_(p.hidden_ptr_) {}
  155. const_pointer_(const void* p) : hidden_ptr_(static_cast<const U*>(p)) {}
  156. difference_type operator-(pointer_<U> rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
  157. difference_type operator-(const_pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; }
  158. const_pointer_ operator-(size_type rhs) const { return hidden_ptr_ - rhs; }
  159. bool operator == (const_pointer_ rhs) const { return hidden_ptr_ == rhs.hidden_ptr_; }
  160. bool operator != (const_pointer_ rhs) const { return hidden_ptr_ != rhs.hidden_ptr_; }
  161. bool operator < (const_pointer_ rhs) const { return hidden_ptr_ < rhs.hidden_ptr_; }
  162. bool operator >= (const_pointer_ rhs) const { return hidden_ptr_ >= rhs.hidden_ptr_; }
  163. const_pointer_& operator++() { ++hidden_ptr_; return *this; }
  164. const_pointer_& operator--() { --hidden_ptr_; return *this; }
  165. const_pointer_& operator+=(size_type s) { hidden_ptr_ += s; return hidden_ptr_; }
  166. const_pointer_ operator+(size_type s) const { return hidden_ptr_ + s; }
  167. const_pointer_ operator++(int) { const_pointer_ p = *this; ++hidden_ptr_; return p; }
  168. const_pointer_ operator--(int) { const_pointer_ p = *this; --hidden_ptr_; return p; }
  169. const U& operator*() const { return *hidden_ptr_; }
  170. const U* hidden_ptr_;
  171. };
  172. public:
  173. typedef pointer_<T> pointer;
  174. typedef const_pointer_<T> const_pointer;
  175. template<class T2>
  176. struct rebind
  177. {
  178. typedef my_allocator<T2> other;
  179. };
  180. pointer allocate(size_type count) {
  181. return pointer(::operator new(count * sizeof(value_type)));
  182. }
  183. void deallocate(const pointer& ptr, size_type)
  184. { ::operator delete(ptr.hidden_ptr_); }
  185. template<class P>
  186. void construct(value_type* ptr, BOOST_FWD_REF(P) p)
  187. { ::new((void*)ptr) value_type(::boost::forward<P>(p)); }
  188. void destroy(value_type* ptr)
  189. { ptr->~value_type(); }
  190. size_type max_size() const {
  191. return ~static_cast<size_type>(0) / sizeof(size_type);
  192. }
  193. };
  194. void allocator_test() {
  195. CB_CONTAINER<MyInteger> cb1(10, 0);
  196. const CB_CONTAINER<MyInteger> cb2(10, 0);
  197. CB_CONTAINER<MyInteger>::allocator_type& alloc_ref = cb1.get_allocator();
  198. CB_CONTAINER<MyInteger>::allocator_type alloc = cb2.get_allocator();
  199. alloc_ref.max_size();
  200. alloc.max_size();
  201. generic_test(cb1);
  202. CB_CONTAINER<MyInteger, my_allocator<MyInteger> > cb_a(10, 0);
  203. generic_test(cb_a);
  204. }
  205. #if !defined(BOOST_CB_NO_CXX11_ALLOCATOR)
  206. template<class T>
  207. class cxx11_allocator {
  208. public:
  209. typedef T value_type;
  210. cxx11_allocator() {
  211. }
  212. template<class U>
  213. cxx11_allocator(const cxx11_allocator<U> &) {
  214. }
  215. T* allocate(std::size_t n) {
  216. return static_cast<T*>(::operator new(n * sizeof(T)));
  217. }
  218. void deallocate(T * p, std::size_t n) {
  219. ::operator delete( p );
  220. }
  221. };
  222. void cxx11_allocator_test() {
  223. CB_CONTAINER<MyInteger, cxx11_allocator<MyInteger> > cb(10, 0);
  224. generic_test(cb);
  225. }
  226. #endif
  227. void begin_and_end_test() {
  228. vector<int> v;
  229. v.push_back(11);
  230. v.push_back(12);
  231. v.push_back(13);
  232. CB_CONTAINER<MyInteger> cb1(10, v.begin(), v.end());
  233. const CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.end());
  234. CB_CONTAINER<MyInteger> cb3(10);
  235. cb3.push_back(1);
  236. cb3.push_back(2);
  237. cb3.insert(cb3.begin(), 3);
  238. int i = 0;
  239. CB_CONTAINER<MyInteger>::const_iterator it = cb3.begin();
  240. for (; it != cb3.end(); it++) {
  241. i += *it;
  242. }
  243. CB_CONTAINER<MyInteger> cb4(20);
  244. const CB_CONTAINER<MyInteger> cb5(20);
  245. BOOST_TEST(*cb1.begin() == 11);
  246. BOOST_TEST(*cb2.begin() == 11);
  247. BOOST_TEST(i == 6);
  248. BOOST_TEST(cb4.begin() == cb4.end());
  249. BOOST_TEST(cb5.begin() == cb5.end());
  250. generic_test(cb1);
  251. generic_test(cb3);
  252. generic_test(cb4);
  253. }
  254. void rbegin_and_rend_test() {
  255. vector<int> v;
  256. v.push_back(11);
  257. v.push_back(12);
  258. v.push_back(13);
  259. CB_CONTAINER<MyInteger> cb1(10, v.begin(), v.end());
  260. const CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.end());
  261. CB_CONTAINER<MyInteger> cb3(3);
  262. cb3.push_back(1);
  263. cb3.push_back(2);
  264. cb3.insert(cb3.begin(), 3);
  265. cb3.push_back(1);
  266. int i = 0;
  267. CB_CONTAINER<MyInteger>::reverse_iterator it = cb3.rbegin();
  268. for (; it != cb3.rend(); it++) {
  269. i += *it;
  270. }
  271. CB_CONTAINER<MyInteger> cb4(20);
  272. const CB_CONTAINER<MyInteger> cb5(20);
  273. BOOST_TEST(*cb1.rbegin() == 13);
  274. BOOST_TEST(*cb2.rbegin() == 13);
  275. BOOST_TEST(i == 4);
  276. BOOST_TEST(cb4.rbegin() == cb4.rend());
  277. BOOST_TEST(cb5.rbegin() == cb5.rend());
  278. generic_test(cb1);
  279. generic_test(cb3);
  280. generic_test(cb4);
  281. }
  282. void element_access_and_insert_test() {
  283. CB_CONTAINER<MyInteger> cb(3);
  284. cb.push_back(1);
  285. cb.push_back(2);
  286. cb.insert(cb.begin(), 3);
  287. cb.push_back(4);
  288. const CB_CONTAINER<MyInteger> ccb = cb;
  289. BOOST_TEST(cb[0] == 1);
  290. BOOST_TEST(cb[1] == 2);
  291. BOOST_TEST(cb[2] == 4);
  292. BOOST_TEST(ccb[2] == 4);
  293. generic_test(cb);
  294. }
  295. void at_test() {
  296. #if !defined(BOOST_NO_EXCEPTIONS)
  297. CB_CONTAINER<MyInteger> cb(3);
  298. cb.push_back(1);
  299. try {
  300. BOOST_TEST(cb.at(0) == 1);
  301. }
  302. catch (out_of_range&) {
  303. BOOST_ERROR("An unexpected exception has been thrown!");
  304. }
  305. BOOST_TEST_THROWS(cb.at(2), out_of_range);
  306. generic_test(cb);
  307. #endif // #if !defined(BOOST_NO_EXCEPTIONS)
  308. }
  309. void front_and_back_test() {
  310. CB_CONTAINER<MyInteger> cb(1);
  311. cb.push_back(2);
  312. cb.push_back(3);
  313. BOOST_TEST(cb.front() == cb.back());
  314. BOOST_TEST(cb.back() == 3);
  315. generic_test(cb);
  316. }
  317. void linearize_test() {
  318. vector<int> v;
  319. v.push_back(1);
  320. v.push_back(2);
  321. v.push_back(3);
  322. v.push_back(4);
  323. v.push_back(5);
  324. v.push_back(6);
  325. v.push_back(7);
  326. v.push_back(8);
  327. v.push_back(9);
  328. v.push_back(10);
  329. v.push_back(11);
  330. v.push_back(12);
  331. CB_CONTAINER<MyInteger> cb1(10, v.begin(), v.begin() + 10);
  332. cb1.push_back(11);
  333. cb1.push_back(12);
  334. cb1.push_back(13);
  335. CB_CONTAINER<MyInteger> cb2(10, v.begin(), v.begin() + 10);
  336. cb2.push_back(11);
  337. cb2.push_back(12);
  338. cb2.push_back(13);
  339. cb2.push_back(14);
  340. cb2.push_back(15);
  341. cb2.push_back(16);
  342. cb2.push_back(17);
  343. CB_CONTAINER<MyInteger> cb3(10, v.begin(), v.begin() + 10);
  344. cb3.push_back(11);
  345. cb3.push_back(12);
  346. cb3.push_back(13);
  347. cb3.pop_front();
  348. cb3.pop_front();
  349. CB_CONTAINER<MyInteger> cb4(5);
  350. CB_CONTAINER<MyInteger> cb5(12, v.begin(), v.end());
  351. cb5.push_back(13);
  352. cb5.push_back(14);
  353. cb5.push_back(15);
  354. cb5.pop_front();
  355. cb5.pop_front();
  356. cb5.pop_front();
  357. cb5.pop_front();
  358. cb5.pop_front();
  359. cb5.pop_front();
  360. CB_CONTAINER<MyInteger> cb6(6);
  361. cb6.push_back(-2);
  362. cb6.push_back(-1);
  363. cb6.push_back(0);
  364. cb6.push_back(1);
  365. cb6.push_back(2);
  366. cb6.push_back(3);
  367. cb6.push_back(4);
  368. cb6.push_back(5);
  369. cb6.push_back(6);
  370. cb6.pop_back();
  371. CB_CONTAINER<MyInteger> cb7(6);
  372. cb7.push_back(0);
  373. cb7.push_back(1);
  374. cb7.push_back(2);
  375. cb7.push_back(3);
  376. cb7.push_back(4);
  377. BOOST_TEST(!cb1.is_linearized());
  378. BOOST_TEST(*cb1.linearize() == 4);
  379. BOOST_TEST(cb1.is_linearized());
  380. BOOST_TEST(cb1.linearize() == cb1.array_one().first);
  381. BOOST_TEST(&cb1[0] < &cb1[1]
  382. && &cb1[1] < &cb1[2]
  383. && &cb1[2] < &cb1[3]
  384. && &cb1[3] < &cb1[4]
  385. && &cb1[4] < &cb1[5]
  386. && &cb1[5] < &cb1[6]
  387. && &cb1[6] < &cb1[7]
  388. && &cb1[7] < &cb1[8]
  389. && &cb1[8] < &cb1[9]);
  390. BOOST_TEST(*(cb1.linearize() + 1) == 5);
  391. BOOST_TEST(*(cb1.linearize() + 2) == 6);
  392. BOOST_TEST(*(cb1.linearize() + 3) == 7);
  393. BOOST_TEST(*(cb1.linearize() + 4) == 8);
  394. BOOST_TEST(*(cb1.linearize() + 5) == 9);
  395. BOOST_TEST(*(cb1.linearize() + 6) == 10);
  396. BOOST_TEST(*(cb1.linearize() + 7) == 11);
  397. BOOST_TEST(*(cb1.linearize() + 8) == 12);
  398. BOOST_TEST(*(cb1.linearize() + 9) == 13);
  399. BOOST_TEST(!cb2.is_linearized());
  400. BOOST_TEST(*cb2.linearize() == 8);
  401. BOOST_TEST(cb2.is_linearized());
  402. BOOST_TEST(&cb2[0] < &cb2[1]
  403. && &cb2[1] < &cb2[2]
  404. && &cb2[2] < &cb2[3]
  405. && &cb2[3] < &cb2[4]
  406. && &cb2[4] < &cb2[5]
  407. && &cb2[5] < &cb2[6]
  408. && &cb2[6] < &cb2[7]
  409. && &cb2[7] < &cb2[8]
  410. && &cb2[8] < &cb2[9]);
  411. BOOST_TEST(*(cb2.linearize() + 1) == 9);
  412. BOOST_TEST(*(cb2.linearize() + 2) == 10);
  413. BOOST_TEST(*(cb2.linearize() + 3) == 11);
  414. BOOST_TEST(*(cb2.linearize() + 4) == 12);
  415. BOOST_TEST(*(cb2.linearize() + 5) == 13);
  416. BOOST_TEST(*(cb2.linearize() + 6) == 14);
  417. BOOST_TEST(*(cb2.linearize() + 7) == 15);
  418. BOOST_TEST(*(cb2.linearize() + 8) == 16);
  419. BOOST_TEST(*(cb2.linearize() + 9) == 17);
  420. BOOST_TEST(cb2.is_linearized());
  421. BOOST_TEST(*cb3.linearize() == 6);
  422. BOOST_TEST(cb3.is_linearized());
  423. BOOST_TEST(&cb3[0] < &cb3[1]
  424. && &cb3[1] < &cb3[2]
  425. && &cb3[2] < &cb3[3]
  426. && &cb3[3] < &cb3[4]
  427. && &cb3[4] < &cb3[5]
  428. && &cb3[5] < &cb3[6]
  429. && &cb3[6] < &cb3[7]);
  430. BOOST_TEST(*(cb3.linearize() + 1) == 7);
  431. BOOST_TEST(*(cb3.linearize() + 2) == 8);
  432. BOOST_TEST(*(cb3.linearize() + 3) == 9);
  433. BOOST_TEST(*(cb3.linearize() + 4) == 10);
  434. BOOST_TEST(*(cb3.linearize() + 5) == 11);
  435. BOOST_TEST(*(cb3.linearize() + 6) == 12);
  436. BOOST_TEST(*(cb3.linearize() + 7) == 13);
  437. BOOST_TEST(cb4.linearize() == 0);
  438. BOOST_TEST(cb4.is_linearized());
  439. BOOST_TEST(*cb5.linearize() == 10);
  440. BOOST_TEST(cb5.is_linearized());
  441. BOOST_TEST(&cb5[0] < &cb5[1]
  442. && &cb5[1] < &cb5[2]
  443. && &cb5[2] < &cb5[3]
  444. && &cb5[3] < &cb5[4]
  445. && &cb5[4] < &cb5[5]);
  446. BOOST_TEST(*(cb5.linearize() + 1) == 11);
  447. BOOST_TEST(*(cb5.linearize() + 2) == 12);
  448. BOOST_TEST(*(cb5.linearize() + 3) == 13);
  449. BOOST_TEST(*(cb5.linearize() + 4) == 14);
  450. BOOST_TEST(*(cb5.linearize() + 5) == 15);
  451. BOOST_TEST(*cb6.linearize() == 1);
  452. BOOST_TEST(cb6.is_linearized());
  453. BOOST_TEST(&cb6[0] < &cb6[1]
  454. && &cb6[1] < &cb6[2]
  455. && &cb6[2] < &cb6[3]
  456. && &cb6[3] < &cb6[4]);
  457. BOOST_TEST(*(cb6.linearize() + 1) == 2);
  458. BOOST_TEST(*(cb6.linearize() + 2) == 3);
  459. BOOST_TEST(*(cb6.linearize() + 3) == 4);
  460. BOOST_TEST(*(cb6.linearize() + 4) == 5);
  461. BOOST_TEST(cb7.is_linearized());
  462. generic_test(cb1);
  463. generic_test(cb2);
  464. generic_test(cb3);
  465. generic_test(cb4);
  466. generic_test(cb5);
  467. generic_test(cb6);
  468. generic_test(cb7);
  469. }
  470. void array_range_test() {
  471. CB_CONTAINER<MyInteger> cb(7);
  472. CB_CONTAINER<MyInteger>::array_range a1 = cb.array_one();
  473. CB_CONTAINER<MyInteger>::array_range a2 = cb.array_two();
  474. CB_CONTAINER<MyInteger>::const_array_range ca1 = cb.array_one();
  475. CB_CONTAINER<MyInteger>::const_array_range ca2 = cb.array_two();
  476. BOOST_TEST(a1.second == 0);
  477. BOOST_TEST(a2.second == 0);
  478. BOOST_TEST(ca1.second == 0);
  479. BOOST_TEST(ca2.second == 0);
  480. cb.push_back(1);
  481. cb.push_back(2);
  482. cb.push_back(3);
  483. a1 = cb.array_one();
  484. a2 = cb.array_two();
  485. ca1 = cb.array_one();
  486. ca2 = cb.array_two();
  487. BOOST_TEST(a1.first[0] == 1);
  488. BOOST_TEST(a1.first[2] == 3);
  489. BOOST_TEST(ca1.first[0] == 1);
  490. BOOST_TEST(ca1.first[2] == 3);
  491. BOOST_TEST(a1.second == 3);
  492. BOOST_TEST(a2.second == 0);
  493. BOOST_TEST(ca1.second == 3);
  494. BOOST_TEST(ca2.second == 0);
  495. cb.push_back(4);
  496. cb.push_back(5);
  497. cb.push_back(6);
  498. cb.push_back(7);
  499. cb.push_back(8);
  500. cb.push_back(9);
  501. cb.push_back(10);
  502. a1 = cb.array_one();
  503. a2 = cb.array_two();
  504. ca1 = cb.array_one();
  505. ca2 = cb.array_two();
  506. BOOST_TEST(a1.first[0] == 4);
  507. BOOST_TEST(a1.first[3] == 7);
  508. BOOST_TEST(a2.first[0] == 8);
  509. BOOST_TEST(a2.first[2] == 10);
  510. BOOST_TEST(ca1.first[0] == 4);
  511. BOOST_TEST(ca1.first[3] == 7);
  512. BOOST_TEST(ca2.first[0] == 8);
  513. BOOST_TEST(ca2.first[2] == 10);
  514. BOOST_TEST(a1.second == 4);
  515. BOOST_TEST(a2.second == 3);
  516. BOOST_TEST(ca1.second == 4);
  517. BOOST_TEST(ca2.second == 3);
  518. cb.pop_front();
  519. cb.pop_back();
  520. a1 = cb.array_one();
  521. a2 = cb.array_two();
  522. ca1 = cb.array_one();
  523. ca2 = cb.array_two();
  524. BOOST_TEST(a1.first[0] == 5);
  525. BOOST_TEST(a1.first[2] == 7);
  526. BOOST_TEST(a2.first[0] == 8);
  527. BOOST_TEST(a2.first[1] == 9);
  528. BOOST_TEST(ca1.first[0] == 5);
  529. BOOST_TEST(ca1.first[2] == 7);
  530. BOOST_TEST(ca2.first[0] == 8);
  531. BOOST_TEST(ca2.first[1] == 9);
  532. BOOST_TEST(a1.second == 3);
  533. BOOST_TEST(a2.second == 2);
  534. BOOST_TEST(ca1.second == 3);
  535. BOOST_TEST(ca2.second == 2);
  536. cb.pop_back();
  537. cb.pop_back();
  538. cb.pop_back();
  539. a1 = cb.array_one();
  540. a2 = cb.array_two();
  541. ca1 = cb.array_one();
  542. ca2 = cb.array_two();
  543. BOOST_TEST(a1.first[0] == 5);
  544. BOOST_TEST(a1.first[1] == 6);
  545. BOOST_TEST(ca1.first[0] == 5);
  546. BOOST_TEST(ca1.first[1] == 6);
  547. BOOST_TEST(a1.second == 2);
  548. BOOST_TEST(a2.second == 0);
  549. BOOST_TEST(ca1.second == 2);
  550. BOOST_TEST(ca2.second == 0);
  551. CB_CONTAINER<MyInteger> cb0(0);
  552. a1 = cb0.array_one();
  553. a2 = cb0.array_two();
  554. BOOST_TEST(a1.second == 0);
  555. BOOST_TEST(a2.second == 0);
  556. const CB_CONTAINER<MyInteger> ccb(10, 1);
  557. ca1 = ccb.array_one();
  558. ca2 = ccb.array_two();
  559. BOOST_TEST(ca1.second == 10);
  560. BOOST_TEST(*(ca1.first) == 1);
  561. BOOST_TEST(ca2.second == 0);
  562. generic_test(cb);
  563. generic_test(cb0);
  564. }
  565. void capacity_and_reserve_test() {
  566. CB_CONTAINER<MyInteger> cb1(0);
  567. CB_CONTAINER<MyInteger> cb2(10);
  568. BOOST_TEST(cb1.capacity() == 0);
  569. BOOST_TEST(cb1.size() == 0);
  570. BOOST_TEST(cb1.reserve() == 0);
  571. BOOST_TEST(cb1.full());
  572. BOOST_TEST(cb1.empty());
  573. BOOST_TEST(cb1.reserve() == cb1.capacity() - cb1.size());
  574. BOOST_TEST(cb2.capacity() == 10);
  575. BOOST_TEST(cb2.size() == 0);
  576. BOOST_TEST(cb2.reserve() == 10);
  577. BOOST_TEST(cb2.reserve() == cb2.capacity() - cb2.size());
  578. cb1.push_back(1);
  579. cb2.push_back(2);
  580. cb2.push_back(2);
  581. cb2.push_back(2);
  582. BOOST_TEST(cb1.capacity() == 0);
  583. BOOST_TEST(cb1.size() == 0);
  584. BOOST_TEST(cb1.reserve() == 0);
  585. BOOST_TEST(cb1.full());
  586. BOOST_TEST(cb1.empty());
  587. BOOST_TEST(cb1.reserve() == cb1.capacity() - cb1.size());
  588. BOOST_TEST(cb2.capacity() == 10);
  589. BOOST_TEST(cb2.size() == 3);
  590. BOOST_TEST(cb2.reserve() == 7);
  591. BOOST_TEST(cb2.reserve() == cb2.capacity() - cb2.size());
  592. generic_test(cb1);
  593. generic_test(cb2);
  594. }
  595. void full_and_empty_test() {
  596. CB_CONTAINER<MyInteger> cb1(10);
  597. CB_CONTAINER<MyInteger> cb2(3);
  598. CB_CONTAINER<MyInteger> cb3(2);
  599. CB_CONTAINER<MyInteger> cb4(2);
  600. cb2.push_back(1);
  601. cb2.push_back(3);
  602. cb2.push_back(1);
  603. cb2.push_back(1);
  604. cb2.push_back(1);
  605. cb3.push_back(3);
  606. cb3.push_back(1);
  607. cb4.push_back(1);
  608. BOOST_TEST(cb1.empty());
  609. BOOST_TEST(cb2.full());
  610. BOOST_TEST(cb3.full());
  611. BOOST_TEST(!cb4.empty());
  612. BOOST_TEST(!cb4.full());
  613. generic_test(cb1);
  614. generic_test(cb2);
  615. generic_test(cb3);
  616. generic_test(cb4);
  617. }
  618. void set_capacity_test() {
  619. CB_CONTAINER<MyInteger> cb1(10);
  620. cb1.push_back(2);
  621. cb1.push_back(3);
  622. cb1.push_back(1);
  623. cb1.set_capacity(5);
  624. CB_CONTAINER<MyInteger> cb2(3);
  625. cb2.push_back(2);
  626. cb2.push_back(3);
  627. cb2.push_back(1);
  628. cb2.set_capacity(10);
  629. CB_CONTAINER<MyInteger> cb3(5);
  630. cb3.push_back(2);
  631. cb3.push_back(3);
  632. cb3.push_back(1);
  633. cb3.set_capacity(2);
  634. BOOST_TEST(cb1.size() == 3);
  635. BOOST_TEST(cb1[0] == 2);
  636. BOOST_TEST(cb1[2] == 1);
  637. BOOST_TEST(cb1.capacity() == 5);
  638. BOOST_TEST(cb2.size() == 3);
  639. BOOST_TEST(cb2[0] == 2);
  640. BOOST_TEST(cb2[2] == 1);
  641. BOOST_TEST(cb2.capacity() == 10);
  642. BOOST_TEST(cb3.size() == 2);
  643. BOOST_TEST(cb3[0] == 2);
  644. BOOST_TEST(cb3[1] == 3);
  645. BOOST_TEST(cb3.capacity() == 2);
  646. cb3.set_capacity(2);
  647. BOOST_TEST(cb3.size() == 2);
  648. BOOST_TEST(cb3[0] == 2);
  649. BOOST_TEST(cb3[1] == 3);
  650. BOOST_TEST(cb3.capacity() == 2);
  651. cb3.set_capacity(0);
  652. BOOST_TEST(cb3.size() == 0);
  653. BOOST_TEST(cb3.capacity() == 0);
  654. generic_test(cb1);
  655. generic_test(cb2);
  656. generic_test(cb3);
  657. }
  658. void rset_capacity_test() {
  659. CB_CONTAINER<MyInteger> cb1(10);
  660. cb1.push_back(2);
  661. cb1.push_back(3);
  662. cb1.push_back(1);
  663. cb1.rset_capacity(5);
  664. CB_CONTAINER<MyInteger> cb2(3);
  665. cb2.push_back(2);
  666. cb2.push_back(3);
  667. cb2.push_back(1);
  668. cb2.rset_capacity(10);
  669. CB_CONTAINER<MyInteger> cb3(5);
  670. cb3.push_back(2);
  671. cb3.push_back(3);
  672. cb3.push_back(1);
  673. cb3.rset_capacity(2);
  674. BOOST_TEST(cb1.size() == 3);
  675. BOOST_TEST(cb1[0] == 2);
  676. BOOST_TEST(cb1[2] == 1);
  677. BOOST_TEST(cb1.capacity() == 5);
  678. BOOST_TEST(cb2.size() == 3);
  679. BOOST_TEST(cb2[0] == 2);
  680. BOOST_TEST(cb2[2] == 1);
  681. BOOST_TEST(cb2.capacity() == 10);
  682. BOOST_TEST(cb3.size() == 2);
  683. BOOST_TEST(cb3[0] == 3);
  684. BOOST_TEST(cb3[1] == 1);
  685. BOOST_TEST(cb3.capacity() == 2);
  686. cb3.rset_capacity(2);
  687. BOOST_TEST(cb3.size() == 2);
  688. BOOST_TEST(cb3[0] == 3);
  689. BOOST_TEST(cb3[1] == 1);
  690. BOOST_TEST(cb3.capacity() == 2);
  691. cb3.rset_capacity(0);
  692. BOOST_TEST(cb3.size() == 0);
  693. BOOST_TEST(cb3.capacity() == 0);
  694. generic_test(cb1);
  695. generic_test(cb2);
  696. generic_test(cb3);
  697. }
  698. void resize_test() {
  699. CB_CONTAINER<MyInteger> cb1(10);
  700. cb1.push_back(1);
  701. cb1.push_back(2);
  702. cb1.push_back(3);
  703. cb1.push_back(4);
  704. cb1.resize(20, 5);
  705. CB_CONTAINER<MyInteger> cb2(10);
  706. cb2.push_back(1);
  707. cb2.push_back(2);
  708. cb2.push_back(3);
  709. cb2.push_back(4);
  710. cb2.resize(2);
  711. CB_CONTAINER<MyInteger> cb3(10, 1);
  712. cb3.resize(0);
  713. CB_CONTAINER<MyInteger> cb4(10, 1);
  714. cb4.resize(10);
  715. BOOST_TEST(cb1.size() == 20);
  716. BOOST_TEST(cb1.capacity() == 20);
  717. BOOST_TEST(cb1[0] == 1);
  718. BOOST_TEST(cb1[3] == 4);
  719. BOOST_TEST(cb1[4] == 5);
  720. BOOST_TEST(cb1[19] == 5);
  721. BOOST_TEST(cb2.size() == 2);
  722. BOOST_TEST(cb2.capacity() == 10);
  723. BOOST_TEST(cb2[0] == 1);
  724. BOOST_TEST(cb2[1] == 2);
  725. BOOST_TEST(cb3.size() == 0);
  726. BOOST_TEST(cb3.capacity() == 10);
  727. BOOST_TEST(cb4.size() == 10);
  728. BOOST_TEST(cb4.capacity() == 10);
  729. BOOST_TEST(cb4[0] == 1);
  730. BOOST_TEST(cb4[9] == 1);
  731. generic_test(cb1);
  732. generic_test(cb2);
  733. generic_test(cb3);
  734. generic_test(cb4);
  735. }
  736. void rresize_test() {
  737. CB_CONTAINER<MyInteger> cb1(10);
  738. cb1.push_back(1);
  739. cb1.push_back(2);
  740. cb1.push_back(3);
  741. cb1.push_back(4);
  742. cb1.rresize(20, 5);
  743. CB_CONTAINER<MyInteger> cb2(10);
  744. cb2.push_back(1);
  745. cb2.push_back(2);
  746. cb2.push_back(3);
  747. cb2.push_back(4);
  748. cb2.rresize(2);
  749. CB_CONTAINER<MyInteger> cb3(10, 1);
  750. cb3.rresize(0);
  751. CB_CONTAINER<MyInteger> cb4(10, 1);
  752. cb4.rresize(10);
  753. BOOST_TEST(cb1.size() == 20);
  754. BOOST_TEST(cb1.capacity() == 20);
  755. BOOST_TEST(cb1[0] == 5);
  756. BOOST_TEST(cb1[15] == 5);
  757. BOOST_TEST(cb1[16] == 1);
  758. BOOST_TEST(cb1[19] == 4);
  759. BOOST_TEST(cb2.size() == 2);
  760. BOOST_TEST(cb2.capacity() == 10);
  761. BOOST_TEST(cb2[0] == 3);
  762. BOOST_TEST(cb2[1] == 4);
  763. BOOST_TEST(cb3.size() == 0);
  764. BOOST_TEST(cb3.capacity() == 10);
  765. BOOST_TEST(cb4.size() == 10);
  766. BOOST_TEST(cb4.capacity() == 10);
  767. BOOST_TEST(cb4[0] == 1);
  768. BOOST_TEST(cb4[9] == 1);
  769. generic_test(cb1);
  770. generic_test(cb2);
  771. generic_test(cb3);
  772. generic_test(cb4);
  773. }
  774. void constructor_test() {
  775. CB_CONTAINER<MyInteger> cb0;
  776. BOOST_TEST(cb0.capacity() == 0);
  777. BOOST_TEST(cb0.size() == 0);
  778. cb0.push_back(1);
  779. cb0.push_back(2);
  780. cb0.push_back(3);
  781. BOOST_TEST(cb0.size() == 0);
  782. BOOST_TEST(cb0.capacity() == 0);
  783. CB_CONTAINER<MyInteger> cb1(3);
  784. CB_CONTAINER<MyInteger> cb2(3, 2);
  785. vector<int> v;
  786. v.push_back(1);
  787. v.push_back(2);
  788. v.push_back(3);
  789. v.push_back(4);
  790. v.push_back(5);
  791. CB_CONTAINER<MyInteger> cb3(v.begin(), v.end());
  792. CB_CONTAINER<MyInteger> cb4(3, v.begin(), v.end());
  793. CB_CONTAINER<MyInteger> cb5(10, v.begin(), v.end());
  794. CB_CONTAINER<MyInteger> cb6(10, 3, MyInteger(2));
  795. BOOST_TEST(cb1.size() == 0);
  796. BOOST_TEST(cb1.capacity() == 3);
  797. BOOST_TEST(cb2[0] == 2);
  798. BOOST_TEST(cb2.full());
  799. BOOST_TEST(cb2[0] == 2);
  800. BOOST_TEST(cb2[1] == 2);
  801. BOOST_TEST(cb2[2] == 2);
  802. BOOST_TEST(cb3.size() == 5);
  803. BOOST_TEST(cb3.capacity() == 5);
  804. BOOST_TEST(cb3.full());
  805. BOOST_TEST(cb3[0] == 1);
  806. BOOST_TEST(cb3[4] == 5);
  807. BOOST_TEST(cb4.size() == 3);
  808. BOOST_TEST(cb4.capacity() == 3);
  809. BOOST_TEST(cb4.full());
  810. BOOST_TEST(cb4[0] == 3);
  811. BOOST_TEST(cb4[2] == 5);
  812. BOOST_TEST(cb5.size() == 5);
  813. BOOST_TEST(cb5.capacity() == 10);
  814. BOOST_TEST(!cb5.full());
  815. BOOST_TEST(cb5[0] == 1);
  816. BOOST_TEST(cb5[4] == 5);
  817. BOOST_TEST(cb6.size() == 3);
  818. BOOST_TEST(cb6.capacity() == 10);
  819. BOOST_TEST(!cb6.full());
  820. BOOST_TEST(cb6[0] == 2);
  821. BOOST_TEST(cb6[2] == 2);
  822. cb5.push_back(6);
  823. cb6.push_back(6);
  824. BOOST_TEST(cb5[5] == 6);
  825. BOOST_TEST(cb5[0] == 1);
  826. BOOST_TEST(cb5.size() == 6);
  827. BOOST_TEST(cb6[3] == 6);
  828. BOOST_TEST(cb6.size() == 4);
  829. BOOST_TEST(cb6[0] == 2);
  830. #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  831. CB_CONTAINER<int> cb7(MyInputIterator(v.begin()), MyInputIterator(v.end()));
  832. CB_CONTAINER<int> cb8(3, MyInputIterator(v.begin()), MyInputIterator(v.end()));
  833. BOOST_TEST(cb7.capacity() == 5);
  834. BOOST_TEST(cb8.capacity() == 3);
  835. #endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  836. generic_test(cb1);
  837. generic_test(cb2);
  838. generic_test(cb3);
  839. generic_test(cb4);
  840. generic_test(cb5);
  841. generic_test(cb6);
  842. }
  843. void assign_test() {
  844. CB_CONTAINER<MyInteger> cb1(4);
  845. cb1.push_back(1);
  846. cb1.push_back(2);
  847. cb1.push_back(3);
  848. cb1.push_back(4);
  849. cb1.push_back(5);
  850. cb1.assign(3, 8);
  851. BOOST_TEST(cb1.size() == 3);
  852. BOOST_TEST(cb1.capacity() == 3);
  853. BOOST_TEST(cb1[0] == 8);
  854. BOOST_TEST(cb1[2] == 8);
  855. cb1.assign(6, 7);
  856. BOOST_TEST(cb1.size() == 6);
  857. BOOST_TEST(cb1.capacity() == 6);
  858. BOOST_TEST(cb1[0] == 7);
  859. BOOST_TEST(cb1[5] == 7);
  860. CB_CONTAINER<float> cb2(4);
  861. cb2.assign(3, 1.1f);
  862. BOOST_TEST(cb2[0] == 1.1f);
  863. CB_CONTAINER<MyInteger> cb3(5);
  864. cb3.push_back(1);
  865. cb3.push_back(2);
  866. cb3.push_back(3);
  867. cb3.assign((size_t)10, 1); // The size_t cast is not needed. It is present here just because of testing purposes.
  868. BOOST_TEST(cb3[0] == 1);
  869. BOOST_TEST(cb3[9] == 1);
  870. BOOST_TEST(cb3.size() == 10);
  871. BOOST_TEST(cb3.capacity() == 10);
  872. #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  873. vector<int> v;
  874. v.push_back(1);
  875. v.push_back(2);
  876. v.push_back(3);
  877. v.push_back(4);
  878. v.push_back(5);
  879. CB_CONTAINER<int> cb4(3);
  880. cb4.assign(MyInputIterator(v.begin()), MyInputIterator(v.end()));
  881. CB_CONTAINER<int> cb5(3);
  882. cb5.assign(4, MyInputIterator(v.begin()), MyInputIterator(v.end()));
  883. BOOST_TEST(cb4.capacity() == 5);
  884. BOOST_TEST(cb5.capacity() == 4);
  885. #endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  886. generic_test(cb1);
  887. generic_test(cb3);
  888. }
  889. void copy_constructor_and_assign_test() {
  890. CB_CONTAINER<MyInteger> cb1(4);
  891. cb1.push_back(1);
  892. cb1.push_back(2);
  893. cb1.push_back(3);
  894. cb1.push_back(4);
  895. cb1.push_back(5);
  896. CB_CONTAINER<MyInteger> cb2 = cb1;
  897. BOOST_TEST(cb1 == cb2);
  898. BOOST_TEST(cb2.capacity() == 4);
  899. BOOST_TEST(cb2[0] == 2);
  900. BOOST_TEST(cb2[3] == 5);
  901. CB_CONTAINER<MyInteger> cb3(20);
  902. cb1.pop_back();
  903. CB_CONTAINER<MyInteger> cb4(3);
  904. cb3 = cb2;
  905. cb3 = cb3;
  906. cb4 = cb1;
  907. CB_CONTAINER<MyInteger> cb5 = cb1;
  908. BOOST_TEST(cb3 == cb2);
  909. BOOST_TEST(cb4 == cb1);
  910. BOOST_TEST(cb2.full());
  911. BOOST_TEST(cb2[0] == 2);
  912. BOOST_TEST(cb3.full());
  913. BOOST_TEST(cb3.capacity() == 4);
  914. BOOST_TEST(cb4.capacity() == 4);
  915. BOOST_TEST(!cb4.full());
  916. BOOST_TEST(*(cb4.end() - 1) == 4);
  917. BOOST_TEST(cb1 == cb5);
  918. BOOST_TEST(cb5.capacity() == 4);
  919. BOOST_TEST(cb2[0] == 2);
  920. BOOST_TEST(cb2[2] == 4);
  921. generic_test(cb1);
  922. generic_test(cb2);
  923. generic_test(cb3);
  924. generic_test(cb4);
  925. generic_test(cb5);
  926. }
  927. void swap_test() {
  928. CB_CONTAINER<MyInteger> cb1(2);
  929. cb1.push_back(1);
  930. cb1.push_back(2);
  931. cb1.push_back(3);
  932. CB_CONTAINER<MyInteger> cb2(5);
  933. cb2.push_back(8);
  934. cb2.swap(cb1);
  935. cb2.swap(cb2);
  936. BOOST_TEST(cb2.capacity() == 2);
  937. BOOST_TEST(cb2[0] == 2);
  938. BOOST_TEST(cb2.full());
  939. BOOST_TEST(cb1.capacity() == 5);
  940. BOOST_TEST(cb1[0] == 8);
  941. BOOST_TEST(cb1.size() == 1);
  942. generic_test(cb1);
  943. generic_test(cb2);
  944. }
  945. void push_back_test() {
  946. CB_CONTAINER<MyDefaultConstructible> cb1(5);
  947. cb1.push_back();
  948. cb1.push_back(MyDefaultConstructible(2));
  949. BOOST_TEST(cb1[0].m_n == 1);
  950. BOOST_TEST(cb1[1].m_n == 2);
  951. CB_CONTAINER<MyInteger> cb2(5);
  952. cb2.push_back();
  953. BOOST_TEST(cb2.back() == CB_CONTAINER<MyInteger>::value_type());
  954. cb2.push_back(1);
  955. BOOST_TEST(cb2.back() == 1);
  956. generic_test(cb2);
  957. }
  958. void pop_back_test() {
  959. CB_CONTAINER<MyInteger> cb(4);
  960. cb.push_back(1);
  961. cb.push_back(2);
  962. cb.push_back(3);
  963. cb.push_back(4);
  964. cb.push_back(5);
  965. cb.pop_back();
  966. BOOST_TEST(cb.size() == 3);
  967. BOOST_TEST(!cb.full());
  968. BOOST_TEST(cb[0] == 2);
  969. generic_test(cb);
  970. }
  971. void insert_test() {
  972. CB_CONTAINER<MyInteger> cb1(4);
  973. cb1.push_back(1);
  974. cb1.push_back(2);
  975. cb1.push_back(3);
  976. CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 1;
  977. it1 = cb1.insert(it1, 10);
  978. CB_CONTAINER<MyInteger> cb2(4);
  979. cb2.push_back(1);
  980. cb2.insert(cb2.begin());
  981. cb2.insert(cb2.begin(), -1);
  982. CB_CONTAINER<MyInteger>::iterator it2 = cb2.begin() + 1;
  983. it2 = cb2.insert(it2, 5);
  984. CB_CONTAINER<MyInteger> cb3(2);
  985. cb3.insert(cb3.end(), 10);
  986. cb3.insert(cb3.end(), 20);
  987. cb3.insert(cb3.begin(), 30);
  988. cb3.insert(cb3.end(), 40);
  989. BOOST_TEST(cb1[1] == 10);
  990. BOOST_TEST(*it1 == 10);
  991. BOOST_TEST(cb1.full());
  992. BOOST_TEST(cb2[1] == 5);
  993. BOOST_TEST(*it2 == 5);
  994. BOOST_TEST(cb2.full());
  995. BOOST_TEST(cb3[0] == 20);
  996. BOOST_TEST(cb3[1] == 40);
  997. generic_test(cb1);
  998. generic_test(cb2);
  999. generic_test(cb3);
  1000. }
  1001. void insert_n_test() {
  1002. CB_CONTAINER<MyInteger> cb1(4);
  1003. cb1.push_back(1);
  1004. cb1.push_back(2);
  1005. cb1.push_back(3);
  1006. cb1.insert(cb1.begin() + 1, 2, 10);
  1007. CB_CONTAINER<MyInteger> cb2(2, 3);
  1008. cb2.insert(cb2.begin(), 10, 5);
  1009. CB_CONTAINER<MyInteger> cb3(4);
  1010. cb3.insert(cb3.end(), 1, 6);
  1011. CB_CONTAINER<MyInteger> cb4(6);
  1012. cb4.push_back(1);
  1013. cb4.push_back(2);
  1014. cb4.push_back(3);
  1015. cb4.push_back(4);
  1016. cb4.insert(cb4.begin() + 2, 5, 6);
  1017. cb4.insert(cb4.begin() + 2, 0, 7);
  1018. CB_CONTAINER<MyInteger> cb5(3);
  1019. cb5.push_back(1);
  1020. cb5.push_back(2);
  1021. cb5.pop_front();
  1022. cb5.insert(cb5.begin(), 2, 3);
  1023. BOOST_TEST(cb1.full());
  1024. BOOST_TEST(cb1[0] == 10);
  1025. BOOST_TEST(cb1[1] == 10);
  1026. BOOST_TEST(cb1[2] == 2);
  1027. BOOST_TEST(cb1[3] == 3);
  1028. BOOST_TEST(cb2[0] == 3);
  1029. BOOST_TEST(cb2[1] == 3);
  1030. BOOST_TEST(cb3[0] == 6);
  1031. BOOST_TEST(cb3.size() == 1);
  1032. BOOST_TEST(cb4.size() == 6);
  1033. BOOST_TEST(cb4[0] == 6);
  1034. BOOST_TEST(cb4[1] == 6);
  1035. BOOST_TEST(cb4[2] == 6);
  1036. BOOST_TEST(cb4[3] == 6);
  1037. BOOST_TEST(cb4[4] == 3);
  1038. BOOST_TEST(cb4[5] == 4);
  1039. BOOST_TEST(cb5.size() == 3);
  1040. BOOST_TEST(cb5[0] == 3);
  1041. BOOST_TEST(cb5[1] == 3);
  1042. BOOST_TEST(cb5[2] == 2);
  1043. generic_test(cb1);
  1044. generic_test(cb2);
  1045. generic_test(cb3);
  1046. generic_test(cb4);
  1047. generic_test(cb5);
  1048. }
  1049. void insert_range_test() {
  1050. vector<int> v;
  1051. v.push_back(11);
  1052. v.push_back(12);
  1053. v.push_back(13);
  1054. CB_CONTAINER<MyInteger> cb1(4);
  1055. cb1.push_back(1);
  1056. cb1.push_back(2);
  1057. cb1.push_back(3);
  1058. cb1.insert(cb1.begin() + 1, v.begin(), v.end());
  1059. CB_CONTAINER<MyInteger> cb2(2, 2);
  1060. cb2.insert(cb2.end(), v.begin(), v.end());
  1061. CB_CONTAINER<MyInteger> cb3(5);
  1062. cb3.insert(cb3.end(), v.end(), v.end());
  1063. CB_CONTAINER<MyInteger> cb4(5);
  1064. cb4.insert(cb4.end(), v.begin(), v.begin() + 1);
  1065. MyInteger array[] = { 5, 6, 7, 8, 9 };
  1066. CB_CONTAINER<MyInteger> cb5(6);
  1067. cb5.push_back(1);
  1068. cb5.push_back(2);
  1069. cb5.push_back(3);
  1070. cb5.push_back(4);
  1071. cb5.insert(cb5.begin() + 2, array, array + 5);
  1072. cb5.insert(cb5.begin(), array, array + 5);
  1073. BOOST_TEST(cb1.full());
  1074. BOOST_TEST(cb1[0] == 12);
  1075. BOOST_TEST(cb1[1] == 13);
  1076. BOOST_TEST(cb1[2] == 2);
  1077. BOOST_TEST(cb1[3] == 3);
  1078. BOOST_TEST(cb2[0] == 12);
  1079. BOOST_TEST(cb2[1] == 13);
  1080. BOOST_TEST(cb3.empty());
  1081. BOOST_TEST(cb4[0] == 11);
  1082. BOOST_TEST(cb4.size() == 1);
  1083. BOOST_TEST(cb5.size() == 6);
  1084. BOOST_TEST(cb5[0] == 6);
  1085. BOOST_TEST(cb5[1] == 7);
  1086. BOOST_TEST(cb5[2] == 8);
  1087. BOOST_TEST(cb5[3] == 9);
  1088. BOOST_TEST(cb5[4] == 3);
  1089. BOOST_TEST(cb5[5] == 4);
  1090. #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  1091. v.clear();
  1092. v.push_back(1);
  1093. v.push_back(2);
  1094. v.push_back(3);
  1095. v.push_back(4);
  1096. v.push_back(5);
  1097. CB_CONTAINER<int> cb6(4);
  1098. cb6.push_back(0);
  1099. cb6.push_back(-1);
  1100. cb6.push_back(-2);
  1101. cb6.insert(cb6.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end()));
  1102. v.clear();
  1103. v.push_back(11);
  1104. v.push_back(12);
  1105. v.push_back(13);
  1106. CB_CONTAINER<int> cb7(4);
  1107. cb7.push_back(1);
  1108. cb7.push_back(2);
  1109. cb7.push_back(3);
  1110. cb7.insert(cb7.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end()));
  1111. CB_CONTAINER<int> cb8(2, 2);
  1112. cb8.insert(cb8.end(), MyInputIterator(v.begin()), MyInputIterator(v.end()));
  1113. CB_CONTAINER<int> cb9(5);
  1114. cb9.insert(cb9.end(), MyInputIterator(v.end()), MyInputIterator(v.end()));
  1115. CB_CONTAINER<int> cb10(5);
  1116. cb10.insert(cb10.end(), MyInputIterator(v.begin()), MyInputIterator(v.begin() + 1));
  1117. v.clear();
  1118. v.push_back(5);
  1119. v.push_back(6);
  1120. v.push_back(7);
  1121. v.push_back(8);
  1122. v.push_back(9);
  1123. CB_CONTAINER<int> cb11(6);
  1124. cb11.push_back(1);
  1125. cb11.push_back(2);
  1126. cb11.push_back(3);
  1127. cb11.push_back(4);
  1128. cb11.insert(cb11.begin() + 2, MyInputIterator(v.begin()), MyInputIterator(v.begin() + 5));
  1129. cb11.insert(cb11.begin(), MyInputIterator(v.begin()), MyInputIterator(v.begin() + 5));
  1130. BOOST_TEST(cb6.capacity() == 4);
  1131. BOOST_TEST(cb6[0] == 4);
  1132. BOOST_TEST(cb6[3] == -2);
  1133. BOOST_TEST(cb7.full());
  1134. BOOST_TEST(cb7[0] == 12);
  1135. BOOST_TEST(cb7[1] == 13);
  1136. BOOST_TEST(cb7[2] == 2);
  1137. BOOST_TEST(cb7[3] == 3);
  1138. BOOST_TEST(cb8[0] == 12);
  1139. BOOST_TEST(cb8[1] == 13);
  1140. BOOST_TEST(cb9.empty());
  1141. BOOST_TEST(cb10[0] == 11);
  1142. BOOST_TEST(cb10.size() == 1);
  1143. BOOST_TEST(cb11.size() == 6);
  1144. BOOST_TEST(cb11[0] == 6);
  1145. BOOST_TEST(cb11[1] == 7);
  1146. BOOST_TEST(cb11[2] == 8);
  1147. BOOST_TEST(cb11[3] == 9);
  1148. BOOST_TEST(cb11[4] == 3);
  1149. BOOST_TEST(cb11[5] == 4);
  1150. #endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  1151. generic_test(cb1);
  1152. generic_test(cb2);
  1153. generic_test(cb3);
  1154. generic_test(cb4);
  1155. generic_test(cb5);
  1156. }
  1157. void push_front_test() {
  1158. CB_CONTAINER<MyDefaultConstructible> cb1(5);
  1159. cb1.push_front();
  1160. cb1.push_front(MyDefaultConstructible(2));
  1161. BOOST_TEST(cb1[0].m_n == 2);
  1162. BOOST_TEST(cb1[1].m_n == 1);
  1163. CB_CONTAINER<MyInteger> cb2(5);
  1164. cb2.push_front();
  1165. BOOST_TEST(cb2.front() == CB_CONTAINER<MyInteger>::value_type());
  1166. cb2.push_front(1);
  1167. BOOST_TEST(cb2.front() == 1);
  1168. CB_CONTAINER<MyInteger> cb3(0);
  1169. cb3.push_front(10);
  1170. BOOST_TEST(cb3.empty());
  1171. generic_test(cb2);
  1172. generic_test(cb3);
  1173. }
  1174. void pop_front_test() {
  1175. CB_CONTAINER<MyInteger> cb(4);
  1176. cb.push_front(1);
  1177. cb.push_front(2);
  1178. cb.push_front(3);
  1179. cb.push_front(4);
  1180. cb.push_front(5);
  1181. cb.pop_front();
  1182. BOOST_TEST(cb.size() == 3);
  1183. BOOST_TEST(!cb.full());
  1184. BOOST_TEST(cb[0] == 4);
  1185. generic_test(cb);
  1186. }
  1187. void rinsert_test() {
  1188. CB_CONTAINER<MyInteger> cb1(4);
  1189. cb1.push_front(1);
  1190. cb1.push_front(2);
  1191. cb1.push_front(3);
  1192. CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 1;
  1193. it1 = cb1.rinsert(it1, 10);
  1194. CB_CONTAINER<MyInteger> cb2(4);
  1195. cb2.push_front(1);
  1196. cb2.rinsert(cb2.begin());
  1197. cb2.rinsert(cb2.begin(), -1);
  1198. CB_CONTAINER<MyInteger>::iterator it2 = cb2.end() - 2;
  1199. it2 = cb2.rinsert(it2, 5);
  1200. CB_CONTAINER<MyInteger> cb3(2);
  1201. cb3.rinsert(cb3.begin(), 10);
  1202. cb3.rinsert(cb3.begin(), 20);
  1203. cb3.rinsert(cb3.end(), 30);
  1204. cb3.rinsert(cb3.begin(), 40);
  1205. CB_CONTAINER<MyInteger> cb4(4);
  1206. cb4.push_back(1);
  1207. cb4.push_back(2);
  1208. cb4.push_back(3);
  1209. CB_CONTAINER<MyInteger>::iterator it3 = cb4.begin() + 1;
  1210. it3 = cb4.rinsert(it3, 10);
  1211. CB_CONTAINER<MyInteger> cb5(4);
  1212. cb5.push_back(1);
  1213. cb5.rinsert(cb5.begin(), 0);
  1214. cb5.rinsert(cb5.begin(), -1);
  1215. CB_CONTAINER<MyInteger>::iterator it4 = cb5.begin() + 1;
  1216. it4 = cb5.rinsert(it4, 5);
  1217. CB_CONTAINER<MyInteger> cb6(2);
  1218. cb6.rinsert(cb6.end(), 10);
  1219. cb6.rinsert(cb6.end(), 20);
  1220. cb6.rinsert(cb6.begin(), 30);
  1221. cb6.rinsert(cb6.end(), 40);
  1222. CB_CONTAINER<MyInteger> cb7(6);
  1223. cb7.push_back(1);
  1224. cb7.push_back(2);
  1225. cb7.push_back(3);
  1226. cb7.push_back(4);
  1227. cb7.rinsert(cb7.begin() + 2, 5, 6);
  1228. BOOST_TEST(cb1[1] == 10);
  1229. BOOST_TEST(*it1 == 10);
  1230. BOOST_TEST(cb1.full());
  1231. BOOST_TEST(cb2[1] == 5);
  1232. BOOST_TEST(*it2 == 5);
  1233. BOOST_TEST(cb2.full());
  1234. BOOST_TEST(cb2[3] == 1);
  1235. BOOST_TEST(cb3[0] == 40);
  1236. BOOST_TEST(cb3[1] == 20);
  1237. BOOST_TEST(cb4[1] == 10);
  1238. BOOST_TEST(*it3 == 10);
  1239. BOOST_TEST(cb4.full());
  1240. BOOST_TEST(cb5[1] == 5);
  1241. BOOST_TEST(*it4 == 5);
  1242. BOOST_TEST(cb5.full());
  1243. BOOST_TEST(cb6[0] == 30);
  1244. BOOST_TEST(cb6[1] == 10);
  1245. BOOST_TEST(cb7.size() == 6);
  1246. BOOST_TEST(cb7[0] == 1);
  1247. BOOST_TEST(cb7[1] == 2);
  1248. BOOST_TEST(cb7[2] == 6);
  1249. BOOST_TEST(cb7[3] == 6);
  1250. BOOST_TEST(cb7[4] == 6);
  1251. BOOST_TEST(cb7[5] == 6);
  1252. generic_test(cb1);
  1253. generic_test(cb2);
  1254. generic_test(cb3);
  1255. generic_test(cb4);
  1256. generic_test(cb5);
  1257. generic_test(cb6);
  1258. generic_test(cb7);
  1259. }
  1260. void rinsert_n_test() {
  1261. CB_CONTAINER<MyInteger> cb1(4);
  1262. cb1.push_front(1);
  1263. cb1.push_front(2);
  1264. cb1.push_front(3);
  1265. cb1.rinsert(cb1.begin() + 1, 2, 10);
  1266. CB_CONTAINER<MyInteger> cb2(2, 3);
  1267. cb2.rinsert(cb2.begin(), 10, 5);
  1268. CB_CONTAINER<MyInteger> cb3(4);
  1269. cb3.rinsert(cb3.end(), 1, 6);
  1270. CB_CONTAINER<MyInteger> cb4(4);
  1271. cb4.push_back(1);
  1272. cb4.push_back(2);
  1273. cb4.push_back(3);
  1274. cb4.rinsert(cb4.begin() + 1, 2, 10);
  1275. MyInteger array[] = { 5, 6, 7, 8, 9 };
  1276. CB_CONTAINER<MyInteger> cb5(6);
  1277. cb5.push_back(1);
  1278. cb5.push_back(2);
  1279. cb5.push_back(3);
  1280. cb5.push_back(4);
  1281. cb5.rinsert(cb5.begin() + 2, array, array + 5);
  1282. cb5.rinsert(cb5.end(), array, array + 5);
  1283. BOOST_TEST(cb1.full());
  1284. BOOST_TEST(cb1[0] == 3);
  1285. BOOST_TEST(cb1[1] == 10);
  1286. BOOST_TEST(cb1[2] == 10);
  1287. BOOST_TEST(cb1[3] == 2);
  1288. BOOST_TEST(cb2[0] == 5);
  1289. BOOST_TEST(cb2[1] == 5);
  1290. BOOST_TEST(cb3[0] == 6);
  1291. BOOST_TEST(cb3.size() == 1);
  1292. BOOST_TEST(cb4.full());
  1293. BOOST_TEST(cb4[0] == 1);
  1294. BOOST_TEST(cb4[1] == 10);
  1295. BOOST_TEST(cb4[2] == 10);
  1296. BOOST_TEST(cb4[3] == 2);
  1297. BOOST_TEST(cb5.size() == 6);
  1298. BOOST_TEST(cb5[0] == 1);
  1299. BOOST_TEST(cb5[1] == 2);
  1300. BOOST_TEST(cb5[2] == 5);
  1301. BOOST_TEST(cb5[3] == 6);
  1302. BOOST_TEST(cb5[4] == 7);
  1303. BOOST_TEST(cb5[5] == 8);
  1304. generic_test(cb1);
  1305. generic_test(cb2);
  1306. generic_test(cb3);
  1307. generic_test(cb4);
  1308. generic_test(cb5);
  1309. }
  1310. void rinsert_range_test() {
  1311. vector<int> v;
  1312. v.push_back(11);
  1313. v.push_back(12);
  1314. v.push_back(13);
  1315. v.push_back(14);
  1316. CB_CONTAINER<MyInteger> cb1(4);
  1317. cb1.push_back(1);
  1318. cb1.push_back(2);
  1319. cb1.push_back(3);
  1320. cb1.rinsert(cb1.begin() + 1, v.begin(), v.end());
  1321. CB_CONTAINER<MyInteger> cb2(2, 2);
  1322. cb2.rinsert(cb2.begin(), v.begin(), v.end());
  1323. CB_CONTAINER<MyInteger> cb3(5);
  1324. cb3.rinsert(cb3.begin(), v.end(), v.end());
  1325. CB_CONTAINER<MyInteger> cb4(5);
  1326. cb4.rinsert(cb4.begin(), v.begin(), v.begin() + 1);
  1327. BOOST_TEST(cb1.full());
  1328. BOOST_TEST(cb1[0] == 1);
  1329. BOOST_TEST(cb1[1] == 11);
  1330. BOOST_TEST(cb1[2] == 12);
  1331. BOOST_TEST(cb1[3] == 13);
  1332. BOOST_TEST(cb2[0] == 11);
  1333. BOOST_TEST(cb2[1] == 12);
  1334. BOOST_TEST(cb3.empty());
  1335. BOOST_TEST(cb4[0] == 11);
  1336. BOOST_TEST(cb4.size() == 1);
  1337. #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  1338. v.clear();
  1339. v.push_back(1);
  1340. v.push_back(2);
  1341. v.push_back(3);
  1342. v.push_back(4);
  1343. v.push_back(5);
  1344. CB_CONTAINER<int> cb10(4);
  1345. cb10.push_back(0);
  1346. cb10.push_back(-1);
  1347. cb10.push_back(-2);
  1348. cb10.rinsert(cb10.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end()));
  1349. v.clear();
  1350. v.push_back(11);
  1351. v.push_back(12);
  1352. v.push_back(13);
  1353. v.push_back(14);
  1354. CB_CONTAINER<int> cb11(4);
  1355. cb11.push_back(1);
  1356. cb11.push_back(2);
  1357. cb11.push_back(3);
  1358. cb11.rinsert(cb11.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end()));
  1359. CB_CONTAINER<int> cb12(2, 2);
  1360. cb12.rinsert(cb12.begin(), MyInputIterator(v.begin()), MyInputIterator(v.end()));
  1361. CB_CONTAINER<int> cb13(5);
  1362. cb13.rinsert(cb13.begin(), MyInputIterator(v.end()), MyInputIterator(v.end()));
  1363. CB_CONTAINER<int> cb14(5);
  1364. cb14.rinsert(cb14.begin(), MyInputIterator(v.begin()), MyInputIterator(v.begin() + 1));
  1365. BOOST_TEST(cb10.capacity() == 4);
  1366. BOOST_TEST(cb10[0] == 0);
  1367. BOOST_TEST(cb10[3] == 3);
  1368. BOOST_TEST(cb11.full());
  1369. BOOST_TEST(cb11[0] == 1);
  1370. BOOST_TEST(cb11[1] == 11);
  1371. BOOST_TEST(cb11[2] == 12);
  1372. BOOST_TEST(cb11[3] == 13);
  1373. BOOST_TEST(cb12[0] == 11);
  1374. BOOST_TEST(cb12[1] == 12);
  1375. BOOST_TEST(cb13.empty());
  1376. BOOST_TEST(cb14[0] == 11);
  1377. BOOST_TEST(cb14.size() == 1);
  1378. #endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
  1379. generic_test(cb1);
  1380. generic_test(cb2);
  1381. generic_test(cb3);
  1382. generic_test(cb4);
  1383. }
  1384. void erase_test() {
  1385. CB_CONTAINER<MyInteger> cb1(4);
  1386. cb1.push_back(1);
  1387. cb1.push_back(2);
  1388. cb1.push_back(3);
  1389. CB_CONTAINER<MyInteger>::iterator it1 = cb1.erase(cb1.begin() + 1);
  1390. CB_CONTAINER<MyInteger> cb2(1, 1);
  1391. CB_CONTAINER<MyInteger>::iterator it2 = cb2.erase(cb2.begin());
  1392. CB_CONTAINER<MyInteger> cb3(4);
  1393. cb3.push_back(1);
  1394. cb3.push_back(2);
  1395. cb3.push_back(3);
  1396. CB_CONTAINER<MyInteger>::iterator it3 = cb3.erase(cb3.begin() + 2);
  1397. BOOST_TEST(cb1.size() == 2);
  1398. BOOST_TEST(cb1.capacity() == 4);
  1399. BOOST_TEST(*it1 == 3);
  1400. BOOST_TEST(cb1[0] == 1);
  1401. BOOST_TEST(cb1[1] == 3);
  1402. BOOST_TEST(cb2.size() == 0);
  1403. BOOST_TEST(cb2.capacity() == 1);
  1404. BOOST_TEST(it2 == cb2.end());
  1405. BOOST_TEST(cb3.size() == 2);
  1406. BOOST_TEST(cb3.capacity() == 4);
  1407. BOOST_TEST(it3 == cb3.end());
  1408. BOOST_TEST(cb3[0] == 1);
  1409. BOOST_TEST(cb3[1] == 2);
  1410. generic_test(cb1);
  1411. generic_test(cb2);
  1412. generic_test(cb3);
  1413. }
  1414. void erase_range_test() {
  1415. CB_CONTAINER<MyInteger> cb1(4);
  1416. cb1.push_back(1);
  1417. cb1.push_back(2);
  1418. cb1.push_back(3);
  1419. cb1.push_back(4);
  1420. CB_CONTAINER<MyInteger>::iterator it1 = cb1.erase(cb1.begin() + 1, cb1.begin() + 3);
  1421. CB_CONTAINER<MyInteger> cb2(4);
  1422. cb2.push_back(1);
  1423. cb2.push_back(2);
  1424. cb2.push_back(3);
  1425. cb2.push_back(4);
  1426. CB_CONTAINER<MyInteger>::iterator it2 = cb2.erase(cb2.begin(), cb2.begin());
  1427. CB_CONTAINER<MyInteger> cb3(4);
  1428. cb3.push_back(1);
  1429. cb3.push_back(2);
  1430. cb3.push_back(3);
  1431. cb3.push_back(4);
  1432. CB_CONTAINER<MyInteger>::iterator it3 = cb3.erase(cb3.begin() + 2, cb3.end());
  1433. CB_CONTAINER<MyInteger> cb4(10, 1);
  1434. CB_CONTAINER<MyInteger>::iterator it4 = cb4.erase(cb4.begin(), cb4.end());
  1435. BOOST_TEST(cb1.size() == 2);
  1436. BOOST_TEST(cb1.capacity() == 4);
  1437. BOOST_TEST(cb1[0] == 1);
  1438. BOOST_TEST(cb1[1] == 4);
  1439. BOOST_TEST(*it1 == 4);
  1440. BOOST_TEST(cb2.size() == 4);
  1441. BOOST_TEST(cb2[0] == 1);
  1442. BOOST_TEST(cb2[3] == 4);
  1443. BOOST_TEST(*it2 == 1);
  1444. BOOST_TEST(cb3.size() == 2);
  1445. BOOST_TEST(cb3.capacity() == 4);
  1446. BOOST_TEST(cb3[0] == 1);
  1447. BOOST_TEST(cb3[1] == 2);
  1448. BOOST_TEST(it3 == cb3.end());
  1449. BOOST_TEST(cb4.size() == 0);
  1450. BOOST_TEST(cb4.capacity() == 10);
  1451. BOOST_TEST(it4 == cb4.end());
  1452. generic_test(cb1);
  1453. generic_test(cb2);
  1454. generic_test(cb3);
  1455. generic_test(cb4);
  1456. }
  1457. void rerase_test() {
  1458. CB_CONTAINER<MyInteger> cb1(4);
  1459. cb1.push_back(1);
  1460. cb1.push_back(2);
  1461. cb1.push_back(3);
  1462. CB_CONTAINER<MyInteger>::iterator it1 = cb1.rerase(cb1.begin() + 1);
  1463. CB_CONTAINER<MyInteger> cb2(1, 1);
  1464. CB_CONTAINER<MyInteger>::iterator it2 = cb2.rerase(cb2.begin());
  1465. CB_CONTAINER<MyInteger> cb3(4);
  1466. cb3.push_back(1);
  1467. cb3.push_back(2);
  1468. cb3.push_back(3);
  1469. CB_CONTAINER<MyInteger>::iterator it3 = cb3.rerase(cb3.begin());
  1470. BOOST_TEST(cb1.size() == 2);
  1471. BOOST_TEST(cb1.capacity() == 4);
  1472. BOOST_TEST(*it1 == 1);
  1473. BOOST_TEST(cb1[0] == 1);
  1474. BOOST_TEST(cb1[1] == 3);
  1475. BOOST_TEST(cb2.size() == 0);
  1476. BOOST_TEST(cb2.capacity() == 1);
  1477. BOOST_TEST(it2 == cb2.begin());
  1478. BOOST_TEST(cb3.size() == 2);
  1479. BOOST_TEST(cb3.capacity() == 4);
  1480. BOOST_TEST(it3 == cb3.begin());
  1481. BOOST_TEST(*it3 == 2);
  1482. BOOST_TEST(cb3[0] == 2);
  1483. BOOST_TEST(cb3[1] == 3);
  1484. generic_test(cb1);
  1485. generic_test(cb2);
  1486. generic_test(cb3);
  1487. }
  1488. void rerase_range_test() {
  1489. CB_CONTAINER<MyInteger> cb1(4);
  1490. cb1.push_back(1);
  1491. cb1.push_back(2);
  1492. cb1.push_back(3);
  1493. cb1.push_back(4);
  1494. CB_CONTAINER<MyInteger>::iterator it1 = cb1.rerase(cb1.begin() + 1, cb1.begin() + 3);
  1495. CB_CONTAINER<MyInteger> cb2(4);
  1496. cb2.push_back(1);
  1497. cb2.push_back(2);
  1498. cb2.push_back(3);
  1499. cb2.push_back(4);
  1500. CB_CONTAINER<MyInteger>::iterator it2 = cb2.rerase(cb2.begin(), cb2.begin());
  1501. CB_CONTAINER<MyInteger> cb3(4);
  1502. cb3.push_back(1);
  1503. cb3.push_back(2);
  1504. cb3.push_back(3);
  1505. cb3.push_back(4);
  1506. CB_CONTAINER<MyInteger>::iterator it3 = cb3.rerase(cb3.begin(), cb3.begin() + 2);
  1507. CB_CONTAINER<MyInteger> cb4(10, 1);
  1508. CB_CONTAINER<MyInteger>::iterator it4 = cb4.rerase(cb4.begin(), cb4.end());
  1509. BOOST_TEST(cb1.size() == 2);
  1510. BOOST_TEST(cb1.capacity() == 4);
  1511. BOOST_TEST(cb1[0] == 1);
  1512. BOOST_TEST(cb1[1] == 4);
  1513. BOOST_TEST(*it1 == 1);
  1514. BOOST_TEST(cb2.size() == 4);
  1515. BOOST_TEST(cb2[0] == 1);
  1516. BOOST_TEST(cb2[3] == 4);
  1517. BOOST_TEST(*it2 == 1);
  1518. BOOST_TEST(cb3.size() == 2);
  1519. BOOST_TEST(cb3.capacity() == 4);
  1520. BOOST_TEST(cb3[0] == 3);
  1521. BOOST_TEST(cb3[1] == 4);
  1522. BOOST_TEST(it3 == cb3.begin());
  1523. BOOST_TEST(cb4.size() == 0);
  1524. BOOST_TEST(cb4.capacity() == 10);
  1525. BOOST_TEST(it4 == cb4.begin());
  1526. generic_test(cb1);
  1527. generic_test(cb2);
  1528. generic_test(cb3);
  1529. generic_test(cb4);
  1530. }
  1531. void clear_test() {
  1532. CB_CONTAINER<MyInteger> cb(4);
  1533. cb.push_back(1);
  1534. cb.push_back(2);
  1535. cb.push_back(3);
  1536. cb.push_back(4);
  1537. cb.clear();
  1538. BOOST_TEST(cb.empty());
  1539. generic_test(cb);
  1540. }
  1541. void equality_test() {
  1542. CB_CONTAINER<MyInteger> cb1(4);
  1543. cb1.push_back(1);
  1544. cb1.push_back(2);
  1545. cb1.push_back(3);
  1546. cb1.push_back(4);
  1547. CB_CONTAINER<MyInteger> cb2(10);
  1548. cb2.push_back(1);
  1549. cb2.push_back(2);
  1550. cb2.push_back(3);
  1551. cb2.push_back(4);
  1552. BOOST_TEST(cb1 == cb2);
  1553. BOOST_TEST(!(cb2 != cb1));
  1554. generic_test(cb1);
  1555. generic_test(cb2);
  1556. }
  1557. void lexicographical_comparison_test() {
  1558. CB_CONTAINER<char> cb1(10);
  1559. cb1.push_back('a');
  1560. cb1.push_back('d');
  1561. cb1.push_back('a');
  1562. cb1.push_back('m');
  1563. CB_CONTAINER<char> cb2(5);
  1564. cb2.push_back('j');
  1565. cb2.push_back('o');
  1566. cb2.push_back('h');
  1567. cb2.push_back('n');
  1568. BOOST_TEST(cb2 > cb1);
  1569. BOOST_TEST(cb1 < cb2);
  1570. }
  1571. void assign_range_test() {
  1572. vector<int> v;
  1573. v.push_back(11);
  1574. v.push_back(12);
  1575. v.push_back(13);
  1576. CB_CONTAINER<MyInteger> cb1(4);
  1577. cb1.push_back(1);
  1578. cb1.push_back(2);
  1579. cb1.push_back(3);
  1580. cb1.assign(v.begin() + 1, v.end());
  1581. CB_CONTAINER<MyInteger> cb2(2);
  1582. cb2.push_back(1);
  1583. cb2.push_back(2);
  1584. cb2.assign(v.begin(), v.end());
  1585. BOOST_TEST(cb1.capacity() == 2);
  1586. BOOST_TEST(cb1[0] == 12);
  1587. BOOST_TEST(cb1[1] == 13);
  1588. BOOST_TEST(cb2.full());
  1589. BOOST_TEST(cb2.capacity() == 3);
  1590. BOOST_TEST(cb2[0] == 11);
  1591. BOOST_TEST(cb2[1] == 12);
  1592. BOOST_TEST(cb2[2] == 13);
  1593. BOOST_TEST(cb2.size() == (size_t)distance(v.begin(), v.end()));
  1594. generic_test(cb1);
  1595. generic_test(cb2);
  1596. }
  1597. // test of the example (introduced in the documentation)
  1598. void example_test() {
  1599. CB_CONTAINER<int> cb1(3);
  1600. cb1.push_back(1);
  1601. cb1.push_back(2);
  1602. BOOST_TEST(cb1[0] == 1);
  1603. BOOST_TEST(cb1[1] == 2);
  1604. BOOST_TEST(!cb1.full());
  1605. BOOST_TEST(cb1.size() == 2);
  1606. BOOST_TEST(cb1.capacity() == 3);
  1607. cb1.push_back(3);
  1608. cb1.push_back(4);
  1609. int sum = accumulate(cb1.begin(), cb1.end(), 0);
  1610. BOOST_TEST(cb1[0] == 2);
  1611. BOOST_TEST(cb1[1] == 3);
  1612. BOOST_TEST(cb1[2] == 4);
  1613. BOOST_TEST(*cb1.begin() == 2);
  1614. BOOST_TEST(cb1.front() == 2);
  1615. BOOST_TEST(cb1.back() == 4);
  1616. BOOST_TEST(sum == 9);
  1617. BOOST_TEST(cb1.full());
  1618. BOOST_TEST(cb1.size() == 3);
  1619. BOOST_TEST(cb1.capacity() == 3);
  1620. CB_CONTAINER<int> cb2(5, 1);
  1621. cb2.insert(cb2.begin(), 2);
  1622. BOOST_TEST(cb2[0] == 1);
  1623. BOOST_TEST(cb2[1] == 1);
  1624. BOOST_TEST(cb2[2] == 1);
  1625. BOOST_TEST(cb2[3] == 1);
  1626. BOOST_TEST(cb2[4] == 1);
  1627. vector<int> v;
  1628. v.push_back(100);
  1629. v.push_back(200);
  1630. v.push_back(300);
  1631. cb2.insert(cb2.begin() + 1, v.begin(), v.end());
  1632. BOOST_TEST(cb2[0] == 300);
  1633. BOOST_TEST(cb2[1] == 1);
  1634. BOOST_TEST(cb2[2] == 1);
  1635. BOOST_TEST(cb2[3] == 1);
  1636. BOOST_TEST(cb2[4] == 1);
  1637. CB_CONTAINER<int> cb3(3);
  1638. cb3.push_back(1);
  1639. cb3.push_back(2);
  1640. cb3.push_back(3);
  1641. BOOST_TEST(cb3[0] == 1);
  1642. BOOST_TEST(cb3[1] == 2);
  1643. BOOST_TEST(cb3[2] == 3);
  1644. cb3.push_back(4);
  1645. cb3.push_back(5);
  1646. BOOST_TEST(cb3[0] == 3);
  1647. BOOST_TEST(cb3[1] == 4);
  1648. BOOST_TEST(cb3[2] == 5);
  1649. cb3.pop_back();
  1650. cb3.pop_front();
  1651. BOOST_TEST(cb3[0] == 4);
  1652. }
  1653. void element_destruction_test() {
  1654. CB_CONTAINER<InstanceCounter> cb(5);
  1655. cb.push_back(InstanceCounter());
  1656. cb.push_back(InstanceCounter());
  1657. cb.push_back(InstanceCounter());
  1658. int prevCount = InstanceCounter::count();
  1659. cb.clear();
  1660. BOOST_TEST(cb.empty());
  1661. BOOST_TEST(prevCount == 3);
  1662. BOOST_TEST(InstanceCounter::count() == 0);
  1663. }
  1664. void const_methods_test() {
  1665. vector<int> v;
  1666. v.push_back(1);
  1667. v.push_back(2);
  1668. v.push_back(3);
  1669. v.push_back(4);
  1670. v.push_back(5);
  1671. const CB_CONTAINER<MyInteger> cb(5, v.begin(), v.end());
  1672. BOOST_TEST(*cb.begin() == 1);
  1673. BOOST_TEST(*(cb.end() - 1) == 5);
  1674. BOOST_TEST(*cb.rbegin() == 5);
  1675. BOOST_TEST(*(cb.rend() - 1) == 1);
  1676. BOOST_TEST(cb[0] == 1);
  1677. BOOST_TEST(cb.at(1) == 2);
  1678. BOOST_TEST(cb.front() == 1);
  1679. BOOST_TEST(cb.back() == 5);
  1680. }
  1681. void rotate_test() {
  1682. CB_CONTAINER<MyInteger> cb1(10);
  1683. cb1.push_back(1);
  1684. cb1.push_back(2);
  1685. cb1.push_back(3);
  1686. cb1.push_back(4);
  1687. cb1.push_back(5);
  1688. cb1.push_back(6);
  1689. cb1.push_back(7);
  1690. CB_CONTAINER<MyInteger> cb2 = cb1;
  1691. CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 2;
  1692. int v1_0 = *it1;
  1693. int v1_1 = *(it1 + 1);
  1694. int v1_2 = *(it1 + 2);
  1695. int v1_3 = *(it1 + 3);
  1696. int v1_4 = *(it1 + 4);
  1697. int v1_r1 = *(it1 - 1);
  1698. int v1_r2 = *(it1 - 2);
  1699. cb1.rotate(it1);
  1700. rotate(cb2.begin(), cb2.begin() + 2, cb2.end());
  1701. CB_CONTAINER<MyInteger> cb3(7);
  1702. cb3.push_back(1);
  1703. cb3.push_back(2);
  1704. cb3.push_back(3);
  1705. cb3.push_back(4);
  1706. cb3.push_back(5);
  1707. cb3.push_back(6);
  1708. cb3.push_back(7);
  1709. cb3.push_back(8);
  1710. cb3.push_back(9);
  1711. CB_CONTAINER<MyInteger> cb4 = cb3;
  1712. CB_CONTAINER<MyInteger>::iterator it2 = cb3.begin() + 1;
  1713. int v2_0 = *it2;
  1714. int v2_1 = *(it2 + 1);
  1715. int v2_2 = *(it2 + 2);
  1716. int v2_3 = *(it2 + 3);
  1717. int v2_4 = *(it2 + 4);
  1718. int v2_5 = *(it2 + 5);
  1719. int v2_r1 = *(it2 - 1);
  1720. cb3.rotate(it2);
  1721. rotate(cb4.begin(), cb4.begin() + 1, cb4.end());
  1722. CB_CONTAINER<MyInteger> cb5(10);
  1723. cb5.push_back(1);
  1724. cb5.push_back(2);
  1725. cb5.push_back(3);
  1726. cb5.push_back(4);
  1727. cb5.push_back(5);
  1728. cb5.push_back(6);
  1729. cb5.push_back(7);
  1730. CB_CONTAINER<MyInteger> cb6 = cb5;
  1731. CB_CONTAINER<MyInteger>::iterator it3 = cb5.begin() + 5;
  1732. int v3_0 = *it3;
  1733. int v3_1 = *(it3 + 1);
  1734. int v3_r1 = *(it3 - 1);
  1735. int v3_r2 = *(it3 - 2);
  1736. int v3_r3 = *(it3 - 3);
  1737. int v3_r4 = *(it3 - 4);
  1738. int v3_r5 = *(it3 - 5);
  1739. cb5.rotate(it3);
  1740. rotate(cb6.begin(), cb6.begin() + 5, cb6.end());
  1741. BOOST_TEST(!cb1.full());
  1742. BOOST_TEST(cb1 == cb2);
  1743. BOOST_TEST(v1_0 == *it1);
  1744. BOOST_TEST(v1_1 == *(it1 + 1));
  1745. BOOST_TEST(v1_2 == *(it1 + 2));
  1746. BOOST_TEST(v1_3 == *(it1 + 3));
  1747. BOOST_TEST(v1_4 == *(it1 + 4));
  1748. BOOST_TEST(v1_r1 == *(it1 + 6));
  1749. BOOST_TEST(v1_r2 == *(it1 + 5));
  1750. BOOST_TEST(cb1.begin() == it1);
  1751. BOOST_TEST(v1_0 == cb1[0]);
  1752. BOOST_TEST(v1_1 == cb1[1]);
  1753. BOOST_TEST(v1_2 == cb1[2]);
  1754. BOOST_TEST(v1_3 == cb1[3]);
  1755. BOOST_TEST(v1_4 == cb1[4]);
  1756. BOOST_TEST(v1_r1 == cb1[6]);
  1757. BOOST_TEST(v1_r2 == cb1[5]);
  1758. BOOST_TEST(cb3.full());
  1759. BOOST_TEST(cb3 == cb4);
  1760. BOOST_TEST(v2_0 == *it2);
  1761. BOOST_TEST(v2_1 == *(it2 + 1));
  1762. BOOST_TEST(v2_2 == *(it2 + 2));
  1763. BOOST_TEST(v2_3 == *(it2 + 3));
  1764. BOOST_TEST(v2_4 == *(it2 + 4));
  1765. BOOST_TEST(v2_5 == *(it2 + 5));
  1766. BOOST_TEST(v2_r1 == *(it2 + 6));
  1767. BOOST_TEST(cb3.begin() == it2);
  1768. BOOST_TEST(v2_0 == cb3[0]);
  1769. BOOST_TEST(v2_1 == cb3[1]);
  1770. BOOST_TEST(v2_2 == cb3[2]);
  1771. BOOST_TEST(v2_3 == cb3[3]);
  1772. BOOST_TEST(v2_4 == cb3[4]);
  1773. BOOST_TEST(v2_5 == cb3[5]);
  1774. BOOST_TEST(v2_r1 == cb3[6]);
  1775. BOOST_TEST(!cb5.full());
  1776. BOOST_TEST(cb5 == cb6);
  1777. BOOST_TEST(v3_0 == cb5[0]);
  1778. BOOST_TEST(v3_1 == cb5[1]);
  1779. BOOST_TEST(v3_r1 == cb5[6]);
  1780. BOOST_TEST(v3_r2 == cb5[5]);
  1781. BOOST_TEST(v3_r3 == cb5[4]);
  1782. BOOST_TEST(v3_r4 == cb5[3]);
  1783. BOOST_TEST(v3_r5 == cb5[2]);
  1784. generic_test(cb1);
  1785. generic_test(cb2);
  1786. generic_test(cb3);
  1787. generic_test(cb4);
  1788. generic_test(cb5);
  1789. generic_test(cb6);
  1790. }
  1791. int MyInteger::ms_exception_trigger = 0;
  1792. int InstanceCounter::ms_count = 0;
  1793. void move_container_on_cpp11() {
  1794. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  1795. CB_CONTAINER<MyInteger> cb1(10);
  1796. cb1.push_back(1);
  1797. cb1.push_back(2);
  1798. cb1.push_back(3);
  1799. cb1.push_back(4);
  1800. cb1.push_back(5);
  1801. cb1.push_back(6);
  1802. // Checking move constructor
  1803. CB_CONTAINER<MyInteger> cb2(static_cast<CB_CONTAINER<MyInteger>&& >(cb1));
  1804. CB_CONTAINER<MyInteger>::iterator it2 = cb2.begin() + 1;
  1805. BOOST_TEST(cb1.empty());
  1806. BOOST_TEST(!cb2.empty());
  1807. BOOST_TEST(it2[0] == 2);
  1808. BOOST_TEST(it2[-1] == 1);
  1809. BOOST_TEST(it2[2] == 4);
  1810. // Checking move assignment
  1811. cb1 = static_cast<CB_CONTAINER<MyInteger>&& >(cb2);
  1812. CB_CONTAINER<MyInteger>::iterator it1 = cb1.begin() + 1;
  1813. BOOST_TEST(!cb1.empty());
  1814. BOOST_TEST(cb2.empty());
  1815. BOOST_TEST(it1[0] == 2);
  1816. BOOST_TEST(it1[-1] == 1);
  1817. BOOST_TEST(it1[2] == 4);
  1818. #endif
  1819. }
  1820. struct noncopyable_movable_except_t
  1821. {
  1822. private:
  1823. BOOST_MOVABLE_BUT_NOT_COPYABLE(noncopyable_movable_except_t)
  1824. bool is_moved_;
  1825. int value_;
  1826. public:
  1827. static int next_value;
  1828. explicit noncopyable_movable_except_t()
  1829. : is_moved_(false)
  1830. , value_(next_value ++)
  1831. {}
  1832. noncopyable_movable_except_t(BOOST_RV_REF(noncopyable_movable_except_t) x) {
  1833. is_moved_ = x.is_moved_;
  1834. value_ = x.value_;
  1835. x.is_moved_ = true;
  1836. }
  1837. noncopyable_movable_except_t& operator=(BOOST_RV_REF(noncopyable_movable_except_t) x) {
  1838. is_moved_ = x.is_moved_;
  1839. value_ = x.value_;
  1840. x.is_moved_ = true;
  1841. return *this;
  1842. }
  1843. bool is_moved() const {
  1844. return is_moved_;
  1845. }
  1846. int value() const {
  1847. return value_;
  1848. }
  1849. void reinit() { is_moved_ = false; value_ = next_value ++; }
  1850. };
  1851. struct noncopyable_movable_noexcept_t
  1852. {
  1853. private:
  1854. BOOST_MOVABLE_BUT_NOT_COPYABLE(noncopyable_movable_noexcept_t)
  1855. bool is_moved_;
  1856. int value_;
  1857. public:
  1858. static int next_value;
  1859. explicit noncopyable_movable_noexcept_t()
  1860. : is_moved_(false)
  1861. , value_(next_value ++)
  1862. {}
  1863. noncopyable_movable_noexcept_t(BOOST_RV_REF(noncopyable_movable_noexcept_t) x) BOOST_NOEXCEPT {
  1864. is_moved_ = x.is_moved_;
  1865. value_ = x.value_;
  1866. x.is_moved_ = true;
  1867. }
  1868. noncopyable_movable_noexcept_t& operator=(BOOST_RV_REF(noncopyable_movable_noexcept_t) x) BOOST_NOEXCEPT {
  1869. is_moved_ = x.is_moved_;
  1870. value_ = x.value_;
  1871. x.is_moved_ = true;
  1872. return *this;
  1873. }
  1874. bool is_moved() const {
  1875. return is_moved_;
  1876. }
  1877. int value() const {
  1878. return value_;
  1879. }
  1880. void reinit() { is_moved_ = false; value_ = next_value ++; }
  1881. };
  1882. #if defined(BOOST_NO_CXX11_NOEXCEPT) || !defined(BOOST_IS_NOTHROW_MOVE_CONSTRUCT)
  1883. namespace boost {
  1884. template <>
  1885. struct is_nothrow_move_constructible<noncopyable_movable_noexcept_t>
  1886. : boost::true_type
  1887. {};
  1888. }
  1889. #endif
  1890. int noncopyable_movable_noexcept_t::next_value = 1;
  1891. int noncopyable_movable_except_t::next_value = 1;
  1892. template <class T>
  1893. void move_container_values_impl() {
  1894. typedef T noncopyable_movable_test_t;
  1895. noncopyable_movable_test_t::next_value = 1;
  1896. CB_CONTAINER<noncopyable_movable_test_t> cb1(40);
  1897. noncopyable_movable_test_t var;
  1898. cb1.push_back(boost::move(var));
  1899. BOOST_TEST(!cb1.back().is_moved());
  1900. BOOST_TEST(cb1.back().value() == 1);
  1901. BOOST_TEST(var.is_moved());
  1902. BOOST_TEST(cb1.size() == 1);
  1903. var.reinit();
  1904. cb1.push_front(boost::move(var));
  1905. BOOST_TEST(!cb1.front().is_moved());
  1906. BOOST_TEST(cb1.front().value() == 2);
  1907. BOOST_TEST(var.is_moved());
  1908. BOOST_TEST(cb1.size() == 2);
  1909. cb1.push_back();
  1910. BOOST_TEST(!cb1.back().is_moved());
  1911. BOOST_TEST(cb1.back().value() == 3);
  1912. BOOST_TEST(cb1.size() == 3);
  1913. cb1.push_front();
  1914. BOOST_TEST(!cb1.front().is_moved());
  1915. BOOST_TEST(cb1.front().value() == 4);
  1916. BOOST_TEST(cb1.size() == 4);
  1917. cb1.insert(cb1.begin());
  1918. BOOST_TEST(!cb1.front().is_moved());
  1919. BOOST_TEST(cb1.front().value() == 5);
  1920. BOOST_TEST(cb1.size() == 5);
  1921. var.reinit();
  1922. cb1.insert(cb1.begin(), boost::move(var));
  1923. BOOST_TEST(!cb1.front().is_moved());
  1924. BOOST_TEST(cb1.front().value() == 6);
  1925. BOOST_TEST(cb1.size() == 6);
  1926. cb1.rinsert(cb1.begin());
  1927. BOOST_TEST(!cb1.front().is_moved());
  1928. BOOST_TEST(cb1.front().value() == 7);
  1929. BOOST_TEST(cb1.size() == 7);
  1930. var.reinit();
  1931. cb1.rinsert(cb1.begin(), boost::move(var));
  1932. BOOST_TEST(!cb1.front().is_moved());
  1933. BOOST_TEST(cb1.front().value() == 8);
  1934. BOOST_TEST(cb1.size() == 8);
  1935. BOOST_TEST(cb1[0].value() == 8);
  1936. BOOST_TEST(cb1[1].value() == 7);
  1937. BOOST_TEST(cb1[2].value() == 6);
  1938. BOOST_TEST(cb1[3].value() == 5);
  1939. BOOST_TEST(cb1[4].value() == 4);
  1940. BOOST_TEST(cb1[5].value() == 2);
  1941. BOOST_TEST(cb1[6].value() == 1);
  1942. BOOST_TEST(cb1[7].value() == 3);
  1943. cb1.rotate(cb1.begin() + 2);
  1944. BOOST_TEST(cb1[0].value() == 6);
  1945. BOOST_TEST(cb1[1].value() == 5);
  1946. BOOST_TEST(cb1[2].value() == 4);
  1947. BOOST_TEST(cb1[3].value() == 2);
  1948. BOOST_TEST(cb1[4].value() == 1);
  1949. BOOST_TEST(cb1[5].value() == 3);
  1950. BOOST_TEST(cb1[6].value() == 8);
  1951. BOOST_TEST(cb1[7].value() == 7);
  1952. BOOST_TEST(!cb1[0].is_moved());
  1953. BOOST_TEST(!cb1[1].is_moved());
  1954. BOOST_TEST(!cb1[2].is_moved());
  1955. BOOST_TEST(!cb1[3].is_moved());
  1956. BOOST_TEST(!cb1[4].is_moved());
  1957. BOOST_TEST(!cb1[5].is_moved());
  1958. BOOST_TEST(!cb1[6].is_moved());
  1959. BOOST_TEST(!cb1[7].is_moved());
  1960. cb1.linearize();
  1961. BOOST_TEST(!cb1[0].is_moved());
  1962. BOOST_TEST(!cb1[1].is_moved());
  1963. BOOST_TEST(!cb1[2].is_moved());
  1964. BOOST_TEST(!cb1[3].is_moved());
  1965. BOOST_TEST(!cb1[4].is_moved());
  1966. BOOST_TEST(!cb1[5].is_moved());
  1967. BOOST_TEST(!cb1[6].is_moved());
  1968. BOOST_TEST(!cb1[7].is_moved());
  1969. BOOST_TEST(cb1[0].value() == 6);
  1970. BOOST_TEST(cb1[1].value() == 5);
  1971. BOOST_TEST(cb1[2].value() == 4);
  1972. BOOST_TEST(cb1[3].value() == 2);
  1973. BOOST_TEST(cb1[4].value() == 1);
  1974. BOOST_TEST(cb1[5].value() == 3);
  1975. BOOST_TEST(cb1[6].value() == 8);
  1976. BOOST_TEST(cb1[7].value() == 7);
  1977. cb1.erase(cb1.begin());
  1978. BOOST_TEST(!cb1[0].is_moved());
  1979. BOOST_TEST(!cb1[1].is_moved());
  1980. BOOST_TEST(!cb1[2].is_moved());
  1981. BOOST_TEST(!cb1[3].is_moved());
  1982. BOOST_TEST(!cb1[4].is_moved());
  1983. BOOST_TEST(!cb1[5].is_moved());
  1984. BOOST_TEST(!cb1[6].is_moved());
  1985. BOOST_TEST(cb1[0].value() == 5);
  1986. BOOST_TEST(cb1[1].value() == 4);
  1987. BOOST_TEST(cb1[2].value() == 2);
  1988. BOOST_TEST(cb1[3].value() == 1);
  1989. BOOST_TEST(cb1[4].value() == 3);
  1990. BOOST_TEST(cb1[5].value() == 8);
  1991. BOOST_TEST(cb1[6].value() == 7);
  1992. cb1.rerase(cb1.begin());
  1993. BOOST_TEST(!cb1[0].is_moved());
  1994. BOOST_TEST(!cb1[1].is_moved());
  1995. BOOST_TEST(!cb1[2].is_moved());
  1996. BOOST_TEST(!cb1[3].is_moved());
  1997. BOOST_TEST(!cb1[4].is_moved());
  1998. BOOST_TEST(!cb1[5].is_moved());
  1999. BOOST_TEST(cb1[0].value() == 4);
  2000. BOOST_TEST(cb1[1].value() == 2);
  2001. BOOST_TEST(cb1[2].value() == 1);
  2002. BOOST_TEST(cb1[3].value() == 3);
  2003. BOOST_TEST(cb1[4].value() == 8);
  2004. BOOST_TEST(cb1[5].value() == 7);
  2005. cb1.erase(cb1.begin(), cb1.begin() + 1);
  2006. BOOST_TEST(!cb1[0].is_moved());
  2007. BOOST_TEST(!cb1[1].is_moved());
  2008. BOOST_TEST(!cb1[2].is_moved());
  2009. BOOST_TEST(!cb1[3].is_moved());
  2010. BOOST_TEST(!cb1[4].is_moved());
  2011. BOOST_TEST(cb1[0].value() == 2);
  2012. BOOST_TEST(cb1[1].value() == 1);
  2013. BOOST_TEST(cb1[2].value() == 3);
  2014. BOOST_TEST(cb1[3].value() == 8);
  2015. BOOST_TEST(cb1[4].value() == 7);
  2016. cb1.rerase(cb1.begin(), cb1.begin() + 1);
  2017. BOOST_TEST(!cb1[0].is_moved());
  2018. BOOST_TEST(!cb1[1].is_moved());
  2019. BOOST_TEST(!cb1[2].is_moved());
  2020. BOOST_TEST(!cb1[3].is_moved());
  2021. BOOST_TEST(cb1[0].value() == 1);
  2022. BOOST_TEST(cb1[1].value() == 3);
  2023. BOOST_TEST(cb1[2].value() == 8);
  2024. BOOST_TEST(cb1[3].value() == 7);
  2025. }
  2026. void move_container_values_noexcept() {
  2027. move_container_values_impl<noncopyable_movable_noexcept_t>();
  2028. typedef noncopyable_movable_noexcept_t noncopyable_movable_test_t;
  2029. noncopyable_movable_test_t::next_value = 1;
  2030. CB_CONTAINER<noncopyable_movable_test_t> cb1(40);
  2031. cb1.push_back();
  2032. cb1.push_back();
  2033. cb1.push_back();
  2034. cb1.push_back();
  2035. cb1.push_back();
  2036. cb1.push_back();
  2037. cb1.push_back();
  2038. cb1.push_back();
  2039. cb1.set_capacity(100);
  2040. BOOST_TEST(!cb1[0].is_moved());
  2041. BOOST_TEST(!cb1[1].is_moved());
  2042. BOOST_TEST(!cb1[2].is_moved());
  2043. BOOST_TEST(!cb1[3].is_moved());
  2044. BOOST_TEST(!cb1[4].is_moved());
  2045. BOOST_TEST(!cb1[5].is_moved());
  2046. BOOST_TEST(!cb1[6].is_moved());
  2047. BOOST_TEST(!cb1[7].is_moved());
  2048. BOOST_TEST(cb1[0].value() == 1);
  2049. BOOST_TEST(cb1[1].value() == 2);
  2050. BOOST_TEST(cb1[2].value() == 3);
  2051. BOOST_TEST(cb1[3].value() == 4);
  2052. BOOST_TEST(cb1[4].value() == 5);
  2053. BOOST_TEST(cb1[5].value() == 6);
  2054. BOOST_TEST(cb1[6].value() == 7);
  2055. BOOST_TEST(cb1[7].value() == 8);
  2056. cb1.rset_capacity(101);
  2057. BOOST_TEST(!cb1[0].is_moved());
  2058. BOOST_TEST(!cb1[1].is_moved());
  2059. BOOST_TEST(!cb1[2].is_moved());
  2060. BOOST_TEST(!cb1[3].is_moved());
  2061. BOOST_TEST(!cb1[4].is_moved());
  2062. BOOST_TEST(!cb1[5].is_moved());
  2063. BOOST_TEST(!cb1[6].is_moved());
  2064. BOOST_TEST(!cb1[7].is_moved());
  2065. BOOST_TEST(cb1[0].value() == 1);
  2066. BOOST_TEST(cb1[1].value() == 2);
  2067. BOOST_TEST(cb1[2].value() == 3);
  2068. BOOST_TEST(cb1[3].value() == 4);
  2069. BOOST_TEST(cb1[4].value() == 5);
  2070. BOOST_TEST(cb1[5].value() == 6);
  2071. BOOST_TEST(cb1[6].value() == 7);
  2072. BOOST_TEST(cb1[7].value() == 8);
  2073. cb1.set_capacity(2);
  2074. BOOST_TEST(!cb1[0].is_moved());
  2075. BOOST_TEST(!cb1[1].is_moved());
  2076. BOOST_TEST(cb1[0].value() == 1);
  2077. BOOST_TEST(cb1[1].value() == 2);
  2078. cb1.rset_capacity(1);
  2079. BOOST_TEST(!cb1[0].is_moved());
  2080. BOOST_TEST(cb1[0].value() == 2);
  2081. }
  2082. void check_containers_exception_specifications() {
  2083. #ifndef BOOST_NO_CXX11_NOEXCEPT
  2084. #ifndef BOOST_CLANG
  2085. // Clang has an error in __has_nothrow_constructor implementation:
  2086. // http://llvm.org/bugs/show_bug.cgi?id=16627
  2087. BOOST_TEST(boost::has_nothrow_constructor<CB_CONTAINER<int> >::value);
  2088. #endif
  2089. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  2090. #ifdef BOOST_IS_NOTHROW_MOVE_ASSIGN
  2091. BOOST_TEST(boost::is_nothrow_move_assignable<CB_CONTAINER<int> >::value);
  2092. #endif
  2093. #ifdef BOOST_IS_NOTHROW_MOVE_CONSTRUCT
  2094. BOOST_TEST(boost::is_nothrow_move_constructible<CB_CONTAINER<int> >::value);
  2095. #endif
  2096. #endif
  2097. #endif // BOOST_NO_CXX11_NOEXCEPT
  2098. }
  2099. // add common tests into a test suite
  2100. void run_common_tests()
  2101. {
  2102. basic_test();
  2103. constructor_and_element_access_test();
  2104. size_test();
  2105. allocator_test();
  2106. begin_and_end_test();
  2107. rbegin_and_rend_test();
  2108. element_access_and_insert_test();
  2109. at_test();
  2110. front_and_back_test();
  2111. linearize_test();
  2112. array_range_test();
  2113. capacity_and_reserve_test();
  2114. full_and_empty_test();
  2115. set_capacity_test();
  2116. rset_capacity_test();
  2117. resize_test();
  2118. rresize_test();
  2119. constructor_test();
  2120. assign_test();
  2121. copy_constructor_and_assign_test();
  2122. swap_test();
  2123. push_back_test();
  2124. pop_back_test();
  2125. insert_test();
  2126. insert_n_test();
  2127. insert_range_test();
  2128. push_front_test();
  2129. pop_front_test();
  2130. rinsert_test();
  2131. rinsert_n_test();
  2132. rinsert_range_test();
  2133. erase_test();
  2134. erase_range_test();
  2135. rerase_test();
  2136. rerase_range_test();
  2137. clear_test();
  2138. equality_test();
  2139. lexicographical_comparison_test();
  2140. assign_range_test();
  2141. example_test();
  2142. element_destruction_test();
  2143. const_methods_test();
  2144. rotate_test();
  2145. move_container_on_cpp11();
  2146. move_container_values_noexcept();
  2147. check_containers_exception_specifications();
  2148. #if !defined(BOOST_CB_NO_CXX11_ALLOCATOR)
  2149. cxx11_allocator_test();
  2150. #endif
  2151. }