1use std::cmp::Ordering;
2
3use crate::END_MARKER;
4
5#[inline(always)]
9pub fn get_lcp(a: &[u8], b: &[u8]) -> (usize, isize) {
10 let min_len = std::cmp::min(a.len(), b.len());
11 for i in 0..min_len {
12 if a[i] != b[i] {
13 return (i, b[i] as isize - a[i] as isize);
14 }
15 }
16 match a.len().cmp(&b.len()) {
17 Ordering::Less => (min_len, 1),
18 Ordering::Greater => (min_len, -1),
19 Ordering::Equal => (min_len, 0),
20 }
21}
22
23#[inline(always)]
24pub fn get_strlen(a: &[u8]) -> usize {
25 a.iter().position(|&c| c == END_MARKER).unwrap()
26}
27
28#[inline(always)]
30pub fn is_prefix(a: &[u8], b: &[u8]) -> bool {
31 if a.len() > b.len() {
32 return false;
33 }
34 for i in 0..a.len() {
35 if a[i] != b[i] {
36 return false;
37 }
38 }
39 true
40}
41
42#[inline(always)]
44pub fn contains_end_marker(a: &[u8]) -> bool {
45 a.iter().any(|&c| c == END_MARKER)
46}
47
48#[inline(always)]
49pub fn is_power_of_two(x: usize) -> bool {
50 debug_assert_ne!(x, 0);
51 (x & (x - 1)) == 0
52}
53
54#[inline(always)]
55pub const fn needed_bits(mut x: u64) -> usize {
56 if x == 0 {
57 return 1;
58 }
59 let mut n = 0;
60 while x != 0 {
61 x >>= 1;
62 n += 1;
63 }
64 n
65}
66
67pub mod vbyte {
68 #[inline(always)]
69 pub fn append(bytes: &mut Vec<u8>, mut val: usize) {
70 while 127 < val {
71 bytes.push(((val & 127) | 0x80) as u8);
72 val >>= 7;
73 }
74 bytes.push((val & 127) as u8);
75 }
76 #[inline(always)]
77 pub const fn decode(bytes: &[u8]) -> (usize, usize) {
78 let mut val = 0;
79 let (mut i, mut j) = (0, 0);
80 while (bytes[i] & 0x80) != 0 {
81 val |= ((bytes[i] & 127) as usize) << j;
82 i += 1;
83 j += 7;
84 }
85 val |= ((bytes[i] & 127) as usize) << j;
86 (val, i + 1)
87 }
88}