fcsd/
utils.rs

1use std::cmp::Ordering;
2
3use crate::END_MARKER;
4
5/// Returns (lcp, cmp) such that
6///  - lcp: Length of longest commom prefix of two strings.
7///  - cmp: if a < b then positive, elif b < a then negative, else zero.
8#[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/// Checks if a is a prefix of b.
29#[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/// Checks if END_MARKER is contained.
43#[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}