1use crate::utils::*;
3use crate::*;
4use std::ops::Range;
5
6#[derive(Debug, Clone, PartialEq)]
7pub struct Bits<'a> {
9 pub path: &'a [u8],
10 pub range: Range<BitsLen>,
11}
12
13impl<'a> Bits<'a> {
14 pub fn new(bytes: &'a [u8]) -> Self {
15 Bits {
16 path: bytes,
17 range: 0..(bytes.len() as BitsLen * 8),
18 }
19 }
20
21 pub fn from_bytes(bytes: &'a [u8]) -> Self {
23 let u = std::mem::size_of::<BitsLen>();
24 let start: BitsLen = bytes_to_int(&bytes[..u]);
25 let end: BitsLen = bytes_to_int(&bytes[u..2 * u]);
26 Self {
27 path: &bytes[2 * u..],
28 range: start..end,
29 }
30 }
31
32 pub fn to_bytes(&self) -> Result<Vec<u8>> {
34 let start = (self.range.start / 8) as usize;
35 let end = self.range.end.div_ceil(8) as usize;
36 let mut path = self.path[start..end].to_owned();
37 let r = (self.range.start % 8) as u8;
38 if r != 0 {
39 let mask = 0xffu8 >> r;
40 path[0] &= mask;
41 }
42 let r = (self.range.end % 8) as u8;
43 if r != 0 {
44 let mask = 0xffu8 << (8 - r);
45 let last = path.len() - 1;
46 path[last] &= mask;
47 }
48 Ok([
49 &self.range.start.to_be_bytes(),
50 &self.range.end.to_be_bytes(),
51 &path[..],
52 ]
53 .concat())
54 }
55
56 pub fn first(&self) -> bool {
58 bit(self.path, self.range.start)
59 }
60
61 pub fn len(&self) -> BitsLen {
62 self.range.end - self.range.start
63 }
64
65 pub fn is_empty(&self) -> bool {
66 self.len() == 0 || self.path.len() == 0
67 }
68
69 pub fn take(&self, n: BitsLen) -> Self {
71 let x = self.range.start + n;
72 let q = nbytes_across(self.range.start, x);
73 let range = self.range.start..x;
74 Self {
75 path: &self.path[..q as usize],
76 range,
77 }
78 }
79
80 pub fn drop(&self, n: BitsLen) -> Self {
82 let x = self.range.start + n;
83 let q = x / 8;
84 let range = x % 8..self.range.end - 8 * (x / 8);
85 Self {
86 path: &self.path[q as usize..],
87 range,
88 }
89 }
90
91 pub fn len_common_bits(a: &Self, b: &Self) -> BitsLen {
93 len_lcp(a.path, &a.range, b.path, &b.range)
94 }
95}