1 // -----------------------------------------------------------
2 // Copyright (c) 2001 Jeremy Siek
3 // Copyright (c) 2003-2006 Gennaro Prota
4 // Copyright (c) 2014 Ahmed Charles
6 // Distributed under the Boost Software License, Version 1.0.
7 // (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
10 // -----------------------------------------------------------
13 #include "bitset_test.hpp"
14 #include "boost/dynamic_bitset/dynamic_bitset.hpp"
15 #include "boost/limits.hpp"
16 #include "boost/config.hpp"
19 template <typename Block>
20 void run_test_cases( BOOST_EXPLICIT_TEMPLATE_TYPE(Block) )
22 // a bunch of typedefs which will be handy later on
23 typedef boost::dynamic_bitset<Block> bitset_type;
24 typedef bitset_test<bitset_type> Tests;
25 // typedef typename bitset_type::size_type size_type; // unusable with Borland 5.5.1
27 std::string long_string = get_long_string();
28 std::size_t ul_width = std::numeric_limits<unsigned long>::digits;
30 //=====================================================================
37 bitset_type b(1, 1ul);
41 bitset_type b(bitset_type::bits_per_block
42 + bitset_type::bits_per_block/2, 15ul);
45 //=====================================================================
48 boost::dynamic_bitset<Block> b;
52 boost::dynamic_bitset<Block> b(std::string("1"));
56 boost::dynamic_bitset<Block> b(bitset_type::bits_per_block,
57 static_cast<unsigned long>(-1));
61 std::string str(ul_width - 1, '1');
62 boost::dynamic_bitset<Block> b(str);
66 std::string ul_str(ul_width, '1');
67 boost::dynamic_bitset<Block> b(ul_str);
71 boost::dynamic_bitset<Block> b(long_string);
74 //=====================================================================
75 // Test to_string(b, str)
77 boost::dynamic_bitset<Block> b;
81 boost::dynamic_bitset<Block> b(std::string("0"));
85 boost::dynamic_bitset<Block> b(long_string);
88 //=====================================================================
91 boost::dynamic_bitset<Block> b;
95 boost::dynamic_bitset<Block> b(std::string("0"));
99 boost::dynamic_bitset<Block> b(std::string("1"));
103 boost::dynamic_bitset<Block> b(8, 255ul);
107 boost::dynamic_bitset<Block> b(long_string);
110 //=====================================================================
113 boost::dynamic_bitset<Block> b;
117 boost::dynamic_bitset<Block> b(std::string("0"));
121 boost::dynamic_bitset<Block> b(long_string);
124 //=====================================================================
127 boost::dynamic_bitset<Block> b;
131 Tests::all(b.reset());
134 boost::dynamic_bitset<Block> b(std::string("0"));
138 Tests::all(b.reset());
141 boost::dynamic_bitset<Block> b(long_string);
145 Tests::all(b.reset());
147 //=====================================================================
150 boost::dynamic_bitset<Block> b;
154 Tests::any(b.reset());
157 boost::dynamic_bitset<Block> b(std::string("0"));
161 Tests::any(b.reset());
164 boost::dynamic_bitset<Block> b(long_string);
168 Tests::any(b.reset());
170 //=====================================================================
173 boost::dynamic_bitset<Block> b;
176 Tests::none(b.set());
177 Tests::none(b.reset());
180 boost::dynamic_bitset<Block> b(std::string("0"));
183 Tests::none(b.set());
184 Tests::none(b.reset());
187 boost::dynamic_bitset<Block> b(long_string);
190 Tests::none(b.set());
191 Tests::none(b.reset());
193 //=====================================================================
194 // Test a.is_subset_of(b)
196 boost::dynamic_bitset<Block> a, b;
200 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
204 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
208 boost::dynamic_bitset<Block> a(long_string), b(long_string);
212 boost::dynamic_bitset<Block> a(long_string), b(long_string);
213 a[long_string.size()/2].flip();
217 boost::dynamic_bitset<Block> a(long_string), b(long_string);
218 b[long_string.size()/2].flip();
221 //=====================================================================
222 // Test a.is_proper_subset_of(b)
224 boost::dynamic_bitset<Block> a, b;
225 Tests::proper_subset(a, b);
228 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
229 Tests::proper_subset(a, b);
232 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
233 Tests::proper_subset(a, b);
236 boost::dynamic_bitset<Block> a(long_string), b(long_string);
237 Tests::proper_subset(a, b);
240 boost::dynamic_bitset<Block> a(long_string), b(long_string);
241 a[long_string.size()/2].flip();
242 Tests::proper_subset(a, b);
245 boost::dynamic_bitset<Block> a(long_string), b(long_string);
246 b[long_string.size()/2].flip();
247 Tests::proper_subset(a, b);
249 //=====================================================================
252 bitset_type a; // empty
254 Tests::intersects(a, b);
258 bitset_type b(5, 8ul);
259 Tests::intersects(a, b);
262 bitset_type a(8, 0ul);
263 bitset_type b(15, 0ul);
265 Tests::intersects(a, b);
268 bitset_type a(15, 0ul);
269 bitset_type b(22, 0ul);
271 Tests::intersects(a, b);
273 //=====================================================================
278 Tests::find_first(b);
282 bitset_type b(1, 1ul);
283 Tests::find_first(b);
287 bitset_type b(4 * bitset_type::bits_per_block, 0ul);
288 Tests::find_first(b);
292 bitset_type b(1, 1ul);
293 Tests::find_first(b);
297 bitset_type b(4 * bitset_type::bits_per_block - 1, 0ul);
299 Tests::find_first(b);
301 //=====================================================================
308 Tests::find_next(b, 0);
309 Tests::find_next(b, 1);
310 Tests::find_next(b, 200);
311 Tests::find_next(b, b.npos);
314 // bitset of size 1 (find_next can never find)
315 bitset_type b(1, 1ul);
318 Tests::find_next(b, 0);
319 Tests::find_next(b, 1);
320 Tests::find_next(b, 200);
321 Tests::find_next(b, b.npos);
325 bitset_type b(16 * bitset_type::bits_per_block);
329 const typename bitset_type::size_type larger_than_size = 5 + b.size();
330 for(typename bitset_type::size_type i = 0; i <= larger_than_size; ++i) {
331 Tests::find_next(b, i);
333 Tests::find_next(b, b.npos);
336 // a bitset with 1s at block boundary only
337 const int num_blocks = 32;
338 const int block_width = bitset_type::bits_per_block;
340 bitset_type b(num_blocks * block_width);
341 typename bitset_type::size_type i = block_width - 1;
342 for ( ; i < b.size(); i += block_width) {
345 typename bitset_type::size_type first_in_block = i - (block_width - 1);
346 b.set(first_in_block);
350 const typename bitset_type::size_type larger_than_size = 5 + b.size();
351 for (i = 0; i <= larger_than_size; ++i) {
352 Tests::find_next(b, i);
354 Tests::find_next(b, b.npos);
358 // bitset with alternate 1s and 0s
359 const typename bitset_type::size_type sz = 1000;
362 typename bitset_type::size_type i = 0;
363 for ( ; i < sz; ++i) {
368 const typename bitset_type::size_type larger_than_size = 5 + b.size();
369 for (i = 0; i <= larger_than_size; ++i) {
370 Tests::find_next(b, i);
372 Tests::find_next(b, b.npos);
375 //=====================================================================
378 boost::dynamic_bitset<Block> a, b;
379 Tests::operator_equal(a, b);
382 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
383 Tests::operator_equal(a, b);
386 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
387 Tests::operator_equal(a, b);
390 boost::dynamic_bitset<Block> a(long_string), b(long_string);
391 Tests::operator_equal(a, b);
394 boost::dynamic_bitset<Block> a(long_string), b(long_string);
395 a[long_string.size()/2].flip();
396 Tests::operator_equal(a, b);
399 boost::dynamic_bitset<Block> a(long_string), b(long_string);
400 b[long_string.size()/2].flip();
401 Tests::operator_equal(a, b);
403 //=====================================================================
406 boost::dynamic_bitset<Block> a, b;
407 Tests::operator_not_equal(a, b);
410 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
411 Tests::operator_not_equal(a, b);
414 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
415 Tests::operator_not_equal(a, b);
418 boost::dynamic_bitset<Block> a(long_string), b(long_string);
419 Tests::operator_not_equal(a, b);
422 boost::dynamic_bitset<Block> a(long_string), b(long_string);
423 a[long_string.size()/2].flip();
424 Tests::operator_not_equal(a, b);
427 boost::dynamic_bitset<Block> a(long_string), b(long_string);
428 b[long_string.size()/2].flip();
429 Tests::operator_not_equal(a, b);
431 //=====================================================================
434 boost::dynamic_bitset<Block> a, b;
435 Tests::operator_less_than(a, b);
438 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
439 Tests::operator_less_than(a, b);
442 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
443 Tests::operator_less_than(a, b);
446 boost::dynamic_bitset<Block> a(std::string("10")), b(std::string("11"));
447 Tests::operator_less_than(a, b);
450 boost::dynamic_bitset<Block> a(long_string), b(long_string);
451 Tests::operator_less_than(a, b);
454 boost::dynamic_bitset<Block> a(long_string), b(long_string);
455 a[long_string.size()/2].flip();
456 Tests::operator_less_than(a, b);
459 boost::dynamic_bitset<Block> a(long_string), b(long_string);
460 b[long_string.size()/2].flip();
461 Tests::operator_less_than(a, b);
463 // check for consistency with ulong behaviour
465 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
469 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
473 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
476 //=====================================================================
479 boost::dynamic_bitset<Block> a, b;
480 Tests::operator_less_than_eq(a, b);
483 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
484 Tests::operator_less_than_eq(a, b);
487 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
488 Tests::operator_less_than_eq(a, b);
491 boost::dynamic_bitset<Block> a(long_string), b(long_string);
492 Tests::operator_less_than_eq(a, b);
495 boost::dynamic_bitset<Block> a(long_string), b(long_string);
496 a[long_string.size()/2].flip();
497 Tests::operator_less_than_eq(a, b);
500 boost::dynamic_bitset<Block> a(long_string), b(long_string);
501 b[long_string.size()/2].flip();
502 Tests::operator_less_than_eq(a, b);
504 // check for consistency with ulong behaviour
506 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
510 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
514 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
517 //=====================================================================
520 boost::dynamic_bitset<Block> a, b;
521 Tests::operator_greater_than(a, b);
524 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
525 Tests::operator_greater_than(a, b);
528 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
529 Tests::operator_greater_than(a, b);
532 boost::dynamic_bitset<Block> a(long_string), b(long_string);
533 Tests::operator_greater_than(a, b);
536 boost::dynamic_bitset<Block> a(long_string), b(long_string);
537 a[long_string.size()/2].flip();
538 Tests::operator_greater_than(a, b);
541 boost::dynamic_bitset<Block> a(long_string), b(long_string);
542 b[long_string.size()/2].flip();
543 Tests::operator_greater_than(a, b);
545 // check for consistency with ulong behaviour
547 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
551 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
555 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
558 //=====================================================================
561 boost::dynamic_bitset<Block> a, b;
562 Tests::operator_greater_than_eq(a, b);
565 boost::dynamic_bitset<Block> a(std::string("0")), b(std::string("0"));
566 Tests::operator_greater_than_eq(a, b);
569 boost::dynamic_bitset<Block> a(std::string("1")), b(std::string("1"));
570 Tests::operator_greater_than_eq(a, b);
573 boost::dynamic_bitset<Block> a(long_string), b(long_string);
574 Tests::operator_greater_than_eq(a, b);
577 boost::dynamic_bitset<Block> a(long_string), b(long_string);
578 a[long_string.size()/2].flip();
579 Tests::operator_greater_than_eq(a, b);
582 boost::dynamic_bitset<Block> a(long_string), b(long_string);
583 b[long_string.size()/2].flip();
584 Tests::operator_greater_than_eq(a, b);
586 // check for consistency with ulong behaviour
588 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 5ul);
592 boost::dynamic_bitset<Block> a(3, 4ul), b(3, 4ul);
596 boost::dynamic_bitset<Block> a(3, 5ul), b(3, 4ul);
599 //=====================================================================
601 { // case pos >= b.size()
602 boost::dynamic_bitset<Block> b;
603 Tests::test_bit(b, 0);
605 { // case pos < b.size()
606 boost::dynamic_bitset<Block> b(std::string("0"));
607 Tests::test_bit(b, 0);
609 { // case pos == b.size() / 2
610 boost::dynamic_bitset<Block> b(long_string);
611 Tests::test_bit(b, long_string.size()/2);
613 //=====================================================================
614 // Test b.test_set(pos)
615 { // case pos >= b.size()
616 boost::dynamic_bitset<Block> b;
617 Tests::test_set_bit(b, 0, true);
618 Tests::test_set_bit(b, 0, false);
620 { // case pos < b.size()
621 boost::dynamic_bitset<Block> b(std::string("0"));
622 Tests::test_set_bit(b, 0, true);
623 Tests::test_set_bit(b, 0, false);
625 { // case pos == b.size() / 2
626 boost::dynamic_bitset<Block> b(long_string);
627 Tests::test_set_bit(b, long_string.size() / 2, true);
628 Tests::test_set_bit(b, long_string.size() / 2, false);
630 //=====================================================================
634 boost::dynamic_bitset<Block> b(std::string("1010"));
635 Tests::operator_shift_left(b, pos);
637 { // case pos == size()/2
638 std::size_t pos = long_string.size() / 2;
639 boost::dynamic_bitset<Block> b(long_string);
640 Tests::operator_shift_left(b, pos);
643 std::size_t pos = long_string.size();
644 boost::dynamic_bitset<Block> b(long_string);
645 Tests::operator_shift_left(b, pos);
647 //=====================================================================
651 boost::dynamic_bitset<Block> b(std::string("1010"));
652 Tests::operator_shift_right(b, pos);
654 { // case pos == size()/2
655 std::size_t pos = long_string.size() / 2;
656 boost::dynamic_bitset<Block> b(long_string);
657 Tests::operator_shift_right(b, pos);
660 std::size_t pos = long_string.size();
661 boost::dynamic_bitset<Block> b(long_string);
662 Tests::operator_shift_right(b, pos);
664 //=====================================================================
667 boost::dynamic_bitset<Block> lhs, rhs;
668 Tests::operator_and(lhs, rhs);
671 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
672 Tests::operator_and(lhs, rhs);
675 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
676 Tests::operator_and(lhs, rhs);
679 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
680 Tests::operator_and(lhs, rhs);
682 //=====================================================================
685 boost::dynamic_bitset<Block> lhs, rhs;
686 Tests::operator_or(lhs, rhs);
689 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
690 Tests::operator_or(lhs, rhs);
693 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
694 Tests::operator_or(lhs, rhs);
697 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
698 Tests::operator_or(lhs, rhs);
700 //=====================================================================
703 boost::dynamic_bitset<Block> lhs, rhs;
704 Tests::operator_xor(lhs, rhs);
707 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
708 Tests::operator_xor(lhs, rhs);
711 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
712 Tests::operator_xor(lhs, rhs);
715 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
716 Tests::operator_xor(lhs, rhs);
718 //=====================================================================
721 boost::dynamic_bitset<Block> lhs, rhs;
722 Tests::operator_sub(lhs, rhs);
725 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
726 Tests::operator_sub(lhs, rhs);
729 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
730 Tests::operator_sub(lhs, rhs);
733 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
734 Tests::operator_sub(lhs, rhs);
739 test_main(int, char*[])
741 run_test_cases<unsigned char>();
742 run_test_cases<unsigned short>();
743 run_test_cases<unsigned int>();
744 run_test_cases<unsigned long>();
745 # ifdef BOOST_HAS_LONG_LONG
746 run_test_cases< ::boost::ulong_long_type>();