varray.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. // Boost.Geometry.Index varray
  2. // Unit Test
  3. // Copyright (c) 2012-2014 Adam Wulkiewicz, Lodz, Poland.
  4. // Copyright (c) 2012-2013 Andrew Hundt.
  5. // Use, modification and distribution is subject to the Boost Software License,
  6. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #include <boost/test/included/test_exec_monitor.hpp>
  9. #include <boost/test/impl/execution_monitor.ipp>
  10. // TODO: Disable parts of the unit test that should not run when BOOST_NO_EXCEPTIONS
  11. // if exceptions are enabled there must be a user defined throw_exception function
  12. #ifdef BOOST_NO_EXCEPTIONS
  13. namespace boost {
  14. void throw_exception(std::exception const & e){}; // user defined
  15. } // namespace boost
  16. #endif // BOOST_NO_EXCEPTIONS
  17. #include <vector>
  18. #include <list>
  19. #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
  20. #include <boost/container/vector.hpp>
  21. #include <boost/container/stable_vector.hpp>
  22. using namespace boost::container;
  23. #endif
  24. #include "varray_test.hpp"
  25. using namespace boost::geometry::index::detail;
  26. template <typename T, size_t N>
  27. void test_ctor_ndc()
  28. {
  29. varray<T, N> s;
  30. BOOST_CHECK_EQUAL(s.size(), 0u);
  31. BOOST_CHECK(s.capacity() == N);
  32. #ifndef BOOST_NO_EXCEPTIONS
  33. BOOST_CHECK_THROW( s.at(0), std::out_of_range );
  34. #endif // BOOST_NO_EXCEPTIONS
  35. }
  36. template <typename T, size_t N>
  37. void test_ctor_nc(size_t n)
  38. {
  39. varray<T, N> s(n);
  40. BOOST_CHECK(s.size() == n);
  41. BOOST_CHECK(s.capacity() == N);
  42. #ifndef BOOST_NO_EXCEPTIONS
  43. BOOST_CHECK_THROW( s.at(n), std::out_of_range );
  44. #endif // BOOST_NO_EXCEPTIONS
  45. if ( 1 < n )
  46. {
  47. T val10(10);
  48. s[0] = val10;
  49. BOOST_CHECK(T(10) == s[0]);
  50. BOOST_CHECK(T(10) == s.at(0));
  51. T val20(20);
  52. s.at(1) = val20;
  53. BOOST_CHECK(T(20) == s[1]);
  54. BOOST_CHECK(T(20) == s.at(1));
  55. }
  56. }
  57. template <typename T, size_t N>
  58. void test_ctor_nd(size_t n, T const& v)
  59. {
  60. varray<T, N> s(n, v);
  61. BOOST_CHECK(s.size() == n);
  62. BOOST_CHECK(s.capacity() == N);
  63. #ifndef BOOST_NO_EXCEPTIONS
  64. BOOST_CHECK_THROW( s.at(n), std::out_of_range );
  65. #endif // BOOST_NO_EXCEPTIONS
  66. if ( 1 < n )
  67. {
  68. BOOST_CHECK(v == s[0]);
  69. BOOST_CHECK(v == s.at(0));
  70. BOOST_CHECK(v == s[1]);
  71. BOOST_CHECK(v == s.at(1));
  72. s[0] = T(10);
  73. BOOST_CHECK(T(10) == s[0]);
  74. BOOST_CHECK(T(10) == s.at(0));
  75. s.at(1) = T(20);
  76. BOOST_CHECK(T(20) == s[1]);
  77. BOOST_CHECK(T(20) == s.at(1));
  78. }
  79. }
  80. template <typename T, size_t N>
  81. void test_resize_nc(size_t n)
  82. {
  83. varray<T, N> s;
  84. s.resize(n);
  85. BOOST_CHECK(s.size() == n);
  86. BOOST_CHECK(s.capacity() == N);
  87. #ifndef BOOST_NO_EXCEPTIONS
  88. BOOST_CHECK_THROW( s.at(n), std::out_of_range );
  89. #endif // BOOST_NO_EXCEPTIONS
  90. if ( 1 < n )
  91. {
  92. T val10(10);
  93. s[0] = val10;
  94. BOOST_CHECK(T(10) == s[0]);
  95. BOOST_CHECK(T(10) == s.at(0));
  96. T val20(20);
  97. s.at(1) = val20;
  98. BOOST_CHECK(T(20) == s[1]);
  99. BOOST_CHECK(T(20) == s.at(1));
  100. }
  101. }
  102. template <typename T, size_t N>
  103. void test_resize_nd(size_t n, T const& v)
  104. {
  105. varray<T, N> s;
  106. s.resize(n, v);
  107. BOOST_CHECK(s.size() == n);
  108. BOOST_CHECK(s.capacity() == N);
  109. #ifndef BOOST_NO_EXCEPTIONS
  110. BOOST_CHECK_THROW( s.at(n), std::out_of_range );
  111. #endif // BOOST_NO_EXCEPTIONS
  112. if ( 1 < n )
  113. {
  114. BOOST_CHECK(v == s[0]);
  115. BOOST_CHECK(v == s.at(0));
  116. BOOST_CHECK(v == s[1]);
  117. BOOST_CHECK(v == s.at(1));
  118. s[0] = T(10);
  119. BOOST_CHECK(T(10) == s[0]);
  120. BOOST_CHECK(T(10) == s.at(0));
  121. s.at(1) = T(20);
  122. BOOST_CHECK(T(20) == s[1]);
  123. BOOST_CHECK(T(20) == s.at(1));
  124. }
  125. }
  126. template <typename T, size_t N>
  127. void test_push_back_nd()
  128. {
  129. varray<T, N> s;
  130. BOOST_CHECK(s.size() == 0);
  131. #ifndef BOOST_NO_EXCEPTIONS
  132. BOOST_CHECK_THROW( s.at(0), std::out_of_range );
  133. #endif // BOOST_NO_EXCEPTIONS
  134. for ( size_t i = 0 ; i < N ; ++i )
  135. {
  136. T t(i);
  137. s.push_back(t);
  138. BOOST_CHECK(s.size() == i + 1);
  139. #ifndef BOOST_NO_EXCEPTIONS
  140. BOOST_CHECK_THROW( s.at(i + 1), std::out_of_range );
  141. #endif // BOOST_NO_EXCEPTIONS
  142. BOOST_CHECK(T(i) == s.at(i));
  143. BOOST_CHECK(T(i) == s[i]);
  144. BOOST_CHECK(T(i) == s.back());
  145. BOOST_CHECK(T(0) == s.front());
  146. BOOST_CHECK(T(i) == *(s.data() + i));
  147. }
  148. }
  149. template <typename T, size_t N>
  150. void test_pop_back_nd()
  151. {
  152. varray<T, N> s;
  153. for ( size_t i = 0 ; i < N ; ++i )
  154. {
  155. T t(i);
  156. s.push_back(t);
  157. }
  158. for ( size_t i = N ; i > 1 ; --i )
  159. {
  160. s.pop_back();
  161. BOOST_CHECK(s.size() == i - 1);
  162. #ifndef BOOST_NO_EXCEPTIONS
  163. BOOST_CHECK_THROW( s.at(i - 1), std::out_of_range );
  164. #endif // BOOST_NO_EXCEPTIONS
  165. BOOST_CHECK(T(i - 2) == s.at(i - 2));
  166. BOOST_CHECK(T(i - 2) == s[i - 2]);
  167. BOOST_CHECK(T(i - 2) == s.back());
  168. BOOST_CHECK(T(0) == s.front());
  169. }
  170. }
  171. template <typename It1, typename It2>
  172. void test_compare_ranges(It1 first1, It1 last1, It2 first2, It2 last2)
  173. {
  174. BOOST_CHECK(std::distance(first1, last1) == std::distance(first2, last2));
  175. for ( ; first1 != last1 && first2 != last2 ; ++first1, ++first2 )
  176. BOOST_CHECK(*first1 == *first2);
  177. }
  178. template <typename T, size_t N, typename C>
  179. void test_copy_and_assign(C const& c)
  180. {
  181. {
  182. varray<T, N> s(c.begin(), c.end());
  183. BOOST_CHECK(s.size() == c.size());
  184. test_compare_ranges(s.begin(), s.end(), c.begin(), c.end());
  185. }
  186. {
  187. varray<T, N> s;
  188. BOOST_CHECK(0 == s.size());
  189. s.assign(c.begin(), c.end());
  190. BOOST_CHECK(s.size() == c.size());
  191. test_compare_ranges(s.begin(), s.end(), c.begin(), c.end());
  192. }
  193. }
  194. template <typename T, size_t N>
  195. void test_copy_and_assign_nd(T const& val)
  196. {
  197. varray<T, N> s;
  198. std::vector<T> v;
  199. std::list<T> l;
  200. for ( size_t i = 0 ; i < N ; ++i )
  201. {
  202. T t(i);
  203. s.push_back(t);
  204. v.push_back(t);
  205. l.push_back(t);
  206. }
  207. // copy ctor
  208. {
  209. varray<T, N> s1(s);
  210. BOOST_CHECK(s.size() == s1.size());
  211. test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
  212. }
  213. // copy assignment
  214. {
  215. varray<T, N> s1;
  216. BOOST_CHECK(0 == s1.size());
  217. s1 = s;
  218. BOOST_CHECK(s.size() == s1.size());
  219. test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
  220. }
  221. // ctor(Iter, Iter) and assign(Iter, Iter)
  222. test_copy_and_assign<T, N>(s);
  223. test_copy_and_assign<T, N>(v);
  224. test_copy_and_assign<T, N>(l);
  225. // assign(N, V)
  226. {
  227. varray<T, N> s1(s);
  228. test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
  229. std::vector<T> a(N, val);
  230. s1.assign(N, val);
  231. test_compare_ranges(a.begin(), a.end(), s1.begin(), s1.end());
  232. }
  233. #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
  234. stable_vector<T> bsv(s.begin(), s.end());
  235. vector<T> bv(s.begin(), s.end());
  236. test_copy_and_assign<T, N>(bsv);
  237. test_copy_and_assign<T, N>(bv);
  238. #endif
  239. }
  240. template <typename T, size_t N>
  241. void test_iterators_nd()
  242. {
  243. varray<T, N> s;
  244. std::vector<T> v;
  245. for ( size_t i = 0 ; i < N ; ++i )
  246. {
  247. s.push_back(T(i));
  248. v.push_back(T(i));
  249. }
  250. test_compare_ranges(s.begin(), s.end(), v.begin(), v.end());
  251. test_compare_ranges(s.rbegin(), s.rend(), v.rbegin(), v.rend());
  252. s.assign(v.rbegin(), v.rend());
  253. test_compare_ranges(s.cbegin(), s.cend(), v.rbegin(), v.rend());
  254. test_compare_ranges(s.crbegin(), s.crend(), v.begin(), v.end());
  255. varray<T, N> const& cs = s;
  256. std::vector<T> const& cv = v;
  257. s.assign(cv.rbegin(), cv.rend());
  258. test_compare_ranges(cs.begin(), cs.end(), cv.rbegin(), cv.rend());
  259. test_compare_ranges(cs.rbegin(), cs.rend(), cv.begin(), cv.end());
  260. }
  261. template <typename T, size_t N>
  262. void test_erase_nd()
  263. {
  264. varray<T, N> s;
  265. typedef typename varray<T, N>::iterator It;
  266. for ( size_t i = 0 ; i < N ; ++i )
  267. s.push_back(T(i));
  268. // erase(pos)
  269. {
  270. for ( size_t i = 0 ; i < N ; ++i )
  271. {
  272. varray<T, N> s1(s);
  273. It it = s1.erase(s1.begin() + i);
  274. BOOST_CHECK(s1.begin() + i == it);
  275. BOOST_CHECK(s1.size() == N - 1);
  276. for ( size_t j = 0 ; j < i ; ++j )
  277. BOOST_CHECK(s1[j] == T(j));
  278. for ( size_t j = i+1 ; j < N ; ++j )
  279. BOOST_CHECK(s1[j-1] == T(j));
  280. }
  281. }
  282. // erase(first, last)
  283. {
  284. size_t n = N/3;
  285. for ( size_t i = 0 ; i <= N ; ++i )
  286. {
  287. varray<T, N> s1(s);
  288. size_t removed = i + n < N ? n : N - i;
  289. It it = s1.erase(s1.begin() + i, s1.begin() + i + removed);
  290. BOOST_CHECK(s1.begin() + i == it);
  291. BOOST_CHECK(s1.size() == N - removed);
  292. for ( size_t j = 0 ; j < i ; ++j )
  293. BOOST_CHECK(s1[j] == T(j));
  294. for ( size_t j = i+n ; j < N ; ++j )
  295. BOOST_CHECK(s1[j-n] == T(j));
  296. }
  297. }
  298. }
  299. template <typename T, size_t N, typename SV, typename C>
  300. void test_insert(SV const& s, C const& c)
  301. {
  302. size_t h = N/2;
  303. size_t n = size_t(h/1.5f);
  304. for ( size_t i = 0 ; i <= h ; ++i )
  305. {
  306. varray<T, N> s1(s);
  307. typename C::const_iterator it = c.begin();
  308. std::advance(it, n);
  309. typename varray<T, N>::iterator
  310. it1 = s1.insert(s1.begin() + i, c.begin(), it);
  311. BOOST_CHECK(s1.begin() + i == it1);
  312. BOOST_CHECK(s1.size() == h+n);
  313. for ( size_t j = 0 ; j < i ; ++j )
  314. BOOST_CHECK(s1[j] == T(j));
  315. for ( size_t j = 0 ; j < n ; ++j )
  316. BOOST_CHECK(s1[j+i] == T(100 + j));
  317. for ( size_t j = 0 ; j < h-i ; ++j )
  318. BOOST_CHECK(s1[j+i+n] == T(j+i));
  319. }
  320. }
  321. template <typename T, size_t N>
  322. void test_insert_nd(T const& val)
  323. {
  324. size_t h = N/2;
  325. varray<T, N> s, ss;
  326. std::vector<T> v;
  327. std::list<T> l;
  328. typedef typename varray<T, N>::iterator It;
  329. for ( size_t i = 0 ; i < h ; ++i )
  330. {
  331. s.push_back(T(i));
  332. ss.push_back(T(100 + i));
  333. v.push_back(T(100 + i));
  334. l.push_back(T(100 + i));
  335. }
  336. // insert(pos, val)
  337. {
  338. for ( size_t i = 0 ; i <= h ; ++i )
  339. {
  340. varray<T, N> s1(s);
  341. It it = s1.insert(s1.begin() + i, val);
  342. BOOST_CHECK(s1.begin() + i == it);
  343. BOOST_CHECK(s1.size() == h+1);
  344. for ( size_t j = 0 ; j < i ; ++j )
  345. BOOST_CHECK(s1[j] == T(j));
  346. BOOST_CHECK(s1[i] == val);
  347. for ( size_t j = 0 ; j < h-i ; ++j )
  348. BOOST_CHECK(s1[j+i+1] == T(j+i));
  349. }
  350. }
  351. // insert(pos, n, val)
  352. {
  353. size_t n = size_t(h/1.5f);
  354. for ( size_t i = 0 ; i <= h ; ++i )
  355. {
  356. varray<T, N> s1(s);
  357. It it = s1.insert(s1.begin() + i, n, val);
  358. BOOST_CHECK(s1.begin() + i == it);
  359. BOOST_CHECK(s1.size() == h+n);
  360. for ( size_t j = 0 ; j < i ; ++j )
  361. BOOST_CHECK(s1[j] == T(j));
  362. for ( size_t j = 0 ; j < n ; ++j )
  363. BOOST_CHECK(s1[j+i] == val);
  364. for ( size_t j = 0 ; j < h-i ; ++j )
  365. BOOST_CHECK(s1[j+i+n] == T(j+i));
  366. }
  367. }
  368. // insert(pos, first, last)
  369. test_insert<T, N>(s, ss);
  370. test_insert<T, N>(s, v);
  371. test_insert<T, N>(s, l);
  372. #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
  373. stable_vector<T> bsv(ss.begin(), ss.end());
  374. vector<T> bv(ss.begin(), ss.end());
  375. test_insert<T, N>(s, bv);
  376. test_insert<T, N>(s, bsv);
  377. #endif
  378. }
  379. template <typename T>
  380. void test_capacity_0_nd()
  381. {
  382. varray<T, 10> v(5u, T(0));
  383. //varray<T, 0, bad_alloc_strategy<T> > s;
  384. varray<T, 0> s;
  385. BOOST_CHECK(s.size() == 0);
  386. BOOST_CHECK(s.capacity() == 0);
  387. #ifndef BOOST_NO_EXCEPTIONS
  388. BOOST_CHECK_THROW(s.at(0), std::out_of_range);
  389. //BOOST_CHECK_THROW(s.resize(5u, T(0)), std::bad_alloc);
  390. //BOOST_CHECK_THROW(s.push_back(T(0)), std::bad_alloc);
  391. //BOOST_CHECK_THROW(s.insert(s.end(), T(0)), std::bad_alloc);
  392. //BOOST_CHECK_THROW(s.insert(s.end(), 5u, T(0)), std::bad_alloc);
  393. //BOOST_CHECK_THROW(s.insert(s.end(), v.begin(), v.end()), std::bad_alloc);
  394. //BOOST_CHECK_THROW(s.assign(v.begin(), v.end()), std::bad_alloc);
  395. //BOOST_CHECK_THROW(s.assign(5u, T(0)), std::bad_alloc);
  396. //try{
  397. // varray<T, 0, bad_alloc_strategy<T> > s2(v.begin(), v.end());
  398. // BOOST_CHECK(false);
  399. //}catch(std::bad_alloc &){}
  400. //try{
  401. // varray<T, 0, bad_alloc_strategy<T> > s1(5u, T(0));
  402. // BOOST_CHECK(false);
  403. //}catch(std::bad_alloc &){}
  404. #endif // BOOST_NO_EXCEPTIONS
  405. }
  406. template <typename T, size_t N>
  407. void test_exceptions_nd()
  408. {
  409. varray<T, N> v(N, T(0));
  410. //varray<T, N/2, bad_alloc_strategy<T> > s(N/2, T(0));
  411. varray<T, N/2> s(N/2, T(0));
  412. #ifndef BOOST_NO_EXCEPTIONS
  413. /*BOOST_CHECK_THROW(s.resize(N, T(0)), std::bad_alloc);
  414. BOOST_CHECK_THROW(s.push_back(T(0)), std::bad_alloc);
  415. BOOST_CHECK_THROW(s.insert(s.end(), T(0)), std::bad_alloc);
  416. BOOST_CHECK_THROW(s.insert(s.end(), N, T(0)), std::bad_alloc);
  417. BOOST_CHECK_THROW(s.insert(s.end(), v.begin(), v.end()), std::bad_alloc);
  418. BOOST_CHECK_THROW(s.assign(v.begin(), v.end()), std::bad_alloc);
  419. BOOST_CHECK_THROW(s.assign(N, T(0)), std::bad_alloc);
  420. try{
  421. container_detail::varray<T, N/2, bad_alloc_strategy<T> > s2(v.begin(), v.end());
  422. BOOST_CHECK(false);
  423. }catch(std::bad_alloc &){}
  424. try{
  425. container_detail::varray<T, N/2, bad_alloc_strategy<T> > s1(N, T(0));
  426. BOOST_CHECK(false);
  427. }catch(std::bad_alloc &){}*/
  428. #endif // BOOST_NO_EXCEPTIONS
  429. }
  430. template <typename T, size_t N>
  431. void test_swap_and_move_nd()
  432. {
  433. {
  434. varray<T, N> v1, v2, v3, v4;
  435. varray<T, N> s1, s2;
  436. //varray<T, N, bad_alloc_strategy<T> > s4;
  437. varray<T, N> s4;
  438. for (size_t i = 0 ; i < N ; ++i )
  439. {
  440. v1.push_back(T(i));
  441. v2.push_back(T(i));
  442. v3.push_back(T(i));
  443. v4.push_back(T(i));
  444. }
  445. for (size_t i = 0 ; i < N/2 ; ++i )
  446. {
  447. s1.push_back(T(100 + i));
  448. s2.push_back(T(100 + i));
  449. s4.push_back(T(100 + i));
  450. }
  451. s1.swap(v1);
  452. s2 = boost::move(v2);
  453. varray<T, N> s3(boost::move(v3));
  454. s4.swap(v4);
  455. BOOST_CHECK(v1.size() == N/2);
  456. BOOST_CHECK(s1.size() == N);
  457. BOOST_CHECK(v2.size() == N); // objects aren't destroyed
  458. BOOST_CHECK(s2.size() == N);
  459. BOOST_CHECK(v3.size() == N); // objects aren't destroyed
  460. BOOST_CHECK(s3.size() == N);
  461. BOOST_CHECK(v4.size() == N/2);
  462. BOOST_CHECK(s4.size() == N);
  463. for (size_t i = 0 ; i < N/2 ; ++i )
  464. {
  465. BOOST_CHECK(v1[i] == T(100 + i));
  466. BOOST_CHECK(v4[i] == T(100 + i));
  467. }
  468. for (size_t i = 0 ; i < N ; ++i )
  469. {
  470. BOOST_CHECK(s1[i] == T(i));
  471. BOOST_CHECK(s2[i] == T(i));
  472. BOOST_CHECK(s3[i] == T(i));
  473. BOOST_CHECK(s4[i] == T(i));
  474. }
  475. }
  476. {
  477. varray<T, N> v1, v2, v3;
  478. varray<T, N/2> s1, s2;
  479. for (size_t i = 0 ; i < N/2 ; ++i )
  480. {
  481. v1.push_back(T(i));
  482. v2.push_back(T(i));
  483. v3.push_back(T(i));
  484. }
  485. for (size_t i = 0 ; i < N/3 ; ++i )
  486. {
  487. s1.push_back(T(100 + i));
  488. s2.push_back(T(100 + i));
  489. }
  490. s1.swap(v1);
  491. s2 = boost::move(v2);
  492. varray<T, N/2> s3(boost::move(v3));
  493. BOOST_CHECK(v1.size() == N/3);
  494. BOOST_CHECK(s1.size() == N/2);
  495. BOOST_CHECK(v2.size() == N/2); // objects aren't destroyed
  496. BOOST_CHECK(s2.size() == N/2);
  497. BOOST_CHECK(v3.size() == N/2); // objects aren't destroyed
  498. BOOST_CHECK(s3.size() == N/2);
  499. for (size_t i = 0 ; i < N/3 ; ++i )
  500. BOOST_CHECK(v1[i] == T(100 + i));
  501. for (size_t i = 0 ; i < N/2 ; ++i )
  502. {
  503. BOOST_CHECK(s1[i] == T(i));
  504. BOOST_CHECK(s2[i] == T(i));
  505. BOOST_CHECK(s3[i] == T(i));
  506. }
  507. }
  508. {
  509. varray<T, N> v(N, T(0));
  510. //varray<T, N/2, bad_alloc_strategy<T> > s(N/2, T(1));
  511. varray<T, N/2> s(N/2, T(1));
  512. #ifndef BOOST_NO_EXCEPTIONS
  513. //BOOST_CHECK_THROW(s.swap(v), std::bad_alloc);
  514. //v.resize(N, T(0));
  515. //BOOST_CHECK_THROW(s = boost::move(v), std::bad_alloc);
  516. //v.resize(N, T(0));
  517. //try {
  518. // varray<T, N/2, bad_alloc_strategy<T> > s2(boost::move(v));
  519. // BOOST_CHECK(false);
  520. //} catch (std::bad_alloc &) {}
  521. #endif // BOOST_NO_EXCEPTIONS
  522. }
  523. }
  524. template <typename T, size_t N>
  525. void test_emplace_0p()
  526. {
  527. //emplace_back()
  528. {
  529. //varray<T, N, bad_alloc_strategy<T> > v;
  530. varray<T, N> v;
  531. for (int i = 0 ; i < int(N) ; ++i )
  532. v.emplace_back();
  533. BOOST_CHECK(v.size() == N);
  534. #ifndef BOOST_NO_EXCEPTIONS
  535. //BOOST_CHECK_THROW(v.emplace_back(), std::bad_alloc);
  536. #endif
  537. }
  538. }
  539. template <typename T, size_t N>
  540. void test_emplace_2p()
  541. {
  542. //emplace_back(pos, int, int)
  543. {
  544. //varray<T, N, bad_alloc_strategy<T> > v;
  545. varray<T, N> v;
  546. for (int i = 0 ; i < int(N) ; ++i )
  547. v.emplace_back(i, 100 + i);
  548. BOOST_CHECK(v.size() == N);
  549. #ifndef BOOST_NO_EXCEPTIONS
  550. //BOOST_CHECK_THROW(v.emplace_back(N, 100 + N), std::bad_alloc);
  551. #endif
  552. BOOST_CHECK(v.size() == N);
  553. for (int i = 0 ; i < int(N) ; ++i )
  554. BOOST_CHECK(v[i] == T(i, 100 + i));
  555. }
  556. // emplace(pos, int, int)
  557. {
  558. //typedef typename varray<T, N, bad_alloc_strategy<T> >::iterator It;
  559. typedef typename varray<T, N>::iterator It;
  560. int h = N / 2;
  561. //varray<T, N, bad_alloc_strategy<T> > v;
  562. varray<T, N> v;
  563. for ( int i = 0 ; i < h ; ++i )
  564. v.emplace_back(i, 100 + i);
  565. for ( int i = 0 ; i <= h ; ++i )
  566. {
  567. //varray<T, N, bad_alloc_strategy<T> > vv(v);
  568. varray<T, N> vv(v);
  569. It it = vv.emplace(vv.begin() + i, i+100, i+200);
  570. BOOST_CHECK(vv.begin() + i == it);
  571. BOOST_CHECK(vv.size() == size_t(h+1));
  572. for ( int j = 0 ; j < i ; ++j )
  573. BOOST_CHECK(vv[j] == T(j, j+100));
  574. BOOST_CHECK(vv[i] == T(i+100, i+200));
  575. for ( int j = 0 ; j < h-i ; ++j )
  576. BOOST_CHECK(vv[j+i+1] == T(j+i, j+i+100));
  577. }
  578. }
  579. }
  580. template <typename T, size_t N>
  581. void test_sv_elem(T const& t)
  582. {
  583. //typedef varray<T, N, bad_alloc_strategy<T> > V;
  584. typedef varray<T, N> V;
  585. //varray<V, N, bad_alloc_strategy<V> > v;
  586. varray<V, N> v;
  587. v.push_back(V(N/2, t));
  588. V vvv(N/2, t);
  589. v.push_back(boost::move(vvv));
  590. v.insert(v.begin(), V(N/2, t));
  591. v.insert(v.end(), V(N/2, t));
  592. v.emplace_back(N/2, t);
  593. }
  594. int test_main(int, char* [])
  595. {
  596. BOOST_CHECK(counting_value::count() == 0);
  597. test_ctor_ndc<size_t, 10>();
  598. test_ctor_ndc<value_ndc, 10>();
  599. test_ctor_ndc<counting_value, 10>();
  600. BOOST_CHECK(counting_value::count() == 0);
  601. test_ctor_ndc<shptr_value, 10>();
  602. test_ctor_ndc<copy_movable, 10>();
  603. test_ctor_nc<size_t, 10>(5);
  604. test_ctor_nc<value_nc, 10>(5);
  605. test_ctor_nc<counting_value, 10>(5);
  606. BOOST_CHECK(counting_value::count() == 0);
  607. test_ctor_nc<shptr_value, 10>(5);
  608. test_ctor_nc<copy_movable, 10>(5);
  609. test_ctor_nd<size_t, 10>(5, 1);
  610. test_ctor_nd<value_nd, 10>(5, value_nd(1));
  611. test_ctor_nd<counting_value, 10>(5, counting_value(1));
  612. BOOST_CHECK(counting_value::count() == 0);
  613. test_ctor_nd<shptr_value, 10>(5, shptr_value(1));
  614. test_ctor_nd<copy_movable, 10>(5, produce());
  615. test_resize_nc<size_t, 10>(5);
  616. test_resize_nc<value_nc, 10>(5);
  617. test_resize_nc<counting_value, 10>(5);
  618. BOOST_CHECK(counting_value::count() == 0);
  619. test_resize_nc<shptr_value, 10>(5);
  620. test_resize_nc<copy_movable, 10>(5);
  621. test_resize_nd<size_t, 10>(5, 1);
  622. test_resize_nd<value_nd, 10>(5, value_nd(1));
  623. test_resize_nd<counting_value, 10>(5, counting_value(1));
  624. BOOST_CHECK(counting_value::count() == 0);
  625. test_resize_nd<shptr_value, 10>(5, shptr_value(1));
  626. test_resize_nd<copy_movable, 10>(5, produce());
  627. test_push_back_nd<size_t, 10>();
  628. test_push_back_nd<value_nd, 10>();
  629. test_push_back_nd<counting_value, 10>();
  630. BOOST_CHECK(counting_value::count() == 0);
  631. test_push_back_nd<shptr_value, 10>();
  632. test_push_back_nd<copy_movable, 10>();
  633. test_pop_back_nd<size_t, 10>();
  634. test_pop_back_nd<value_nd, 10>();
  635. test_pop_back_nd<counting_value, 10>();
  636. BOOST_CHECK(counting_value::count() == 0);
  637. test_pop_back_nd<shptr_value, 10>();
  638. test_pop_back_nd<copy_movable, 10>();
  639. test_copy_and_assign_nd<size_t, 10>(1);
  640. test_copy_and_assign_nd<value_nd, 10>(value_nd(1));
  641. test_copy_and_assign_nd<counting_value, 10>(counting_value(1));
  642. BOOST_CHECK(counting_value::count() == 0);
  643. test_copy_and_assign_nd<shptr_value, 10>(shptr_value(1));
  644. test_copy_and_assign_nd<copy_movable, 10>(produce());
  645. test_iterators_nd<size_t, 10>();
  646. test_iterators_nd<value_nd, 10>();
  647. test_iterators_nd<counting_value, 10>();
  648. BOOST_CHECK(counting_value::count() == 0);
  649. test_iterators_nd<shptr_value, 10>();
  650. test_iterators_nd<copy_movable, 10>();
  651. test_erase_nd<size_t, 10>();
  652. test_erase_nd<value_nd, 10>();
  653. test_erase_nd<counting_value, 10>();
  654. BOOST_CHECK(counting_value::count() == 0);
  655. test_erase_nd<shptr_value, 10>();
  656. test_erase_nd<copy_movable, 10>();
  657. test_insert_nd<size_t, 10>(50);
  658. test_insert_nd<value_nd, 10>(value_nd(50));
  659. test_insert_nd<counting_value, 10>(counting_value(50));
  660. BOOST_CHECK(counting_value::count() == 0);
  661. test_insert_nd<shptr_value, 10>(shptr_value(50));
  662. test_insert_nd<copy_movable, 10>(produce());
  663. test_capacity_0_nd<size_t>();
  664. test_capacity_0_nd<value_nd>();
  665. test_capacity_0_nd<counting_value>();
  666. BOOST_CHECK(counting_value::count() == 0);
  667. test_capacity_0_nd<shptr_value>();
  668. test_capacity_0_nd<copy_movable>();
  669. test_exceptions_nd<size_t, 10>();
  670. test_exceptions_nd<value_nd, 10>();
  671. test_exceptions_nd<counting_value, 10>();
  672. BOOST_CHECK(counting_value::count() == 0);
  673. test_exceptions_nd<shptr_value, 10>();
  674. test_exceptions_nd<copy_movable, 10>();
  675. test_swap_and_move_nd<size_t, 10>();
  676. test_swap_and_move_nd<value_nd, 10>();
  677. test_swap_and_move_nd<counting_value, 10>();
  678. BOOST_CHECK(counting_value::count() == 0);
  679. test_swap_and_move_nd<shptr_value, 10>();
  680. test_swap_and_move_nd<copy_movable, 10>();
  681. test_emplace_0p<counting_value, 10>();
  682. BOOST_CHECK(counting_value::count() == 0);
  683. test_emplace_2p<counting_value, 10>();
  684. BOOST_CHECK(counting_value::count() == 0);
  685. test_sv_elem<size_t, 10>(50);
  686. test_sv_elem<value_nd, 10>(value_nd(50));
  687. test_sv_elem<counting_value, 10>(counting_value(50));
  688. BOOST_CHECK(counting_value::count() == 0);
  689. test_sv_elem<shptr_value, 10>(shptr_value(50));
  690. test_sv_elem<copy_movable, 10>(copy_movable(50));
  691. return 0;
  692. }