dyn_bitset_unit_tests2.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. // -----------------------------------------------------------
  2. // Copyright (c) 2001 Jeremy Siek
  3. // Copyright (c) 2003-2006 Gennaro Prota
  4. // Copyright (c) 2014 Ahmed Charles
  5. // Copyright (c) 2018 Evgeny Shulgin
  6. //
  7. // Distributed under the Boost Software License, Version 1.0.
  8. // (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. //
  11. // -----------------------------------------------------------
  12. #include "bitset_test.hpp"
  13. #include <boost/dynamic_bitset/dynamic_bitset.hpp>
  14. #include <boost/config.hpp>
  15. template <typename Block>
  16. void run_test_cases( BOOST_EXPLICIT_TEMPLATE_TYPE(Block) )
  17. {
  18. typedef boost::dynamic_bitset<Block> bitset_type;
  19. typedef bitset_test< bitset_type > Tests;
  20. const int bits_per_block = bitset_type::bits_per_block;
  21. std::string long_string = get_long_string();
  22. //=====================================================================
  23. // Test operator&=
  24. {
  25. boost::dynamic_bitset<Block> lhs, rhs;
  26. Tests::and_assignment(lhs, rhs);
  27. }
  28. {
  29. boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
  30. Tests::and_assignment(lhs, rhs);
  31. }
  32. {
  33. boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
  34. Tests::and_assignment(lhs, rhs);
  35. }
  36. {
  37. boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
  38. Tests::and_assignment(lhs, rhs);
  39. }
  40. //=====================================================================
  41. // Test operator |=
  42. {
  43. boost::dynamic_bitset<Block> lhs, rhs;
  44. Tests::or_assignment(lhs, rhs);
  45. }
  46. {
  47. boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
  48. Tests::or_assignment(lhs, rhs);
  49. }
  50. {
  51. boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
  52. Tests::or_assignment(lhs, rhs);
  53. }
  54. {
  55. boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
  56. Tests::or_assignment(lhs, rhs);
  57. }
  58. //=====================================================================
  59. // Test operator^=
  60. {
  61. boost::dynamic_bitset<Block> lhs, rhs;
  62. Tests::xor_assignment(lhs, rhs);
  63. }
  64. {
  65. boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
  66. Tests::xor_assignment(lhs, rhs);
  67. }
  68. {
  69. boost::dynamic_bitset<Block> lhs(std::string("0")), rhs(std::string("1"));
  70. Tests::xor_assignment(lhs, rhs);
  71. }
  72. {
  73. boost::dynamic_bitset<Block> lhs(long_string), rhs(long_string);
  74. Tests::xor_assignment(lhs, rhs);
  75. }
  76. //=====================================================================
  77. // Test operator-=
  78. {
  79. boost::dynamic_bitset<Block> lhs, rhs;
  80. Tests::sub_assignment(lhs, rhs);
  81. }
  82. {
  83. boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
  84. Tests::sub_assignment(lhs, rhs);
  85. }
  86. {
  87. boost::dynamic_bitset<Block> lhs(std::string("0")), rhs(std::string("1"));
  88. Tests::sub_assignment(lhs, rhs);
  89. }
  90. {
  91. boost::dynamic_bitset<Block> lhs(long_string), rhs(long_string);
  92. Tests::sub_assignment(lhs, rhs);
  93. }
  94. //=====================================================================
  95. // Test operator<<=
  96. { // case pos == 0
  97. std::size_t pos = 0;
  98. {
  99. boost::dynamic_bitset<Block> b;
  100. Tests::shift_left_assignment(b, pos);
  101. }
  102. {
  103. boost::dynamic_bitset<Block> b(std::string("1010"));
  104. Tests::shift_left_assignment(b, pos);
  105. }
  106. {
  107. boost::dynamic_bitset<Block> b(long_string);
  108. Tests::shift_left_assignment(b, pos);
  109. }
  110. }
  111. {
  112. // test with both multiple and
  113. // non multiple of bits_per_block
  114. const int how_many = 10;
  115. for (int i = 1; i <= how_many; ++i) {
  116. std::size_t multiple = i * bits_per_block;
  117. std::size_t non_multiple = multiple - 1;
  118. boost::dynamic_bitset<Block> b(long_string);
  119. Tests::shift_left_assignment(b, multiple);
  120. Tests::shift_left_assignment(b, non_multiple);
  121. }
  122. }
  123. { // case pos == size()/2
  124. std::size_t pos = long_string.size() / 2;
  125. boost::dynamic_bitset<Block> b(long_string);
  126. Tests::shift_left_assignment(b, pos);
  127. }
  128. { // case pos >= n
  129. std::size_t pos = long_string.size();
  130. boost::dynamic_bitset<Block> b(long_string);
  131. Tests::shift_left_assignment(b, pos);
  132. }
  133. //=====================================================================
  134. // Test operator>>=
  135. { // case pos == 0
  136. std::size_t pos = 0;
  137. {
  138. boost::dynamic_bitset<Block> b;
  139. Tests::shift_right_assignment(b, pos);
  140. }
  141. {
  142. boost::dynamic_bitset<Block> b(std::string("1010"));
  143. Tests::shift_right_assignment(b, pos);
  144. }
  145. {
  146. boost::dynamic_bitset<Block> b(long_string);
  147. Tests::shift_right_assignment(b, pos);
  148. }
  149. }
  150. {
  151. // test with both multiple and
  152. // non multiple of bits_per_block
  153. const int how_many = 10;
  154. for (int i = 1; i <= how_many; ++i) {
  155. std::size_t multiple = i * bits_per_block;
  156. std::size_t non_multiple = multiple - 1;
  157. boost::dynamic_bitset<Block> b(long_string);
  158. Tests::shift_right_assignment(b, multiple);
  159. Tests::shift_right_assignment(b, non_multiple);
  160. }
  161. }
  162. { // case pos == size()/2
  163. std::size_t pos = long_string.size() / 2;
  164. boost::dynamic_bitset<Block> b(long_string);
  165. Tests::shift_right_assignment(b, pos);
  166. }
  167. { // case pos >= n
  168. std::size_t pos = long_string.size();
  169. boost::dynamic_bitset<Block> b(long_string);
  170. Tests::shift_right_assignment(b, pos);
  171. }
  172. //=====================================================================
  173. // test b.set()
  174. {
  175. boost::dynamic_bitset<Block> b;
  176. Tests::set_all(b);
  177. }
  178. {
  179. boost::dynamic_bitset<Block> b(std::string("0"));
  180. Tests::set_all(b);
  181. }
  182. {
  183. boost::dynamic_bitset<Block> b(long_string);
  184. Tests::set_all(b);
  185. }
  186. //=====================================================================
  187. // Test b.set(pos)
  188. { // case pos >= b.size()
  189. boost::dynamic_bitset<Block> b;
  190. Tests::set_one(b, 0, true);
  191. Tests::set_one(b, 0, false);
  192. }
  193. { // case pos < b.size()
  194. boost::dynamic_bitset<Block> b(std::string("0"));
  195. Tests::set_one(b, 0, true);
  196. Tests::set_one(b, 0, false);
  197. }
  198. { // case pos == b.size() / 2
  199. boost::dynamic_bitset<Block> b(long_string);
  200. Tests::set_one(b, long_string.size()/2, true);
  201. Tests::set_one(b, long_string.size()/2, false);
  202. }
  203. //=====================================================================
  204. // Test b.set(pos, len)
  205. { // case size is 1
  206. boost::dynamic_bitset<Block> b(std::string("0"));
  207. Tests::set_segment(b, 0, 1, true);
  208. Tests::set_segment(b, 0, 1, false);
  209. }
  210. { // case fill the whole set
  211. boost::dynamic_bitset<Block> b(long_string);
  212. Tests::set_segment(b, 0, b.size(), true);
  213. Tests::set_segment(b, 0, b.size(), false);
  214. }
  215. { // case pos = size / 4, len = size / 2
  216. boost::dynamic_bitset<Block> b(long_string);
  217. Tests::set_segment(b, b.size() / 4, b.size() / 2, true);
  218. Tests::set_segment(b, b.size() / 4, b.size() / 2, false);
  219. }
  220. { // case pos = block_size / 2, len = size - block_size
  221. boost::dynamic_bitset<Block> b(long_string);
  222. Tests::set_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
  223. b.size() - boost::dynamic_bitset<Block>::bits_per_block, true);
  224. Tests::set_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
  225. b.size() - boost::dynamic_bitset<Block>::bits_per_block, false);
  226. }
  227. { // case pos = 1, len = size - 2
  228. boost::dynamic_bitset<Block> b(long_string);
  229. Tests::set_segment(b, 1, b.size() - 2, true);
  230. Tests::set_segment(b, 1, b.size() - 2, false);
  231. }
  232. { // case pos = 3, len = 7
  233. boost::dynamic_bitset<Block> b(long_string);
  234. Tests::set_segment(b, 3, 7, true);
  235. Tests::set_segment(b, 3, 7, false);
  236. }
  237. //=====================================================================
  238. // Test b.reset()
  239. {
  240. boost::dynamic_bitset<Block> b;
  241. Tests::reset_all(b);
  242. }
  243. {
  244. boost::dynamic_bitset<Block> b(std::string("0"));
  245. Tests::reset_all(b);
  246. }
  247. {
  248. boost::dynamic_bitset<Block> b(long_string);
  249. Tests::reset_all(b);
  250. }
  251. //=====================================================================
  252. // Test b.reset(pos)
  253. { // case pos >= b.size()
  254. boost::dynamic_bitset<Block> b;
  255. Tests::reset_one(b, 0);
  256. }
  257. { // case pos < b.size()
  258. boost::dynamic_bitset<Block> b(std::string("0"));
  259. Tests::reset_one(b, 0);
  260. }
  261. { // case pos == b.size() / 2
  262. boost::dynamic_bitset<Block> b(long_string);
  263. Tests::reset_one(b, long_string.size()/2);
  264. }
  265. //=====================================================================
  266. // Test b.reset(pos, len)
  267. { // case size is 1
  268. boost::dynamic_bitset<Block> b(std::string("0"));
  269. Tests::reset_segment(b, 0, 1);
  270. }
  271. { // case fill the whole set
  272. boost::dynamic_bitset<Block> b(long_string);
  273. Tests::reset_segment(b, 0, b.size());
  274. }
  275. { // case pos = size / 4, len = size / 2
  276. boost::dynamic_bitset<Block> b(long_string);
  277. Tests::reset_segment(b, b.size() / 4, b.size() / 2);
  278. }
  279. { // case pos = block_size / 2, len = size - block_size
  280. boost::dynamic_bitset<Block> b(long_string);
  281. Tests::reset_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
  282. b.size() - boost::dynamic_bitset<Block>::bits_per_block);
  283. }
  284. { // case pos = 1, len = size - 2
  285. boost::dynamic_bitset<Block> b(long_string);
  286. Tests::reset_segment(b, 1, b.size() - 2);
  287. }
  288. { // case pos = 3, len = 7
  289. boost::dynamic_bitset<Block> b(long_string);
  290. Tests::reset_segment(b, 3, 7);
  291. }
  292. //=====================================================================
  293. // Test ~b
  294. {
  295. boost::dynamic_bitset<Block> b;
  296. Tests::operator_flip(b);
  297. }
  298. {
  299. boost::dynamic_bitset<Block> b(std::string("1"));
  300. Tests::operator_flip(b);
  301. }
  302. {
  303. boost::dynamic_bitset<Block> b(long_string);
  304. Tests::operator_flip(b);
  305. }
  306. //=====================================================================
  307. // Test b.flip()
  308. {
  309. boost::dynamic_bitset<Block> b;
  310. Tests::flip_all(b);
  311. }
  312. {
  313. boost::dynamic_bitset<Block> b(std::string("1"));
  314. Tests::flip_all(b);
  315. }
  316. {
  317. boost::dynamic_bitset<Block> b(long_string);
  318. Tests::flip_all(b);
  319. }
  320. //=====================================================================
  321. // Test b.flip(pos)
  322. { // case pos >= b.size()
  323. boost::dynamic_bitset<Block> b;
  324. Tests::flip_one(b, 0);
  325. }
  326. { // case pos < b.size()
  327. boost::dynamic_bitset<Block> b(std::string("0"));
  328. Tests::flip_one(b, 0);
  329. }
  330. { // case pos == b.size() / 2
  331. boost::dynamic_bitset<Block> b(long_string);
  332. Tests::flip_one(b, long_string.size()/2);
  333. }
  334. //=====================================================================
  335. // Test b.flip(pos, len)
  336. { // case size is 1
  337. boost::dynamic_bitset<Block> b(std::string("0"));
  338. Tests::flip_segment(b, 0, 1);
  339. }
  340. { // case fill the whole set
  341. boost::dynamic_bitset<Block> b(long_string);
  342. Tests::flip_segment(b, 0, b.size());
  343. }
  344. { // case pos = size / 4, len = size / 2
  345. boost::dynamic_bitset<Block> b(long_string);
  346. Tests::flip_segment(b, b.size() / 4, b.size() / 2);
  347. }
  348. { // case pos = block_size / 2, len = size - block_size
  349. boost::dynamic_bitset<Block> b(long_string);
  350. Tests::flip_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
  351. b.size() - boost::dynamic_bitset<Block>::bits_per_block);
  352. }
  353. { // case pos = 1, len = size - 2
  354. boost::dynamic_bitset<Block> b(long_string);
  355. Tests::flip_segment(b, 1, b.size() - 2);
  356. }
  357. { // case pos = 3, len = 7
  358. boost::dynamic_bitset<Block> b(long_string);
  359. Tests::flip_segment(b, 3, 7);
  360. }
  361. }
  362. int
  363. main()
  364. {
  365. run_test_cases<unsigned char>();
  366. run_test_cases<unsigned short>();
  367. run_test_cases<unsigned int>();
  368. run_test_cases<unsigned long>();
  369. # ifdef BOOST_HAS_LONG_LONG
  370. run_test_cases< ::boost::ulong_long_type>();
  371. # endif
  372. return boost::report_errors();
  373. }