1 /*++
2 Copyright (c) 2014 Microsoft Corporation
3 
4 Module Name:
5 
6     fixed_bit_vector.cpp
7 
8 Abstract:
9 
10     Test fixed-size bit vector module
11 
12 Author:
13 
14     Nikolaj Bjorner (nbjorner) 2014-9-15.
15 
16 Revision History:
17 
18     based on bit_vector.cpp
19 
20 --*/
21 #include<cstdlib>
22 #include<iostream>
23 #include "util/fixed_bit_vector.h"
24 #include "util/vector.h"
25 
26 
tst1()27 static void tst1() {
28     fixed_bit_vector_manager m(30);
29     fixed_bit_vector *b;
30     b = m.allocate0();
31     m.set(*b, 0, true);
32     m.set(*b, 1, false);
33     m.set(*b, 2, true);
34     ENSURE(b->get(0) == true);
35     ENSURE(b->get(1) == false);
36     ENSURE(b->get(2) == true);
37     ENSURE(b->get(3) == false);
38     ENSURE(b->get(29) == false);
39     m.deallocate(b);
40 }
41 
tst_or()42 static void tst_or() {
43     {
44         fixed_bit_vector_manager m(10);
45         fixed_bit_vector *b1, *b2;
46         b1 = m.allocate0();
47         b2 = m.allocate0();
48 
49         m.set(*b1, 4);
50         m.set(*b2, 8);
51         m.set(*b2, 3);
52         m.set(*b2, 2);
53         m.set(*b2, 1);
54         m.display(std::cout, *b1) << "\n";
55         m.display(std::cout, *b2) << "\n";
56         m.set_or(*b1, *b2);
57         m.display(std::cout, *b1) << "\n";
58         ENSURE(!m.equals(*b1, *b2));
59         m.unset(*b1, 4);
60         ENSURE(m.equals(*b1, *b2));
61         m.unset(*b1, 3);
62         ENSURE(!m.equals(*b1, *b2));
63         m.deallocate(b1);
64         m.deallocate(b2);
65     }
66 }
67 
tst_and()68 static void tst_and() {
69 
70 }
71 
72 
73 
tst_eq(unsigned num_bits)74 static void tst_eq(unsigned num_bits) {
75     fixed_bit_vector_manager m(num_bits);
76     fixed_bit_vector* b1 = m.allocate0();
77     fixed_bit_vector* b2 = m.allocate0();
78     fixed_bit_vector* b3 = m.allocate0();
79 
80     m.set(*b1, 3, true);
81     ENSURE(!m.equals(*b1, *b2));
82     ENSURE(m.equals(*b2, *b3));
83 
84     m.set(*b3, 3, true);
85     ENSURE(m.equals(*b1, *b3));
86 
87     m.set(*b2, num_bits-1, true);
88     m.set(*b3, num_bits-1);
89     m.unset(*b3, 3);
90     ENSURE(m.equals(*b2, *b3));
91     m.fill0(*b1);
92     m.set_neg(*b1);
93     m.fill1(*b2);
94     ENSURE(m.equals(*b1, *b2));
95     m.fill0(*b1);
96     for (unsigned i = 0; i < num_bits; ++i) {
97         m.set(*b1, i, true);
98     }
99     ENSURE(m.equals(*b1, *b2));
100     m.deallocate(b1);
101     m.deallocate(b2);
102     m.deallocate(b3);
103 }
104 
tst_fixed_bit_vector()105 void tst_fixed_bit_vector() {
106     tst1();
107     tst_or();
108     tst_and();
109     tst_eq(15);
110     tst_eq(16);
111     tst_eq(17);
112     tst_eq(31);
113     tst_eq(32);
114     tst_eq(33);
115     tst_eq(63);
116     tst_eq(64);
117     tst_eq(65);
118 }
119