bv/adapter/
mod.rs

1//! Lazy bit vector adapters.
2//!
3//! This module defines adapters for dealing with bit vectors and other
4//! types that implement [`Bits`]. It also defines the adaptors that
5//! are returned by methods of the extension trait [`BitsExt`].
6//!
7//! [`Bits`]: ../trait.Bits.html
8//! [`BitsExt`]: ../trait.BitsExt.html
9
10#[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(&not_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}