test_vector.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. //---------------------------------------------------------------------------//
  2. // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // See http://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #define BOOST_TEST_MODULE TestVector
  11. #include <boost/test/unit_test.hpp>
  12. #include <boost/concept_check.hpp>
  13. #include <iostream>
  14. #include <boost/compute/system.hpp>
  15. #include <boost/compute/command_queue.hpp>
  16. #include <boost/compute/algorithm/copy.hpp>
  17. #include <boost/compute/algorithm/fill.hpp>
  18. #include <boost/compute/algorithm/find.hpp>
  19. #include <boost/compute/algorithm/remove.hpp>
  20. #include <boost/compute/allocator/pinned_allocator.hpp>
  21. #include <boost/compute/container/vector.hpp>
  22. #include "quirks.hpp"
  23. #include "check_macros.hpp"
  24. #include "context_setup.hpp"
  25. namespace bc = boost::compute;
  26. namespace compute = boost::compute;
  27. BOOST_AUTO_TEST_CASE(concept_check)
  28. {
  29. BOOST_CONCEPT_ASSERT((boost::Container<bc::vector<int> >));
  30. //BOOST_CONCEPT_ASSERT((boost::SequenceConcept<bc::vector<int> >));
  31. BOOST_CONCEPT_ASSERT((boost::ReversibleContainer<bc::vector<int> >));
  32. BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<bc::vector<int>::iterator>));
  33. BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<bc::vector<int>::const_iterator>));
  34. }
  35. BOOST_AUTO_TEST_CASE(size)
  36. {
  37. bc::vector<int> empty_vector(context);
  38. BOOST_CHECK_EQUAL(empty_vector.size(), size_t(0));
  39. BOOST_CHECK_EQUAL(empty_vector.empty(), true);
  40. bc::vector<int> int_vector(10, context);
  41. BOOST_CHECK_EQUAL(int_vector.size(), size_t(10));
  42. BOOST_CHECK_EQUAL(int_vector.empty(), false);
  43. }
  44. BOOST_AUTO_TEST_CASE(resize)
  45. {
  46. bc::vector<int> int_vector(10, context);
  47. BOOST_CHECK_EQUAL(int_vector.size(), size_t(10));
  48. int_vector.resize(20, queue);
  49. BOOST_CHECK_EQUAL(int_vector.size(), size_t(20));
  50. int_vector.resize(5, queue);
  51. BOOST_CHECK_EQUAL(int_vector.size(), size_t(5));
  52. }
  53. BOOST_AUTO_TEST_CASE(reserve)
  54. {
  55. const float growth_factor = 1.5f;
  56. bc::vector<int> int_vector(10, context);
  57. BOOST_CHECK_EQUAL(int_vector.size(), size_t(10));
  58. BOOST_CHECK_EQUAL(int_vector.capacity(), size_t(10));
  59. int_vector.reserve(20, queue);
  60. BOOST_CHECK_EQUAL(int_vector.size(), size_t(10));
  61. BOOST_CHECK_EQUAL(int_vector.capacity(), size_t(20 * growth_factor));
  62. int_vector.reserve(5, queue);
  63. BOOST_CHECK_EQUAL(int_vector.size(), size_t(10));
  64. BOOST_CHECK_EQUAL(int_vector.capacity(), size_t(20 * growth_factor));
  65. }
  66. BOOST_AUTO_TEST_CASE(array_operator)
  67. {
  68. bc::vector<int> vector(10, context);
  69. bc::fill(vector.begin(), vector.end(), 0, queue);
  70. CHECK_RANGE_EQUAL(int, 10, vector, (0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
  71. bc::fill(vector.begin(), vector.end(), 42, queue);
  72. CHECK_RANGE_EQUAL(int, 10, vector, (42, 42, 42, 42, 42, 42, 42, 42, 42, 42));
  73. vector[0] = 9;
  74. CHECK_RANGE_EQUAL(int, 10, vector, (9, 42, 42, 42, 42, 42, 42, 42, 42, 42));
  75. }
  76. BOOST_AUTO_TEST_CASE(front_and_back)
  77. {
  78. int int_data[] = { 1, 2, 3, 4, 5 };
  79. bc::vector<int> int_vector(5, context);
  80. bc::copy(int_data, int_data + 5, int_vector.begin(), queue);
  81. queue.finish();
  82. BOOST_CHECK_EQUAL(int_vector.front(), 1);
  83. BOOST_CHECK_EQUAL(int_vector.back(), 5);
  84. bc::fill(int_vector.begin(), int_vector.end(), 10, queue);
  85. queue.finish();
  86. BOOST_CHECK_EQUAL(int_vector.front(), 10);
  87. BOOST_CHECK_EQUAL(int_vector.back(), 10);
  88. float float_data[] = { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f };
  89. bc::vector<float> float_vector(5, context);
  90. bc::copy(float_data, float_data + 5, float_vector.begin(), queue);
  91. queue.finish();
  92. BOOST_CHECK_EQUAL(float_vector.front(), 1.1f);
  93. BOOST_CHECK_EQUAL(float_vector.back(), 5.5f);
  94. }
  95. BOOST_AUTO_TEST_CASE(host_iterator_constructor)
  96. {
  97. std::vector<int> host_vector;
  98. host_vector.push_back(10);
  99. host_vector.push_back(20);
  100. host_vector.push_back(30);
  101. host_vector.push_back(40);
  102. bc::vector<int> device_vector(host_vector.begin(), host_vector.end(),
  103. queue);
  104. CHECK_RANGE_EQUAL(int, 4, device_vector, (10, 20, 30, 40));
  105. }
  106. BOOST_AUTO_TEST_CASE(device_iterator_constructor)
  107. {
  108. int data[] = { 1, 5, 10, 15 };
  109. bc::vector<int> a(data, data + 4, queue);
  110. CHECK_RANGE_EQUAL(int, 4, a, (1, 5, 10, 15));
  111. bc::vector<int> b(a.begin(), a.end(), queue);
  112. CHECK_RANGE_EQUAL(int, 4, b, (1, 5, 10, 15));
  113. }
  114. BOOST_AUTO_TEST_CASE(push_back)
  115. {
  116. bc::vector<int> vector(context);
  117. BOOST_VERIFY(vector.empty());
  118. vector.push_back(12, queue);
  119. BOOST_VERIFY(!vector.empty());
  120. BOOST_CHECK_EQUAL(vector.size(), size_t(1));
  121. CHECK_RANGE_EQUAL(int, 1, vector, (12));
  122. vector.push_back(24, queue);
  123. BOOST_CHECK_EQUAL(vector.size(), size_t(2));
  124. CHECK_RANGE_EQUAL(int, 2, vector, (12, 24));
  125. vector.push_back(36, queue);
  126. BOOST_CHECK_EQUAL(vector.size(), size_t(3));
  127. CHECK_RANGE_EQUAL(int, 3, vector, (12, 24, 36));
  128. for(int i = 0; i < 100; i++){
  129. vector.push_back(i, queue);
  130. }
  131. queue.finish();
  132. BOOST_CHECK_EQUAL(vector.size(), size_t(103));
  133. BOOST_CHECK_EQUAL(vector[0], 12);
  134. BOOST_CHECK_EQUAL(vector[1], 24);
  135. BOOST_CHECK_EQUAL(vector[2], 36);
  136. BOOST_CHECK_EQUAL(vector[102], 99);
  137. }
  138. BOOST_AUTO_TEST_CASE(at)
  139. {
  140. bc::vector<int> vector(context);
  141. vector.push_back(1, queue);
  142. vector.push_back(2, queue);
  143. vector.push_back(3, queue);
  144. queue.finish();
  145. BOOST_CHECK_EQUAL(vector.at(0), 1);
  146. BOOST_CHECK_EQUAL(vector.at(1), 2);
  147. BOOST_CHECK_EQUAL(vector.at(2), 3);
  148. BOOST_CHECK_THROW(vector.at(3), std::out_of_range);
  149. }
  150. BOOST_AUTO_TEST_CASE(erase)
  151. {
  152. int data[] = { 1, 2, 5, 7, 9 };
  153. bc::vector<int> vector(data, data + 5, queue);
  154. queue.finish();
  155. BOOST_CHECK_EQUAL(vector.size(), size_t(5));
  156. vector.erase(vector.begin() + 1, queue);
  157. BOOST_CHECK_EQUAL(vector.size(), size_t(4));
  158. CHECK_RANGE_EQUAL(int, 4, vector, (1, 5, 7, 9));
  159. vector.erase(vector.begin() + 2, vector.end(), queue);
  160. BOOST_CHECK_EQUAL(vector.size(), size_t(2));
  161. CHECK_RANGE_EQUAL(int, 2, vector, (1, 5));
  162. }
  163. BOOST_AUTO_TEST_CASE(max_size)
  164. {
  165. bc::vector<int> vector(100, context);
  166. BOOST_CHECK_EQUAL(vector.size(), size_t(100));
  167. BOOST_VERIFY(vector.max_size() > vector.size());
  168. }
  169. #ifndef BOOST_COMPUTE_NO_RVALUE_REFERENCES
  170. BOOST_AUTO_TEST_CASE(move_ctor)
  171. {
  172. int data[] = { 11, 12, 13, 14 };
  173. bc::vector<int> a(data, data + 4, queue);
  174. BOOST_CHECK_EQUAL(a.size(), size_t(4));
  175. CHECK_RANGE_EQUAL(int, 4, a, (11, 12, 13, 14));
  176. bc::vector<int> b(std::move(a));
  177. BOOST_CHECK(a.size() == 0);
  178. BOOST_CHECK(a.get_buffer().get() == 0);
  179. BOOST_CHECK_EQUAL(b.size(), size_t(4));
  180. CHECK_RANGE_EQUAL(int, 4, b, (11, 12, 13, 14));
  181. }
  182. BOOST_AUTO_TEST_CASE(move_ctor_custom_alloc)
  183. {
  184. int data[] = { 11, 12, 13, 14 };
  185. bc::vector<int, bc::pinned_allocator<int> > a(data, data + 4, queue);
  186. BOOST_CHECK_EQUAL(a.size(), size_t(4));
  187. CHECK_RANGE_EQUAL(int, 4, a, (11, 12, 13, 14));
  188. bc::vector<int, bc::pinned_allocator<int> > b(std::move(a));
  189. BOOST_CHECK(a.size() == 0);
  190. BOOST_CHECK(a.get_buffer().get() == 0);
  191. BOOST_CHECK_EQUAL(b.size(), size_t(4));
  192. CHECK_RANGE_EQUAL(int, 4, b, (11, 12, 13, 14));
  193. }
  194. #endif // BOOST_COMPUTE_NO_RVALUE_REFERENCES
  195. #ifdef BOOST_COMPUTE_USE_CPP11
  196. #ifndef BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST
  197. BOOST_AUTO_TEST_CASE(initializer_list_ctor)
  198. {
  199. // ctor with std::initializer_list<T> always uses
  200. // default_queue in this case
  201. bc::vector<int> vector = { 2, -4, 6, 8 };
  202. BOOST_CHECK_EQUAL(vector.size(), size_t(4));
  203. BOOST_CHECK_EQUAL(vector[0], 2);
  204. BOOST_CHECK_EQUAL(vector[1], -4);
  205. BOOST_CHECK_EQUAL(vector[2], 6);
  206. BOOST_CHECK_EQUAL(vector[3], 8);
  207. }
  208. #endif // BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST
  209. #endif // BOOST_COMPUTE_USE_CPP11
  210. BOOST_AUTO_TEST_CASE(vector_double)
  211. {
  212. if(!device.supports_extension("cl_khr_fp64")){
  213. return;
  214. }
  215. bc::vector<double> vector(context);
  216. vector.push_back(1.21, queue);
  217. vector.push_back(3.14, queue);
  218. vector.push_back(7.89, queue);
  219. BOOST_CHECK_EQUAL(vector.size(), size_t(3));
  220. CHECK_RANGE_EQUAL(double, 3, vector, (1.21, 3.14, 7.89));
  221. bc::vector<double> other(vector.begin(), vector.end(), queue);
  222. CHECK_RANGE_EQUAL(double, 3, other, (1.21, 3.14, 7.89));
  223. bc::fill(other.begin(), other.end(), 8.95, queue);
  224. CHECK_RANGE_EQUAL(double, 3, other, (8.95, 8.95, 8.95));
  225. }
  226. BOOST_AUTO_TEST_CASE(vector_iterator)
  227. {
  228. bc::vector<int> vector(context);
  229. vector.push_back(2, queue);
  230. vector.push_back(4, queue);
  231. vector.push_back(6, queue);
  232. vector.push_back(8, queue);
  233. queue.finish();
  234. BOOST_CHECK_EQUAL(vector.size(), size_t(4));
  235. BOOST_CHECK_EQUAL(vector[0], 2);
  236. BOOST_CHECK_EQUAL(*vector.begin(), 2);
  237. BOOST_CHECK_EQUAL(vector.begin()[0], 2);
  238. BOOST_CHECK_EQUAL(vector[1], 4);
  239. BOOST_CHECK_EQUAL(*(vector.begin()+1), 4);
  240. BOOST_CHECK_EQUAL(vector.begin()[1], 4);
  241. BOOST_CHECK_EQUAL(vector[2], 6);
  242. BOOST_CHECK_EQUAL(*(vector.begin()+2), 6);
  243. BOOST_CHECK_EQUAL(vector.begin()[2], 6);
  244. BOOST_CHECK_EQUAL(vector[3], 8);
  245. BOOST_CHECK_EQUAL(*(vector.begin()+3), 8);
  246. BOOST_CHECK_EQUAL(vector.begin()[3], 8);
  247. }
  248. BOOST_AUTO_TEST_CASE(vector_erase_remove)
  249. {
  250. int data[] = { 2, 6, 3, 4, 2, 4, 5, 6, 1 };
  251. bc::vector<int> vector(data, data + 9, queue);
  252. BOOST_CHECK_EQUAL(vector.size(), size_t(9));
  253. // remove 4's
  254. vector.erase(bc::remove(vector.begin(), vector.end(), 4, queue), vector.end());
  255. BOOST_CHECK_EQUAL(vector.size(), size_t(7));
  256. BOOST_VERIFY(bc::find(vector.begin(), vector.end(), 4, queue) == vector.end());
  257. // remove 2's
  258. vector.erase(bc::remove(vector.begin(), vector.end(), 2, queue), vector.end());
  259. BOOST_CHECK_EQUAL(vector.size(), size_t(5));
  260. BOOST_VERIFY(bc::find(vector.begin(), vector.end(), 2, queue) == vector.end());
  261. // remove 6's
  262. vector.erase(bc::remove(vector.begin(), vector.end(), 6, queue), vector.end());
  263. BOOST_CHECK_EQUAL(vector.size(), size_t(3));
  264. BOOST_VERIFY(bc::find(vector.begin(), vector.end(), 6, queue) == vector.end());
  265. // check the rest of the values
  266. CHECK_RANGE_EQUAL(int, 3, vector, (3, 5, 1));
  267. }
  268. // see issue #132 (https://github.com/boostorg/compute/issues/132)
  269. BOOST_AUTO_TEST_CASE(swap_between_contexts)
  270. {
  271. compute::context ctx1(device);
  272. compute::context ctx2(device);
  273. compute::vector<int> vec1(32, ctx1);
  274. compute::vector<int> vec2(32, ctx2);
  275. BOOST_CHECK(vec1.get_allocator().get_context() == ctx1);
  276. BOOST_CHECK(vec2.get_allocator().get_context() == ctx2);
  277. vec1.swap(vec2);
  278. BOOST_CHECK(vec1.get_allocator().get_context() == ctx2);
  279. BOOST_CHECK(vec2.get_allocator().get_context() == ctx1);
  280. vec1.resize(64);
  281. vec2.resize(64);
  282. }
  283. BOOST_AUTO_TEST_CASE(assign_from_std_vector)
  284. {
  285. std::vector<int> host_vector;
  286. host_vector.push_back(1);
  287. host_vector.push_back(9);
  288. host_vector.push_back(7);
  289. host_vector.push_back(9);
  290. compute::vector<int> device_vector(context);
  291. device_vector.assign(host_vector.begin(), host_vector.end(), queue);
  292. BOOST_CHECK_EQUAL(device_vector.size(), size_t(4));
  293. CHECK_RANGE_EQUAL(int, 4, device_vector, (1, 9, 7, 9));
  294. }
  295. BOOST_AUTO_TEST_CASE(assign_constant_value)
  296. {
  297. compute::vector<float> device_vector(10, context);
  298. device_vector.assign(3, 6.28f, queue);
  299. BOOST_CHECK_EQUAL(device_vector.size(), size_t(3));
  300. CHECK_RANGE_EQUAL(float, 3, device_vector, (6.28f, 6.28f, 6.28f));
  301. }
  302. BOOST_AUTO_TEST_CASE(resize_throw_exception)
  303. {
  304. if(bug_in_clcreatebuffer(device)) {
  305. std::cerr
  306. << "skipping resize_throw_exception test on Apple platform"
  307. << std::endl;
  308. return;
  309. }
  310. // create vector with eight items
  311. int data[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  312. compute::vector<int> vec(data, data + 8, queue);
  313. // try to resize to 2x larger than the global memory size
  314. BOOST_CHECK_THROW(
  315. vec.resize((device.global_memory_size() / sizeof(int)) * 2),
  316. boost::compute::opencl_error
  317. );
  318. // ensure vector data is still the same
  319. BOOST_CHECK_EQUAL(vec.size(), size_t(8));
  320. CHECK_RANGE_EQUAL(int, 8, vec, (1, 2, 3, 4, 5, 6, 7, 8));
  321. }
  322. BOOST_AUTO_TEST_CASE(copy_ctor_custom_alloc)
  323. {
  324. int data[] = { 11, 12, 13, 14 };
  325. bc::vector<int, bc::pinned_allocator<int> > a(data, data + 4, queue);
  326. BOOST_CHECK_EQUAL(a.size(), size_t(4));
  327. CHECK_RANGE_EQUAL(int, 4, a, (11, 12, 13, 14));
  328. bc::vector<int, bc::pinned_allocator<int> > b(a, queue);
  329. BOOST_CHECK_EQUAL(b.size(), size_t(4));
  330. CHECK_RANGE_EQUAL(int, 4, b, (11, 12, 13, 14));
  331. }
  332. BOOST_AUTO_TEST_CASE(copy_ctor_different_alloc)
  333. {
  334. int data[] = { 11, 12, 13, 14 };
  335. bc::vector<int> a(data, data + 4, queue);
  336. BOOST_CHECK_EQUAL(a.size(), size_t(4));
  337. CHECK_RANGE_EQUAL(int, 4, a, (11, 12, 13, 14));
  338. bc::vector<int, bc::pinned_allocator<int> > b(a, queue);
  339. BOOST_CHECK_EQUAL(b.size(), size_t(4));
  340. CHECK_RANGE_EQUAL(int, 4, b, (11, 12, 13, 14));
  341. std::vector<int> host_vector;
  342. host_vector.push_back(1);
  343. host_vector.push_back(9);
  344. host_vector.push_back(7);
  345. host_vector.push_back(9);
  346. bc::vector<int, bc::pinned_allocator<int> > c(host_vector, queue);
  347. BOOST_CHECK_EQUAL(c.size(), size_t(4));
  348. CHECK_RANGE_EQUAL(int, 4, c, (1, 9, 7, 9));
  349. }
  350. BOOST_AUTO_TEST_CASE(assignment_operator)
  351. {
  352. int adata[] = { 11, 12, 13, 14 };
  353. bc::vector<int> a(adata, adata + 4, queue);
  354. BOOST_CHECK_EQUAL(a.size(), size_t(4));
  355. CHECK_RANGE_EQUAL(int, 4, a, (11, 12, 13, 14));
  356. bc::vector<int> b = a;
  357. BOOST_CHECK_EQUAL(b.size(), size_t(4));
  358. CHECK_RANGE_EQUAL(int, 4, b, (11, 12, 13, 14));
  359. bc::vector<int, bc::pinned_allocator<int> > c(context);
  360. c = b;
  361. BOOST_CHECK_EQUAL(c.size(), size_t(4));
  362. CHECK_RANGE_EQUAL(int, 4, c, (11, 12, 13, 14));
  363. int ddata[] = { 21, 22, 23 };
  364. bc::vector<int, bc::pinned_allocator<int> > d(ddata, ddata + 3, queue);
  365. BOOST_CHECK_EQUAL(d.size(), size_t(3));
  366. CHECK_RANGE_EQUAL(int, 3, d, (21, 22, 23));
  367. a = d;
  368. BOOST_CHECK_EQUAL(a.size(), size_t(3));
  369. CHECK_RANGE_EQUAL(int, 3, a, (21, 22, 23));
  370. std::vector<int> host_vector;
  371. host_vector.push_back(1);
  372. host_vector.push_back(9);
  373. host_vector.push_back(7);
  374. host_vector.push_back(9);
  375. d = host_vector;
  376. BOOST_CHECK_EQUAL(d.size(), size_t(4));
  377. CHECK_RANGE_EQUAL(int, 4, d, (1, 9, 7, 9));
  378. }
  379. BOOST_AUTO_TEST_CASE(swap_ctor_custom_alloc)
  380. {
  381. int adata[] = { 11, 12, 13, 14 };
  382. bc::vector<int, bc::pinned_allocator<int> > a(adata, adata + 4, queue);
  383. BOOST_CHECK_EQUAL(a.size(), size_t(4));
  384. CHECK_RANGE_EQUAL(int, 4, a, (11, 12, 13, 14));
  385. int bdata[] = { 21, 22, 23 };
  386. bc::vector<int, bc::pinned_allocator<int> > b(bdata, bdata + 3, queue);
  387. BOOST_CHECK_EQUAL(b.size(), size_t(3));
  388. CHECK_RANGE_EQUAL(int, 3, b, (21, 22, 23));
  389. a.swap(b);
  390. BOOST_CHECK_EQUAL(a.size(), size_t(3));
  391. CHECK_RANGE_EQUAL(int, 3, a, (21, 22, 23));
  392. BOOST_CHECK_EQUAL(b.size(), size_t(4));
  393. CHECK_RANGE_EQUAL(int, 4, b, (11, 12, 13, 14));
  394. }
  395. BOOST_AUTO_TEST_CASE(shrink_to_fit)
  396. {
  397. bc::vector<bc::int_> int_vector(5, context);
  398. BOOST_CHECK_EQUAL(int_vector.size(), 5);
  399. BOOST_CHECK(int_vector.capacity() >= 5);
  400. int_vector.reserve(15);
  401. BOOST_CHECK_EQUAL(int_vector.size(), 5);
  402. BOOST_CHECK(int_vector.capacity() >= 15);
  403. int_vector.shrink_to_fit();
  404. BOOST_CHECK_EQUAL(int_vector.size(), 5);
  405. BOOST_CHECK_EQUAL(int_vector.capacity(), 5);
  406. int_vector.clear();
  407. BOOST_CHECK_EQUAL(int_vector.size(), 0);
  408. BOOST_CHECK_EQUAL(int_vector.capacity(), 5);
  409. int_vector.shrink_to_fit();
  410. BOOST_CHECK_EQUAL(int_vector.size(), 0);
  411. BOOST_CHECK_EQUAL(int_vector.capacity(), 0);
  412. int_vector.reserve(15);
  413. BOOST_CHECK_EQUAL(int_vector.size(), 0);
  414. BOOST_CHECK(int_vector.capacity() >= 15);
  415. }
  416. BOOST_AUTO_TEST_SUITE_END()