1 // -----------------------------------------------------------
2 // Copyright (c) 2001 Jeremy Siek
3 // Copyright (c) 2003-2006 Gennaro Prota
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // -----------------------------------------------------------
12 #include "bitset_test.hpp"
13 #include "boost/dynamic_bitset/dynamic_bitset.hpp"
14 #include "boost/limits.hpp"
15 #include "boost/config.hpp"
18 template <typename Block>
19 void run_test_cases( BOOST_EXPLICIT_TEMPLATE_TYPE(Block) )
21 // a bunch of typedefs which will be handy later on
22 typedef boost::dynamic_bitset<Block> bitset_type;
23 typedef bitset_test<bitset_type> Tests;
24 // typedef typename bitset_type::size_type size_type; // unusable with Borland 5.5.1
26 std::string long_string = get_long_string();
27 std::size_t ul_width = std::numeric_limits<unsigned long>::digits;
29 //=====================================================================
36 bitset_type b(1, 1ul);
40 bitset_type b(bitset_type::bits_per_block
41 + bitset_type::bits_per_block/2, 15ul);
44 //=====================================================================
47 boost::dynamic_bitset<Block> b;
51 boost::dynamic_bitset<Block> b(std::string("1"));
55 boost::dynamic_bitset<Block> b(bitset_type::bits_per_block,
56 static_cast<unsigned long>(-1));
60 std::string str(ul_width - 1, '1');
61 boost::dynamic_bitset<Block> b(str);
65 std::string ul_str(ul_width, '1');
66 boost::dynamic_bitset<Block> b(ul_str);
70 boost::dynamic_bitset<Block> b(long_string);
73 //=====================================================================
74 // Test to_string(b, str)
76 boost::dynamic_bitset<Block> b;
80 boost::dynamic_bitset<Block> b(std::string("0"));
84 boost::dynamic_bitset<Block> b(long_string);
87 //=====================================================================
90 boost::dynamic_bitset<Block> b;
94 boost::dynamic_bitset<Block> b(std::string("0"));
98 boost::dynamic_bitset<Block> b(std::string("1"));
102 boost::dynamic_bitset<Block> b(8, 255ul);
106 boost::dynamic_bitset<Block> b(long_string);
109 //=====================================================================
112 boost::dynamic_bitset<Block> b;
116 boost::dynamic_bitset<Block> b(std::string("0"));
120 boost::dynamic_bitset<Block> b(long_string);
123 //=====================================================================
126 boost::dynamic_bitset<Block> b;
130 boost::dynamic_bitset<Block> b(std::string("0"));
134 boost::dynamic_bitset<Block> b(long_string);
137 //=====================================================================
140 boost::dynamic_bitset<Block> b;
144 boost::dynamic_bitset<Block> b(std::string("0"));
148 boost::dynamic_bitset<Block> b(long_string);
151 //=====================================================================
152 // Test a.is_subset_of(b)
154 boost::dynamic_bitset<Block> a, b;
158 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
162 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
166 boost::dynamic_bitset<Block> a(long_string), b(long_string);
170 boost::dynamic_bitset<Block> a(long_string), b(long_string);
171 a[long_string.size()/2].flip();
175 boost::dynamic_bitset<Block> a(long_string), b(long_string);
176 b[long_string.size()/2].flip();
179 //=====================================================================
180 // Test a.is_proper_subset_of(b)
182 boost::dynamic_bitset<Block> a, b;
183 Tests::proper_subset(a, b);
186 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
187 Tests::proper_subset(a, b);
190 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
191 Tests::proper_subset(a, b);
194 boost::dynamic_bitset<Block> a(long_string), b(long_string);
195 Tests::proper_subset(a, b);
198 boost::dynamic_bitset<Block> a(long_string), b(long_string);
199 a[long_string.size()/2].flip();
200 Tests::proper_subset(a, b);
203 boost::dynamic_bitset<Block> a(long_string), b(long_string);
204 b[long_string.size()/2].flip();
205 Tests::proper_subset(a, b);
207 //=====================================================================
210 bitset_type a; // empty
212 Tests::intersects(a, b);
216 bitset_type b(5, 8ul);
217 Tests::intersects(a, b);
220 bitset_type a(8, 0ul);
221 bitset_type b(15, 0ul);
223 Tests::intersects(a, b);
226 bitset_type a(15, 0ul);
227 bitset_type b(22, 0ul);
229 Tests::intersects(a, b);
231 //=====================================================================
236 Tests::find_first(b);
240 bitset_type b(1, 1ul);
241 Tests::find_first(b);
245 bitset_type b(4 * bitset_type::bits_per_block, 0ul);
246 Tests::find_first(b);
250 bitset_type b(1, 1ul);
251 Tests::find_first(b);
255 bitset_type b(4 * bitset_type::bits_per_block - 1, 0ul);
257 Tests::find_first(b);
259 //=====================================================================
266 Tests::find_next(b, 0);
267 Tests::find_next(b, 1);
268 Tests::find_next(b, 200);
269 Tests::find_next(b, b.npos);
272 // bitset of size 1 (find_next can never find)
273 bitset_type b(1, 1ul);
276 Tests::find_next(b, 0);
277 Tests::find_next(b, 1);
278 Tests::find_next(b, 200);
279 Tests::find_next(b, b.npos);
283 bitset_type b(16 * bitset_type::bits_per_block);
287 const typename bitset_type::size_type larger_than_size = 5 + b.size();
288 for(typename bitset_type::size_type i = 0; i <= larger_than_size; ++i) {
289 Tests::find_next(b, i);
291 Tests::find_next(b, b.npos);
294 // a bitset with 1s at block boundary only
295 const int num_blocks = 32;
296 const int block_width = bitset_type::bits_per_block;
298 bitset_type b(num_blocks * block_width);
299 typename bitset_type::size_type i = block_width - 1;
300 for ( ; i < b.size(); i += block_width) {
303 typename bitset_type::size_type first_in_block = i - (block_width - 1);
304 b.set(first_in_block);
308 const typename bitset_type::size_type larger_than_size = 5 + b.size();
309 for (i = 0; i <= larger_than_size; ++i) {
310 Tests::find_next(b, i);
312 Tests::find_next(b, b.npos);
316 // bitset with alternate 1s and 0s
317 const typename bitset_type::size_type sz = 1000;
320 typename bitset_type::size_type i = 0;
321 for ( ; i < sz; ++i) {
326 const typename bitset_type::size_type larger_than_size = 5 + b.size();
327 for (i = 0; i <= larger_than_size; ++i) {
328 Tests::find_next(b, i);
330 Tests::find_next(b, b.npos);
333 //=====================================================================
336 boost::dynamic_bitset<Block> a, b;
337 Tests::operator_equal(a, b);
340 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
341 Tests::operator_equal(a, b);
344 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
345 Tests::operator_equal(a, b);
348 boost::dynamic_bitset<Block> a(long_string), b(long_string);
349 Tests::operator_equal(a, b);
352 boost::dynamic_bitset<Block> a(long_string), b(long_string);
353 a[long_string.size()/2].flip();
354 Tests::operator_equal(a, b);
357 boost::dynamic_bitset<Block> a(long_string), b(long_string);
358 b[long_string.size()/2].flip();
359 Tests::operator_equal(a, b);
361 //=====================================================================
364 boost::dynamic_bitset<Block> a, b;
365 Tests::operator_not_equal(a, b);
368 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
369 Tests::operator_not_equal(a, b);
372 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
373 Tests::operator_not_equal(a, b);
376 boost::dynamic_bitset<Block> a(long_string), b(long_string);
377 Tests::operator_not_equal(a, b);
380 boost::dynamic_bitset<Block> a(long_string), b(long_string);
381 a[long_string.size()/2].flip();
382 Tests::operator_not_equal(a, b);
385 boost::dynamic_bitset<Block> a(long_string), b(long_string);
386 b[long_string.size()/2].flip();
387 Tests::operator_not_equal(a, b);
389 //=====================================================================
392 boost::dynamic_bitset<Block> a, b;
393 Tests::operator_less_than(a, b);
396 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
397 Tests::operator_less_than(a, b);
400 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
401 Tests::operator_less_than(a, b);
404 boost::dynamic_bitset<Block> a(std::string("10")), b(std::string("11"));
405 Tests::operator_less_than(a, b);
408 boost::dynamic_bitset<Block> a(long_string), b(long_string);
409 Tests::operator_less_than(a, b);
412 boost::dynamic_bitset<Block> a(long_string), b(long_string);
413 a[long_string.size()/2].flip();
414 Tests::operator_less_than(a, b);
417 boost::dynamic_bitset<Block> a(long_string), b(long_string);
418 b[long_string.size()/2].flip();
419 Tests::operator_less_than(a, b);
421 // check for consistency with ulong behaviour
423 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
427 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
431 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
434 //=====================================================================
437 boost::dynamic_bitset<Block> a, b;
438 Tests::operator_less_than_eq(a, b);
441 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
442 Tests::operator_less_than_eq(a, b);
445 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
446 Tests::operator_less_than_eq(a, b);
449 boost::dynamic_bitset<Block> a(long_string), b(long_string);
450 Tests::operator_less_than_eq(a, b);
453 boost::dynamic_bitset<Block> a(long_string), b(long_string);
454 a[long_string.size()/2].flip();
455 Tests::operator_less_than_eq(a, b);
458 boost::dynamic_bitset<Block> a(long_string), b(long_string);
459 b[long_string.size()/2].flip();
460 Tests::operator_less_than_eq(a, b);
462 // check for consistency with ulong behaviour
464 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
468 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
472 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
475 //=====================================================================
478 boost::dynamic_bitset<Block> a, b;
479 Tests::operator_greater_than(a, b);
482 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
483 Tests::operator_greater_than(a, b);
486 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
487 Tests::operator_greater_than(a, b);
490 boost::dynamic_bitset<Block> a(long_string), b(long_string);
491 Tests::operator_greater_than(a, b);
494 boost::dynamic_bitset<Block> a(long_string), b(long_string);
495 a[long_string.size()/2].flip();
496 Tests::operator_greater_than(a, b);
499 boost::dynamic_bitset<Block> a(long_string), b(long_string);
500 b[long_string.size()/2].flip();
501 Tests::operator_greater_than(a, b);
503 // check for consistency with ulong behaviour
505 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
509 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
513 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
516 //=====================================================================
519 boost::dynamic_bitset<Block> a, b;
520 Tests::operator_greater_than_eq(a, b);
523 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
524 Tests::operator_greater_than_eq(a, b);
527 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
528 Tests::operator_greater_than_eq(a, b);
531 boost::dynamic_bitset<Block> a(long_string), b(long_string);
532 Tests::operator_greater_than_eq(a, b);
535 boost::dynamic_bitset<Block> a(long_string), b(long_string);
536 a[long_string.size()/2].flip();
537 Tests::operator_greater_than_eq(a, b);
540 boost::dynamic_bitset<Block> a(long_string), b(long_string);
541 b[long_string.size()/2].flip();
542 Tests::operator_greater_than_eq(a, b);
544 // check for consistency with ulong behaviour
546 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
550 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
554 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
557 //=====================================================================
559 { // case pos >= b.size()
560 boost::dynamic_bitset<Block> b;
561 Tests::test_bit(b, 0);
563 { // case pos < b.size()
564 boost::dynamic_bitset<Block> b(std::string("0"));
565 Tests::test_bit(b, 0);
567 { // case pos == b.size() / 2
568 boost::dynamic_bitset<Block> b(long_string);
569 Tests::test_bit(b, long_string.size()/2);
571 //=====================================================================
575 boost::dynamic_bitset<Block> b(std::string("1010"));
576 Tests::operator_shift_left(b, pos);
578 { // case pos == size()/2
579 std::size_t pos = long_string.size() / 2;
580 boost::dynamic_bitset<Block> b(long_string);
581 Tests::operator_shift_left(b, pos);
584 std::size_t pos = long_string.size();
585 boost::dynamic_bitset<Block> b(long_string);
586 Tests::operator_shift_left(b, pos);
588 //=====================================================================
592 boost::dynamic_bitset<Block> b(std::string("1010"));
593 Tests::operator_shift_right(b, pos);
595 { // case pos == size()/2
596 std::size_t pos = long_string.size() / 2;
597 boost::dynamic_bitset<Block> b(long_string);
598 Tests::operator_shift_right(b, pos);
601 std::size_t pos = long_string.size();
602 boost::dynamic_bitset<Block> b(long_string);
603 Tests::operator_shift_right(b, pos);
605 //=====================================================================
608 boost::dynamic_bitset<Block> lhs, rhs;
609 Tests::operator_and(lhs, rhs);
612 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
613 Tests::operator_and(lhs, rhs);
616 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
617 Tests::operator_and(lhs, rhs);
620 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
621 Tests::operator_and(lhs, rhs);
623 //=====================================================================
626 boost::dynamic_bitset<Block> lhs, rhs;
627 Tests::operator_or(lhs, rhs);
630 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
631 Tests::operator_or(lhs, rhs);
634 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
635 Tests::operator_or(lhs, rhs);
638 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
639 Tests::operator_or(lhs, rhs);
641 //=====================================================================
644 boost::dynamic_bitset<Block> lhs, rhs;
645 Tests::operator_xor(lhs, rhs);
648 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
649 Tests::operator_xor(lhs, rhs);
652 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
653 Tests::operator_xor(lhs, rhs);
656 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
657 Tests::operator_xor(lhs, rhs);
659 //=====================================================================
662 boost::dynamic_bitset<Block> lhs, rhs;
663 Tests::operator_sub(lhs, rhs);
666 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
667 Tests::operator_sub(lhs, rhs);
670 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
671 Tests::operator_sub(lhs, rhs);
674 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
675 Tests::operator_sub(lhs, rhs);
680 test_main(int, char*[])
682 run_test_cases<unsigned char>();
683 run_test_cases<unsigned short>();
684 run_test_cases<unsigned int>();
685 run_test_cases<unsigned long>();
686 # ifdef BOOST_HAS_LONG_LONG
687 run_test_cases< ::boost::ulong_long_type>();