1#[macro_use]
11mod bit_slice_adapter;
12pub use self::bit_slice_adapter::BitSliceAdapter;
13
14mod logic;
15pub use self::logic::{BitNot, BitAnd, BitOr, BitXor, BitZip};
16
17mod bit_fill;
18pub use self::bit_fill::BitFill;
19
20mod bit_concat;
21pub use self::bit_concat::BitConcat;
22
23mod bool_adapter;
24pub use self::bool_adapter::BoolAdapter;
25
26#[cfg(test)]
27mod test {
28 use {Bits, BitsExt, BitsMut, BitVec, BitSliceable};
29 use super::BitSliceAdapter;
30
31 fn assert_0001<T: Bits>(bits: &T) {
32 assert_eq!( bits.bit_len(), 4 );
33
34 assert!( !bits.get_bit(0) );
35 assert!( !bits.get_bit(1) );
36 assert!( !bits.get_bit(2) );
37 assert!( bits.get_bit(3) );
38
39 let bv = bits.to_bit_vec();
40 assert_eq!( bv, bit_vec![false, false, false, true] );
41 }
42
43 #[test]
44 fn simple_not() {
45 let bv: BitVec = bit_vec![true, true, true, false,];
46 let not_bits = bv.bit_not();
47 assert_0001(¬_bits);
48 }
49
50 #[test]
51 fn simple_and() {
52 let bv1: BitVec<u8> = bit_vec![ false, false, true, true, ];
53 let bv2: BitVec<u8> = bit_vec![ false, true, false, true, ];
54 let and_bits = bv1.bit_and(&bv2);
55 assert_0001(&and_bits);
56 }
57
58 #[test]
59 fn and_with_same_offset() {
60 let bv1: BitVec<u8> = bit_vec![ true, false, false, true, true ];
61 let bv2: BitVec<u8> = bit_vec![ true, false, true, false, true ];
62 let bv_slice1 = bv1.bit_slice(1..);
63 let bv_slice2 = bv2.bit_slice(1..);
64 let and_bits = bv_slice1.bit_and(&bv_slice2);
65 assert_0001(&and_bits);
66 }
67
68 #[test]
69 fn and_with_different_offset() {
70 let bv1: BitVec<u8> = bit_vec![ true, true, false, false, true, true ];
71 let bv2: BitVec<u8> = bit_vec![ true, false, true, false, true ];
72 let bv_slice1 = bv1.bit_slice(2..);
73 let bv_slice2 = bv2.bit_slice(1..);
74 let and_bits = bv_slice1.bit_and(&bv_slice2);
75 assert_0001(&and_bits);
76 }
77
78 #[test]
79 fn append() {
80 let bv1: BitVec<u8> = bit_vec![false];
81 let bv2: BitVec<u8> = bit_vec![true, true];
82 let bv3: BitVec<u8> = bit_vec![false, false, false];
83
84 let bv123 = bv1.bit_concat(&bv2).into_bit_concat(&bv3);
85 let app12 = bv123.bit_concat(&bv123);
86 let app24 = app12.bit_concat(&app12);
87 let bv = BitVec::from_bits(&app24);
88
89 assert_eq!(bv, bit_vec![false, true, true, false, false, false,
90 false, true, true, false, false, false,
91 false, true, true, false, false, false,
92 false, true, true, false, false, false]);
93 }
94
95 #[test]
96 fn pad() {
97 let bv1: BitVec = bit_vec![true, false, true, false];
98 let bv2: BitVec = bit_vec![true, true];
99
100 let bv3 = bv1.bit_or(bv2.bit_pad(bv1.bit_len())).to_bit_vec();
101
102 assert_eq!( bv3, bit_vec![true, true, true, false] );
103 }
104
105 #[test]
106 fn slice_adapter() {
107 let bv1: BitVec = bit_vec![true, false, true, false, true, false, true, false];
108 let bv2: BitVec = bit_vec![true, true, false, false, true, true, false, false];
109
110 let bv3 = bv1.bit_xor(&bv2).bit_slice(1..7).to_bit_vec();
111
112 assert_eq!( bv3, bit_vec![true, true, false, false, true, true] );
113 }
114
115 #[test]
116 fn slice_adapter_mutation() {
117 let mut bv: BitVec = bit_vec![true, false, true, false];
118
119 {
120 let mut slice = BitSliceAdapter::new(&mut bv, 1, 2);
121 slice.set_bit(1, false);
122 }
123
124 assert_eq!( bv, bit_vec![true, false, false, false] );
125
126 {
127 let mut slice = BitSliceAdapter::new(&mut bv, 1, 2);
128 slice.set_block(0, 0b111);
129 }
130
131 assert_eq!( bv, bit_vec![true, true, true, false] );
132 }
133
134 #[test]
135 fn mixed_equality() {
136 let bv1: BitVec = bit_vec![false, false, true, true];
137 let bv2: BitVec = bit_vec![false, true, false, true];
138 assert_eq!( bv1.bit_xor(&bv2), bit_vec![false, true, true, false] );
139 }
140}