/*++ Copyright (c) 2006 Microsoft Corporation Module Name: tst_bitvector.cpp Abstract: Test bitvector module Author: Leonardo de Moura (leonardo) 2006-10-03. Revision History: --*/ #include #include #include "util/bit_vector.h" #include "util/vector.h" static void tst1() { bit_vector v1; svector v2; unsigned n = rand()%10000; for (unsigned i = 0; i < n; i++) { int op = rand()%6; if (op <= 1) { bool val = (rand()%2) != 0; v1.push_back(val); v2.push_back(val); ENSURE(v1.size() == v2.size()); } else if (op <= 3) { ENSURE(v1.size() == v2.size()); if (!v1.empty()) { bool val = (rand()%2) != 0; unsigned idx = rand()%v1.size(); ENSURE(v1.get(idx) == v2[idx]); v1.set(idx, val); v2[idx] = val; ENSURE(v1.get(idx) == v2[idx]); } } else if (op <= 4) { ENSURE(v1.size() == v2.size()); if (!v1.empty()) { unsigned idx = rand()%v1.size(); VERIFY(v1.get(idx) == v2[idx]); } } else if (op <= 5) { ENSURE(v1.size() == v2.size()); for (unsigned j = 0; j < v1.size(); j++) { ENSURE(v1.get(j) == v2[j]); } } } } static void tst2() { bit_vector b; b.push_back(true); b.push_back(false); b.push_back(true); b.resize(30); ENSURE(b.get(0) == true); ENSURE(b.get(1) == false); ENSURE(b.get(2) == true); ENSURE(b.get(3) == false); ENSURE(b.get(29) == false); } static void tst_shift() { bit_vector b; b.resize(111); b.set(105); b.set(99); b.set(98); b.set(90); b.set(80); b.set(75); b.set(33); b.set(32); b.set(31); b.set(30); b.set(10); std::cout << "b: " << b << "\n"; b.shift_right(16); std::cout << "b: " << b << "\n"; b.shift_right(1); std::cout << "b: " << b << "\n"; b.shift_right(32); std::cout << "b: " << b << "\n"; b.shift_right(42); std::cout << "b: " << b << "\n"; b.shift_right(16); std::cout << "b: " << b << "\n"; b.shift_right(63); std::cout << "b: " << b << "\n"; } static void tst_or() { { bit_vector b1; bit_vector b2; b1.resize(5); b2.resize(10); b1.set(4); b2.set(8); b2.set(3); b2.set(2); b2.set(1); std::cout << b1 << "\n"; std::cout << b2 << "\n"; b1 |= b2; ENSURE(b1.size() == 10); std::cout << b1 << "\n"; ENSURE(b1 != b2); ENSURE(b1 != b2); b1.unset(4); ENSURE(b1 == b2); b1.unset(3); ENSURE(b1 != b2); } { bit_vector b1; bit_vector b2; b1.resize(2); b2.resize(5); b1.set(0); b2.set(4); b1 |= b2; ENSURE(b1 != b2); b2.set(0); ENSURE(b1 == b2); std::cout << "-----\n"; std::cout << b1 << "\n"; } { bit_vector b1; bit_vector b2; b1.resize(10); b2.resize(10); b1.set(5); b2.set(8); b2.set(3); b2.resize(5); b1 |= b2; ENSURE(!b1.get(8)); ENSURE(b1.get(5)); ENSURE(b1.get(3)); } { bit_vector b1; bit_vector b2; b1.resize(123); b2.resize(126); b2.set(124); b1.set(122); b1.set(100); b2.set(100); b1.set(80); b2.set(80); b1.set(4); b2.set(4); ENSURE(b1!=b2); b2.resize(123); ENSURE(b1!=b2); b1.resize(120); b2.resize(120); ENSURE(b1==b2); b1.unset(80); b1.unset(100); ENSURE(b1!=b2); b1 |= b2; ENSURE(b1 == b2); } { bit_vector b1; bit_vector b2; b1.resize(5); b2.resize(10); b2.set(8); b1.set(4); b2.set(1); b1.set(0); b1 |= b2; ENSURE(b1.size() == 10); ENSURE(b1.get(8) && b1.get(4) && b1.get(1) && b1.get(0) && !b1.get(9)); } { bit_vector b1; bit_vector b2; b1.resize(32); b2.resize(32); b1.set(1); b1.set(5); b2.set(8); b2.set(0); b1 |= b2; ENSURE(b1.get(1) && b1.get(5) && b1.get(8) && b1.get(0) && !b1.get(11)); std::cout << "b1(size32): " << b1 << "\n"; } } static void tst_and() { { bit_vector b1; bit_vector b2; b1.resize(5); b2.resize(3); b2.set(2); b1.set(2); b1.set(4); std::cout << "------\nb1: " << b1 << "\n"; b1 &= b2; std::cout << "------\nb1: " << b1 << "\n"; ENSURE(!b1.get(4)); ENSURE(b1.get(2)); } { bit_vector b1; bit_vector b2; b1.resize(241); b2.resize(128); b1.set(240); b1.set(232); b1.set(127); b1.set(128); b1.set(8); b2.set(127); b2.set(5); b1 &= b2; ENSURE(!b1.get(240) && !b1.get(232) && !b1.get(128) && b1.get(127) && !b1.get(8) && !b1.get(5)); } } static void tst_crash() { { bit_vector b; b.push_back(true); b.resize(64); ENSURE(!b.get(63)); ENSURE(b.get(0)); ENSURE(!b.get(1)); } { bit_vector b; b.push_back(false); b.resize(64, true); ENSURE(b.get(63)); ENSURE(!b.get(0)); ENSURE(b.get(1)); } } static void tst_bv_reset() { bit_vector b; bool bit = true; for (unsigned sz = 1; sz < 84; ++sz) { b.reset(); b.resize(sz, bit); for (unsigned i = 0; i < sz; ++i) { ENSURE(bit == b.get(i)); } for (unsigned sz2 = sz; sz2 < sz+10; ++sz2) { b.resize(sz2, !bit); for (unsigned i = sz; i < sz2; ++i) { ENSURE(bit != b.get(i)); } } bit = !bit; } } static void tst_eq() { bit_vector b1, b2, b3; b1.resize(32); b2.resize(32); b3.resize(32); b1.set(3, true); ENSURE(b1 != b2); ENSURE(!(b1 == b2)); ENSURE(b2 == b3); b3.set(3, true); ENSURE(b1 == b3); ENSURE(!(b1 != b3)); b2.set(31, true); b3.set(31); b3.unset(3); ENSURE(b2 == b3); ENSURE(!(b2 != b3)); } void tst_bit_vector() { tst_crash(); tst_shift(); tst_or(); tst_and(); tst_bv_reset(); tst_eq(); return; tst2(); for (unsigned i = 0; i < 20; i++) { std::cerr << i << std::endl; tst1(); } }