pub mod ordered;
pub mod unordered;
const INDEX_INT_SIZE: usize = 4;
fn partition_index_and_sub_key<const P: usize>(key: &[u8]) -> (usize, &[u8]) {
const {
assert!(P > 0, "P must be greater than 0");
assert!(P <= 3, "P must be 3 or less");
}
let copy_len = P.min(key.len());
let mut bytes = [0u8; INDEX_INT_SIZE];
bytes[INDEX_INT_SIZE - copy_len..].copy_from_slice(&key[..copy_len]);
(u32::from_be_bytes(bytes) as usize, &key[copy_len..])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_partitioned_prefix_length_1() {
const PREFIX_LENGTH: usize = 1;
let key = [];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 0);
assert_eq!(sub_key, b"");
let key = [0x01];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 1);
assert_eq!(sub_key, b"");
let key = [0x00, 0x01];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 0);
assert_eq!(sub_key, &[0x01]);
let key = [0x00, 0x00, 0x01];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 0);
assert_eq!(sub_key, &[0x00, 0x01]);
}
#[test]
fn test_partitioned_prefix_length_2() {
const PREFIX_LENGTH: usize = 2;
let key = [];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 0);
assert_eq!(sub_key, b"");
let key = [0x01]; let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 1);
assert_eq!(sub_key, b"");
let key = [0x00, 0x01];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 1);
assert_eq!(sub_key, b"");
let key = [0x00, 0xFF, 0x01];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 0xFF);
assert_eq!(sub_key, &[0x01]);
let key = [0x01, 0xFF, 0x02]; let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, (0x01 << 8) | (0xFF));
assert_eq!(sub_key, &[0x02]);
}
#[test]
fn test_partitioned_prefix_length_3() {
const PREFIX_LENGTH: usize = 3;
let key = [];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 0);
assert_eq!(sub_key, b"");
let key = [0x01]; let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 1);
assert_eq!(sub_key, b"");
let key = [0x00, 0x01];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, 1);
assert_eq!(sub_key, b"");
let key = [0x00, 0x01, 0x02];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, (0x01 << 8) | 0x02);
assert_eq!(sub_key, b"");
let key = [0x00, 0x01, 0x02, 0x03];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, (0x01 << 8) | 0x02);
assert_eq!(sub_key, &[0x03]);
let key = [0x01, 0xFF, 0xAB, 0xCD, 0xEF];
let (index, sub_key) = partition_index_and_sub_key::<PREFIX_LENGTH>(&key);
assert_eq!(index, (0x01 << 16) | (0xFF << 8) | 0xAB);
assert_eq!(sub_key, &[0xCD, 0xEF]);
}
}