algo_test.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2007-2017.
  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://www.boost.org/libs/move for documentation.
  9. //
  10. //////////////////////////////////////////////////////////////////////////////
  11. #include <boost/move/algo/detail/set_difference.hpp>
  12. #include "order_type.hpp"
  13. #include <boost/core/lightweight_test.hpp>
  14. #include <cstddef>
  15. /*
  16. ///////////////////////////////////
  17. //
  18. // set_difference
  19. //
  20. ///////////////////////////////////
  21. void test_set_difference_normal()
  22. {
  23. order_perf_type range2[10];
  24. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  25. range2[i].key = i*2;
  26. range2[i].val = 0u;
  27. }
  28. order_perf_type range1[4];
  29. range1[0].key = 0u;
  30. range1[0].val = 1u;
  31. range1[1].key = 1u;
  32. range1[1].val = 1u;
  33. range1[2].key = 3u;
  34. range1[2].val = 1u;
  35. range1[3].key = 4u;
  36. range1[3].val = 1u;
  37. order_perf_type out[20];
  38. out[2].key = 998;
  39. out[2].val = 999;
  40. boost::movelib::set_difference(range1, range1+4, range2, range2+10, out, order_type_less());
  41. BOOST_TEST(out[0].key == 1u);
  42. BOOST_TEST(out[0].val == 1u);
  43. BOOST_TEST(out[1].key == 3u);
  44. BOOST_TEST(out[1].val == 1u);
  45. BOOST_TEST(out[2].key == 998);
  46. BOOST_TEST(out[2].val == 999);
  47. }
  48. void test_set_difference_range1_repeated()
  49. {
  50. order_perf_type range2[10];
  51. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  52. range2[i].key = i*2;
  53. range2[i].val = 0u;
  54. }
  55. order_perf_type range1[4];
  56. range1[0].key = 0u;
  57. range1[0].val = 1u;
  58. range1[1].key = 2u;
  59. range1[1].val = 1u;
  60. range1[2].key = 4u;
  61. range1[2].val = 1u;
  62. range1[3].key = 6u;
  63. range1[3].val = 1u;
  64. order_perf_type out[20];
  65. out[0].key = 998;
  66. out[0].val = 999;
  67. boost::movelib::set_difference(range1, range1+4, range2, range2+10, out, order_type_less());
  68. BOOST_TEST(out[0].key == 998);
  69. BOOST_TEST(out[0].val == 999);
  70. }
  71. void test_set_difference_range1_unique()
  72. {
  73. order_perf_type range2[10];
  74. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  75. range2[i].key = i*2;
  76. range2[i].val = 0u;
  77. }
  78. order_perf_type range1[4];
  79. range1[0].key = 1u;
  80. range1[0].val = 1u;
  81. range1[1].key = 3u;
  82. range1[1].val = 1u;
  83. range1[2].key = 5u;
  84. range1[2].val = 1u;
  85. range1[3].key = 7u;
  86. range1[3].val = 1u;
  87. order_perf_type out[20];
  88. out[4].key = 998;
  89. out[4].val = 999;
  90. boost::movelib::set_difference(range1, range1+4, range2, range2+10, out, order_type_less());
  91. BOOST_TEST(out[0].key == 1u);
  92. BOOST_TEST(out[0].val == 1u);
  93. BOOST_TEST(out[1].key == 3u);
  94. BOOST_TEST(out[1].val == 1u);
  95. BOOST_TEST(out[2].key == 5u);
  96. BOOST_TEST(out[3].val == 1u);
  97. BOOST_TEST(out[3].key == 7u);
  98. BOOST_TEST(out[3].val == 1u);
  99. BOOST_TEST(out[4].key == 998);
  100. BOOST_TEST(out[4].val == 999);
  101. }
  102. */
  103. ///////////////////////////////////
  104. //
  105. // set_difference
  106. //
  107. ///////////////////////////////////
  108. void test_set_difference_normal()
  109. {
  110. order_perf_type range2[10];
  111. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  112. range2[i].key = i*2;
  113. range2[i].val = 0u;
  114. }
  115. order_perf_type range1[5];
  116. range1[0].key = 0u;
  117. range1[0].val = 1u;
  118. range1[1].key = 1u;
  119. range1[1].val = 1u;
  120. range1[2].key = 1u;
  121. range1[2].val = 2u;
  122. range1[3].key = 3u;
  123. range1[3].val = 1u;
  124. range1[4].key = 4u;
  125. range1[4].val = 1u;
  126. order_perf_type out[20];
  127. out[3].key = 998;
  128. out[3].val = 999;
  129. order_perf_type *r =
  130. boost::movelib::set_difference(range1, range1+5, range2, range2+10, out, order_type_less());
  131. BOOST_TEST(&out[3] == r);
  132. BOOST_TEST(out[0].key == 1u);
  133. BOOST_TEST(out[0].val == 1u);
  134. BOOST_TEST(out[1].key == 1u);
  135. BOOST_TEST(out[1].val == 2u);
  136. BOOST_TEST(out[2].key == 3u);
  137. BOOST_TEST(out[2].val == 1u);
  138. BOOST_TEST(out[3].key == 998);
  139. BOOST_TEST(out[3].val == 999);
  140. }
  141. void test_set_difference_range1_repeated()
  142. {
  143. order_perf_type range2[10];
  144. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  145. range2[i].key = i*2;
  146. range2[i].val = 0u;
  147. }
  148. order_perf_type range1[5];
  149. range1[0].key = 0u;
  150. range1[0].val = 1u;
  151. range1[1].key = 2u;
  152. range1[1].val = 1u;
  153. range1[2].key = 2u;
  154. range1[2].val = 2u;
  155. range1[3].key = 4u;
  156. range1[3].val = 1u;
  157. range1[4].key = 6u;
  158. range1[4].val = 1u;
  159. order_perf_type out[20];
  160. out[0].key = 998;
  161. out[0].val = 999;
  162. order_perf_type *r =
  163. boost::movelib::set_difference(range1, range1+5, range2, range2+10, out, order_type_less());
  164. BOOST_TEST(&out[1] == r);
  165. BOOST_TEST(out[0].key == 2);
  166. BOOST_TEST(out[0].val == 2);
  167. }
  168. void test_set_difference_range1_unique()
  169. {
  170. order_perf_type range2[10];
  171. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  172. range2[i].key = i*2;
  173. range2[i].val = 0u;
  174. }
  175. order_perf_type range1[5];
  176. range1[0].key = 1u;
  177. range1[0].val = 1u;
  178. range1[1].key = 3u;
  179. range1[1].val = 1u;
  180. range1[2].key = 5u;
  181. range1[2].val = 1u;
  182. range1[3].key = 7u;
  183. range1[3].val = 1u;
  184. range1[4].key = 7u;
  185. range1[4].val = 2u;
  186. order_perf_type out[20];
  187. out[5].key = 998;
  188. out[5].val = 999;
  189. order_perf_type *r =
  190. boost::movelib::set_difference(range1, range1+5, range2, range2+10, out, order_type_less());
  191. BOOST_TEST(&out[5] == r);
  192. BOOST_TEST(out[0].key == 1u);
  193. BOOST_TEST(out[0].val == 1u);
  194. BOOST_TEST(out[1].key == 3u);
  195. BOOST_TEST(out[1].val == 1u);
  196. BOOST_TEST(out[2].key == 5u);
  197. BOOST_TEST(out[2].val == 1u);
  198. BOOST_TEST(out[3].key == 7u);
  199. BOOST_TEST(out[3].val == 1u);
  200. BOOST_TEST(out[4].key == 7u);
  201. BOOST_TEST(out[4].val == 2u);
  202. BOOST_TEST(out[5].key == 998);
  203. BOOST_TEST(out[5].val == 999);
  204. }
  205. /*
  206. ///////////////////////////////////
  207. //
  208. // inplace_set_difference
  209. //
  210. ///////////////////////////////////
  211. void test_inplace_set_difference_normal()
  212. {
  213. order_move_type range2[10];
  214. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  215. range2[i].key = i*2;
  216. range2[i].val = 0u;
  217. }
  218. order_move_type range1[4];
  219. range1[0].key = 0u;
  220. range1[0].val = 1u;
  221. range1[1].key = 1u;
  222. range1[1].val = 1u;
  223. range1[2].key = 3u;
  224. range1[2].val = 1u;
  225. range1[3].key = 4u;
  226. range1[3].val = 1u;
  227. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+4, range2, range2+10, order_type_less());
  228. BOOST_TEST(ret == range1+2);
  229. BOOST_TEST(range1[0].key == 1u);
  230. BOOST_TEST(range1[0].val == 1u);
  231. BOOST_TEST(range1[1].key == 3u);
  232. BOOST_TEST(range1[1].val == 1u);
  233. BOOST_TEST(range1[2].key == order_move_type::moved_assign_mark);
  234. BOOST_TEST(range1[2].val == order_move_type::moved_assign_mark);
  235. }
  236. void test_inplace_set_difference_range1_repeated()
  237. {
  238. order_move_type range2[10];
  239. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  240. range2[i].key = i*2;
  241. range2[i].val = 0u;
  242. }
  243. order_move_type range1[5];
  244. range1[0].key = 0u;
  245. range1[0].val = 1u;
  246. range1[1].key = 2u;
  247. range1[1].val = 1u;
  248. range1[2].key = 4u;
  249. range1[2].val = 1u;
  250. range1[3].key = 6u;
  251. range1[3].val = 1u;
  252. range1[4].key = order_move_type::moved_assign_mark;
  253. range1[4].val = order_move_type::moved_assign_mark;
  254. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+4, range2, range2+10, order_type_less());
  255. BOOST_TEST(ret == range1+0);
  256. BOOST_TEST(range1[0].key == 0u);
  257. BOOST_TEST(range1[0].val == 1u);
  258. BOOST_TEST(range1[1].key == 2u);
  259. BOOST_TEST(range1[1].val == 1u);
  260. BOOST_TEST(range1[2].key == 4u);
  261. BOOST_TEST(range1[3].val == 1u);
  262. BOOST_TEST(range1[3].key == 6u);
  263. BOOST_TEST(range1[3].val == 1u);
  264. BOOST_TEST(range1[4].key == order_move_type::moved_assign_mark);
  265. BOOST_TEST(range1[4].val == order_move_type::moved_assign_mark);
  266. }
  267. void test_inplace_set_difference_range1_unique()
  268. {
  269. order_move_type range2[10];
  270. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  271. range2[i].key = i*2;
  272. range2[i].val = 0u;
  273. }
  274. order_move_type range1[5];
  275. range1[0].key = 1u;
  276. range1[0].val = 1u;
  277. range1[1].key = 3u;
  278. range1[1].val = 1u;
  279. range1[2].key = 5u;
  280. range1[2].val = 1u;
  281. range1[3].key = 7u;
  282. range1[3].val = 1u;
  283. range1[4].key = order_move_type::moved_assign_mark;
  284. range1[4].val = order_move_type::moved_assign_mark;
  285. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+4, range2, range2+10, order_type_less());
  286. BOOST_TEST(ret == range1+4);
  287. BOOST_TEST(range1[0].key == 1u);
  288. BOOST_TEST(range1[0].val == 1u);
  289. BOOST_TEST(range1[1].key == 3u);
  290. BOOST_TEST(range1[1].val == 1u);
  291. BOOST_TEST(range1[2].key == 5u);
  292. BOOST_TEST(range1[3].val == 1u);
  293. BOOST_TEST(range1[3].key == 7u);
  294. BOOST_TEST(range1[3].val == 1u);
  295. BOOST_TEST(range1[4].key == order_move_type::moved_assign_mark);
  296. BOOST_TEST(range1[4].val == order_move_type::moved_assign_mark);
  297. }
  298. void test_inplace_set_difference_range1_unique_long()
  299. {
  300. order_move_type range2[10];
  301. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  302. range2[i].key = i*2;
  303. range2[i].val = 0u;
  304. }
  305. order_move_type range1[11];
  306. for(std::size_t i = 0; i != sizeof(range1)/sizeof(*range1); ++i){
  307. range1[i].key = i*2+1;
  308. range1[i].val = 1u;
  309. }
  310. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+11, range2, range2+10, order_type_less());
  311. BOOST_TEST(ret == range1+11);
  312. for(std::size_t i = 0; i != sizeof(range1)/sizeof(*range1); ++i){
  313. BOOST_TEST(range1[i].key == i*2+1);
  314. BOOST_TEST(range1[i].val == 1u);
  315. }
  316. }
  317. void test_inplace_set_difference_range1_same_start()
  318. {
  319. order_move_type range2[10];
  320. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  321. range2[i].key = i*2;
  322. range2[i].val = 0u;
  323. }
  324. order_move_type range1[5];
  325. range1[0].key = 0u;
  326. range1[0].val = 1u;
  327. range1[1].key = 2u;
  328. range1[1].val = 1u;
  329. range1[2].key = 4u;
  330. range1[2].val = 1u;
  331. range1[3].key = 5u;
  332. range1[3].val = 1u;
  333. range1[4].key = 7u;
  334. range1[4].val = 1u;
  335. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+5, range2, range2+10, order_type_less());
  336. BOOST_TEST(ret == range1+2);
  337. BOOST_TEST(range1[0].key == 5u);
  338. BOOST_TEST(range1[0].val == 1u);
  339. BOOST_TEST(range1[1].key == 7u);
  340. BOOST_TEST(range1[1].val == 1u);
  341. }
  342. void test_inplace_set_difference_range1_same_end()
  343. {
  344. order_move_type range2[10];
  345. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  346. range2[i].key = i*2;
  347. range2[i].val = 0u;
  348. }
  349. order_move_type range1[5];
  350. range1[0].key = 1u;
  351. range1[0].val = 1u;
  352. range1[1].key = 3u;
  353. range1[1].val = 1u;
  354. range1[2].key = 4u;
  355. range1[2].val = 1u;
  356. range1[3].key = 6u;
  357. range1[3].val = 1u;
  358. range1[4].key = 8u;
  359. range1[4].val = 1u;
  360. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+5, range2, range2+10, order_type_less());
  361. BOOST_TEST(ret == range1+2);
  362. BOOST_TEST(range1[0].key == 1u);
  363. BOOST_TEST(range1[0].val == 1u);
  364. BOOST_TEST(range1[1].key == 3u);
  365. BOOST_TEST(range1[1].val == 1u);
  366. BOOST_TEST(range1[2].key == 4u);
  367. BOOST_TEST(range1[2].val == 1u);
  368. BOOST_TEST(range1[3].key == 6u);
  369. BOOST_TEST(range1[3].val == 1u);
  370. }
  371. */
  372. ///////////////////////////////////
  373. //
  374. // inplace_set_difference
  375. //
  376. ///////////////////////////////////
  377. void test_inplace_set_difference_normal()
  378. {
  379. order_move_type range2[10];
  380. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  381. range2[i].key = i*2;
  382. range2[i].val = 0u;
  383. }
  384. order_move_type range1[4];
  385. range1[0].key = 0u;
  386. range1[0].val = 1u;
  387. range1[1].key = 1u;
  388. range1[1].val = 1u;
  389. range1[2].key = 3u;
  390. range1[2].val = 1u;
  391. range1[3].key = 4u;
  392. range1[3].val = 1u;
  393. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+4, range2, range2+10, order_type_less());
  394. BOOST_TEST(ret == range1+2);
  395. BOOST_TEST(range1[0].key == 1u);
  396. BOOST_TEST(range1[0].val == 1u);
  397. BOOST_TEST(range1[1].key == 3u);
  398. BOOST_TEST(range1[1].val == 1u);
  399. BOOST_TEST(range1[2].key == order_move_type::moved_assign_mark);
  400. BOOST_TEST(range1[2].val == order_move_type::moved_assign_mark);
  401. }
  402. void test_inplace_set_difference_range1_repeated()
  403. {
  404. order_move_type range2[10];
  405. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  406. range2[i].key = i*2;
  407. range2[i].val = 0u;
  408. }
  409. order_move_type range1[5];
  410. range1[0].key = 0u;
  411. range1[0].val = 1u;
  412. range1[1].key = 2u;
  413. range1[1].val = 1u;
  414. range1[2].key = 4u;
  415. range1[2].val = 1u;
  416. range1[3].key = 6u;
  417. range1[3].val = 1u;
  418. range1[4].key = order_move_type::moved_assign_mark;
  419. range1[4].val = order_move_type::moved_assign_mark;
  420. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+4, range2, range2+10, order_type_less());
  421. BOOST_TEST(ret == range1+0);
  422. BOOST_TEST(range1[0].key == 0u);
  423. BOOST_TEST(range1[0].val == 1u);
  424. BOOST_TEST(range1[1].key == 2u);
  425. BOOST_TEST(range1[1].val == 1u);
  426. BOOST_TEST(range1[2].key == 4u);
  427. BOOST_TEST(range1[3].val == 1u);
  428. BOOST_TEST(range1[3].key == 6u);
  429. BOOST_TEST(range1[3].val == 1u);
  430. BOOST_TEST(range1[4].key == order_move_type::moved_assign_mark);
  431. BOOST_TEST(range1[4].val == order_move_type::moved_assign_mark);
  432. }
  433. void test_inplace_set_difference_range1_unique()
  434. {
  435. order_move_type range2[10];
  436. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  437. range2[i].key = i*2;
  438. range2[i].val = 0u;
  439. }
  440. order_move_type range1[5];
  441. range1[0].key = 1u;
  442. range1[0].val = 1u;
  443. range1[1].key = 3u;
  444. range1[1].val = 1u;
  445. range1[2].key = 5u;
  446. range1[2].val = 1u;
  447. range1[3].key = 7u;
  448. range1[3].val = 1u;
  449. range1[4].key = order_move_type::moved_assign_mark;
  450. range1[4].val = order_move_type::moved_assign_mark;
  451. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+4, range2, range2+10, order_type_less());
  452. BOOST_TEST(ret == range1+4);
  453. BOOST_TEST(range1[0].key == 1u);
  454. BOOST_TEST(range1[0].val == 1u);
  455. BOOST_TEST(range1[1].key == 3u);
  456. BOOST_TEST(range1[1].val == 1u);
  457. BOOST_TEST(range1[2].key == 5u);
  458. BOOST_TEST(range1[3].val == 1u);
  459. BOOST_TEST(range1[3].key == 7u);
  460. BOOST_TEST(range1[3].val == 1u);
  461. BOOST_TEST(range1[4].key == order_move_type::moved_assign_mark);
  462. BOOST_TEST(range1[4].val == order_move_type::moved_assign_mark);
  463. }
  464. void test_inplace_set_difference_range1_unique_long()
  465. {
  466. order_move_type range2[10];
  467. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  468. range2[i].key = i*2;
  469. range2[i].val = 0u;
  470. }
  471. order_move_type range1[11];
  472. for(std::size_t i = 0; i != sizeof(range1)/sizeof(*range1); ++i){
  473. range1[i].key = i*2+1;
  474. range1[i].val = 1u;
  475. }
  476. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+11, range2, range2+10, order_type_less());
  477. BOOST_TEST(ret == range1+11);
  478. for(std::size_t i = 0; i != sizeof(range1)/sizeof(*range1); ++i){
  479. BOOST_TEST(range1[i].key == i*2+1);
  480. BOOST_TEST(range1[i].val == 1u);
  481. }
  482. }
  483. void test_inplace_set_difference_range1_same_start()
  484. {
  485. order_move_type range2[10];
  486. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  487. range2[i].key = i*2;
  488. range2[i].val = 0u;
  489. }
  490. order_move_type range1[5];
  491. range1[0].key = 0u;
  492. range1[0].val = 1u;
  493. range1[1].key = 2u;
  494. range1[1].val = 1u;
  495. range1[2].key = 4u;
  496. range1[2].val = 1u;
  497. range1[3].key = 5u;
  498. range1[3].val = 1u;
  499. range1[4].key = 7u;
  500. range1[4].val = 1u;
  501. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+5, range2, range2+10, order_type_less());
  502. BOOST_TEST(ret == range1+2);
  503. BOOST_TEST(range1[0].key == 5u);
  504. BOOST_TEST(range1[0].val == 1u);
  505. BOOST_TEST(range1[1].key == 7u);
  506. BOOST_TEST(range1[1].val == 1u);
  507. }
  508. void test_inplace_set_difference_range1_same_end()
  509. {
  510. order_move_type range2[10];
  511. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  512. range2[i].key = i*2;
  513. range2[i].val = 0u;
  514. }
  515. order_move_type range1[5];
  516. range1[0].key = 1u;
  517. range1[0].val = 1u;
  518. range1[1].key = 3u;
  519. range1[1].val = 1u;
  520. range1[2].key = 4u;
  521. range1[2].val = 1u;
  522. range1[3].key = 6u;
  523. range1[3].val = 1u;
  524. range1[4].key = 8u;
  525. range1[4].val = 1u;
  526. order_move_type *ret = boost::movelib::inplace_set_difference(range1, range1+5, range2, range2+10, order_type_less());
  527. BOOST_TEST(ret == range1+2);
  528. BOOST_TEST(range1[0].key == 1u);
  529. BOOST_TEST(range1[0].val == 1u);
  530. BOOST_TEST(range1[1].key == 3u);
  531. BOOST_TEST(range1[1].val == 1u);
  532. BOOST_TEST(range1[2].key == 4u);
  533. BOOST_TEST(range1[2].val == 1u);
  534. BOOST_TEST(range1[3].key == 6u);
  535. BOOST_TEST(range1[3].val == 1u);
  536. }
  537. ///////////////////////////////////
  538. //
  539. // set_unique_difference
  540. //
  541. ///////////////////////////////////
  542. void test_set_unique_difference_normal()
  543. {
  544. order_perf_type range2[10];
  545. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  546. range2[i].key = i*2;
  547. range2[i].val = 0u;
  548. }
  549. order_perf_type range1[10];
  550. range1[0].key = 0u;
  551. range1[0].val = 1u;
  552. range1[1].key = 1u;
  553. range1[1].val = 1u;
  554. range1[2].key = 1u;
  555. range1[2].val = 2u;
  556. range1[3].key = 3u;
  557. range1[3].val = 1u;
  558. range1[4].key = 4u;
  559. range1[4].val = 1u;
  560. range1[5].key = 4u;
  561. range1[5].val = 2u;
  562. range1[6].key = 21u;
  563. range1[6].val = 1u;
  564. range1[7].key = 21u;
  565. range1[7].val = 2u;
  566. range1[8].key = 23u;
  567. range1[8].val = 1u;
  568. range1[9].key = 23u;
  569. range1[9].val = 2u;
  570. order_perf_type out[20];
  571. out[4].key = 998;
  572. out[4].val = 999;
  573. order_perf_type * r =
  574. boost::movelib::set_unique_difference(range1, range1+10, range2, range2+10, out, order_type_less());
  575. BOOST_TEST(&out[4] == r);
  576. BOOST_TEST(out[0].key == 1u);
  577. BOOST_TEST(out[0].val == 1u);
  578. BOOST_TEST(out[1].key == 3u);
  579. BOOST_TEST(out[1].val == 1u);
  580. BOOST_TEST(out[2].key == 21u);
  581. BOOST_TEST(out[2].val == 1u);
  582. BOOST_TEST(out[3].key == 23u);
  583. BOOST_TEST(out[3].val == 1u);
  584. BOOST_TEST(out[4].key == 998);
  585. BOOST_TEST(out[4].val == 999);
  586. }
  587. void test_set_unique_difference_range1_repeated()
  588. {
  589. order_perf_type range2[10];
  590. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  591. range2[i].key = i*2;
  592. range2[i].val = 0u;
  593. }
  594. order_perf_type range1[11];
  595. range1[0].key = 0u;
  596. range1[0].val = 1u;
  597. range1[1].key = 0u;
  598. range1[1].val = 2u;
  599. range1[2].key = 0u;
  600. range1[2].val = 2u;
  601. range1[3].key = 2u;
  602. range1[3].val = 1u;
  603. range1[4].key = 2u;
  604. range1[4].val = 2u;
  605. range1[5].key = 4u;
  606. range1[5].val = 1u;
  607. range1[6].key = 6u;
  608. range1[6].val = 1u;
  609. range1[7].key = 6u;
  610. range1[7].val = 2u;
  611. range1[8].key = 6u;
  612. range1[8].val = 3u;
  613. range1[9].key = 6u;
  614. range1[9].val = 4u;
  615. range1[10].key = 6u;
  616. range1[10].val = 5u;
  617. order_perf_type out[20];
  618. out[0].key = 998;
  619. out[0].val = 999;
  620. order_perf_type * r =
  621. boost::movelib::set_unique_difference(range1, range1+11, range2, range2+10, out, order_type_less());
  622. BOOST_TEST(&out[0] == r);
  623. BOOST_TEST(out[0].key == 998);
  624. BOOST_TEST(out[0].val == 999);
  625. }
  626. void test_set_unique_difference_range1_unique()
  627. {
  628. order_perf_type range2[10];
  629. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  630. range2[i].key = i*2;
  631. range2[i].val = 0u;
  632. }
  633. order_perf_type range1[7];
  634. range1[0].key = 1u;
  635. range1[0].val = 1u;
  636. range1[1].key = 3u;
  637. range1[1].val = 1u;
  638. range1[2].key = 3u;
  639. range1[2].val = 2u;
  640. range1[3].key = 5u;
  641. range1[3].val = 1u;
  642. range1[4].key = 7u;
  643. range1[4].val = 1u;
  644. range1[5].key = 7u;
  645. range1[5].val = 2u;
  646. range1[6].key = 7u;
  647. range1[6].val = 3u;
  648. order_perf_type out[20];
  649. out[4].key = 998;
  650. out[4].val = 999;
  651. order_perf_type * r =
  652. boost::movelib::set_unique_difference(range1, range1+7, range2, range2+10, out, order_type_less());
  653. BOOST_TEST(&out[4] == r);
  654. BOOST_TEST(out[0].key == 1u);
  655. BOOST_TEST(out[0].val == 1u);
  656. BOOST_TEST(out[1].key == 3u);
  657. BOOST_TEST(out[1].val == 1u);
  658. BOOST_TEST(out[2].key == 5u);
  659. BOOST_TEST(out[2].val == 1u);
  660. BOOST_TEST(out[3].key == 7u);
  661. BOOST_TEST(out[3].val == 1u);
  662. BOOST_TEST(out[4].key == 998);
  663. BOOST_TEST(out[4].val == 999);
  664. }
  665. ///////////////////////////////////
  666. //
  667. // inplace_set_unique_difference
  668. //
  669. ///////////////////////////////////
  670. void test_inplace_set_unique_difference_normal()
  671. {
  672. order_move_type range2[10];
  673. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  674. range2[i].key = i*2;
  675. range2[i].val = 0u;
  676. }
  677. order_move_type range1[4];
  678. range1[0].key = 0u;
  679. range1[0].val = 1u;
  680. range1[1].key = 1u;
  681. range1[1].val = 1u;
  682. range1[2].key = 3u;
  683. range1[2].val = 1u;
  684. range1[3].key = 4u;
  685. range1[3].val = 1u;
  686. order_move_type *ret = boost::movelib::inplace_set_unique_difference(range1, range1+4, range2, range2+10, order_type_less());
  687. BOOST_TEST(ret == range1+2);
  688. BOOST_TEST(range1[0].key == 1u);
  689. BOOST_TEST(range1[0].val == 1u);
  690. BOOST_TEST(range1[1].key == 3u);
  691. BOOST_TEST(range1[1].val == 1u);
  692. BOOST_TEST(range1[2].key == order_move_type::moved_assign_mark);
  693. BOOST_TEST(range1[2].val == order_move_type::moved_assign_mark);
  694. }
  695. void test_inplace_set_unique_difference_range1_repeated()
  696. {
  697. order_move_type range2[10];
  698. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  699. range2[i].key = i*2;
  700. range2[i].val = 0u;
  701. }
  702. order_move_type range1[5];
  703. range1[0].key = 0u;
  704. range1[0].val = 1u;
  705. range1[1].key = 2u;
  706. range1[1].val = 1u;
  707. range1[2].key = 4u;
  708. range1[2].val = 1u;
  709. range1[3].key = 6u;
  710. range1[3].val = 1u;
  711. range1[4].key = order_move_type::moved_assign_mark;
  712. range1[4].val = order_move_type::moved_assign_mark;
  713. order_move_type *ret = boost::movelib::inplace_set_unique_difference(range1, range1+4, range2, range2+10, order_type_less());
  714. BOOST_TEST(ret == range1+0);
  715. BOOST_TEST(range1[0].key == 0u);
  716. BOOST_TEST(range1[0].val == 1u);
  717. BOOST_TEST(range1[1].key == 2u);
  718. BOOST_TEST(range1[1].val == 1u);
  719. BOOST_TEST(range1[2].key == 4u);
  720. BOOST_TEST(range1[3].val == 1u);
  721. BOOST_TEST(range1[3].key == 6u);
  722. BOOST_TEST(range1[3].val == 1u);
  723. BOOST_TEST(range1[4].key == order_move_type::moved_assign_mark);
  724. BOOST_TEST(range1[4].val == order_move_type::moved_assign_mark);
  725. }
  726. void test_inplace_set_unique_difference_range1_unique()
  727. {
  728. order_move_type range2[10];
  729. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  730. range2[i].key = i*2;
  731. range2[i].val = 0u;
  732. }
  733. order_move_type range1[9];
  734. range1[0].key = 1u;
  735. range1[0].val = 1u;
  736. range1[1].key = 1u;
  737. range1[1].val = 2u;
  738. range1[2].key = 3u;
  739. range1[2].val = 1u;
  740. range1[3].key = 3u;
  741. range1[3].val = 2u;
  742. range1[4].key = 5u;
  743. range1[4].val = 1u;
  744. range1[5].key = 7u;
  745. range1[5].val = 1u;
  746. range1[6].key = 7u;
  747. range1[6].val = 2u;
  748. range1[7].key = 7u;
  749. range1[7].val = 3u;
  750. range1[8].val = 3u;
  751. range1[8].key = order_move_type::moved_assign_mark;
  752. range1[8].val = order_move_type::moved_assign_mark;
  753. order_move_type *ret =
  754. boost::movelib::inplace_set_unique_difference(range1, range1+8, range2, range2+10, order_type_less());
  755. BOOST_TEST(ret == range1+4);
  756. BOOST_TEST(range1[0].key == 1u);
  757. BOOST_TEST(range1[0].val == 1u);
  758. BOOST_TEST(range1[1].key == 3u);
  759. BOOST_TEST(range1[1].val == 1u);
  760. BOOST_TEST(range1[2].key == 5u);
  761. BOOST_TEST(range1[3].val == 1u);
  762. BOOST_TEST(range1[3].key == 7u);
  763. BOOST_TEST(range1[3].val == 1u);
  764. }
  765. void test_inplace_set_unique_difference_range1_unique_long()
  766. {
  767. order_move_type range2[10];
  768. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  769. range2[i].key = i*2;
  770. range2[i].val = 0u;
  771. }
  772. order_move_type range1[22];
  773. for(std::size_t i = 0; i != sizeof(range1)/sizeof(*range1); ++i){
  774. range1[i].key = (i/2)*2+1;
  775. range1[i].val = i%2;
  776. }
  777. order_move_type *ret =
  778. boost::movelib::inplace_set_unique_difference(range1, range1+22, range2, range2+10, order_type_less());
  779. BOOST_TEST(ret == range1+11);
  780. for(std::size_t i = 0; i != 11; ++i){
  781. BOOST_TEST(range1[i].key == i*2+1);
  782. BOOST_TEST(range1[i].val == 0u);
  783. }
  784. }
  785. void test_inplace_set_unique_difference_range1_same_start()
  786. {
  787. order_move_type range2[10];
  788. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  789. range2[i].key = i*2;
  790. range2[i].val = 0u;
  791. }
  792. order_move_type range1[6];
  793. range1[0].key = 0u;
  794. range1[0].val = 1u;
  795. range1[1].key = 2u;
  796. range1[1].val = 1u;
  797. range1[2].key = 4u;
  798. range1[2].val = 1u;
  799. range1[3].key = 4u;
  800. range1[3].val = 2u;
  801. range1[4].key = 5u;
  802. range1[4].val = 1u;
  803. range1[5].key = 7u;
  804. range1[5].val = 1u;
  805. order_move_type *ret =
  806. boost::movelib::inplace_set_unique_difference(range1, range1+6, range2, range2+10, order_type_less());
  807. BOOST_TEST(ret == range1+2);
  808. BOOST_TEST(range1[0].key == 5u);
  809. BOOST_TEST(range1[0].val == 1u);
  810. BOOST_TEST(range1[1].key == 7u);
  811. BOOST_TEST(range1[1].val == 1u);
  812. }
  813. void test_inplace_set_unique_difference_range1_same_end()
  814. {
  815. order_move_type range2[10];
  816. for(std::size_t i = 0; i != sizeof(range2)/sizeof(*range2); ++i){
  817. range2[i].key = i*2;
  818. range2[i].val = 0u;
  819. }
  820. order_move_type range1[8];
  821. range1[0].key = 1u;
  822. range1[0].val = 1u;
  823. range1[1].key = 3u;
  824. range1[1].val = 1u;
  825. range1[2].key = 4u;
  826. range1[2].val = 1u;
  827. range1[3].key = 4u;
  828. range1[3].val = 2u;
  829. range1[4].key = 6u;
  830. range1[4].val = 1u;
  831. range1[5].key = 8u;
  832. range1[5].val = 1u;
  833. range1[6].key = 8u;
  834. range1[6].val = 2u;
  835. range1[7].key = 8u;
  836. range1[7].val = 3u;
  837. order_move_type *ret =
  838. boost::movelib::inplace_set_unique_difference(range1, range1+8, range2, range2+10, order_type_less());
  839. BOOST_TEST(ret == range1+2);
  840. BOOST_TEST(range1[0].key == 1u);
  841. BOOST_TEST(range1[0].val == 1u);
  842. BOOST_TEST(range1[1].key == 3u);
  843. BOOST_TEST(range1[1].val == 1u);
  844. }
  845. int main()
  846. {
  847. //set_difference
  848. test_set_difference_normal();
  849. test_set_difference_range1_repeated();
  850. test_set_difference_range1_unique();
  851. //inplace_set_difference
  852. test_inplace_set_difference_normal();
  853. test_inplace_set_difference_range1_repeated();
  854. test_inplace_set_difference_range1_unique();
  855. test_inplace_set_difference_range1_unique_long();
  856. test_inplace_set_difference_range1_same_start();
  857. test_inplace_set_difference_range1_same_end();
  858. //set_unique_difference
  859. test_set_unique_difference_normal();
  860. test_set_unique_difference_range1_repeated();
  861. test_set_unique_difference_range1_unique();
  862. //inplace_set_unique_difference
  863. test_inplace_set_unique_difference_normal();
  864. test_inplace_set_unique_difference_range1_repeated();
  865. test_inplace_set_unique_difference_range1_unique();
  866. test_inplace_set_unique_difference_range1_unique_long();
  867. test_inplace_set_unique_difference_range1_same_start();
  868. test_inplace_set_unique_difference_range1_same_end();
  869. return boost::report_errors();
  870. }