use std::mem::{offset_of, size_of};
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Leaf {
pub key_fp: u8,
pub node_type: u8,
pub value_len: u16,
pub key_len: u16,
pub tombstone: u8,
pub _pad: u8,
pub seq: u64,
}
const _: () = assert!(size_of::<Leaf>() == 16);
const _: () = assert!(offset_of!(Leaf, key_fp) == 0);
const _: () = assert!(offset_of!(Leaf, node_type) == 1);
const _: () = assert!(offset_of!(Leaf, value_len) == 2);
const _: () = assert!(offset_of!(Leaf, key_len) == 4);
const _: () = assert!(offset_of!(Leaf, tombstone) == 6);
const _: () = assert!(offset_of!(Leaf, _pad) == 7);
const _: () = assert!(offset_of!(Leaf, seq) == 8);
impl Leaf {
#[must_use]
pub const fn live(key_len: u16, value_len: u16, seq: u64, key_fp: u8) -> Self {
Self {
key_fp,
node_type: super::NodeType::Leaf.as_u8(),
value_len,
key_len,
tombstone: 0,
_pad: 0,
seq,
}
}
}
#[must_use]
pub const fn leaf_body_size(key_len: u32, value_len: u32) -> u32 {
let raw = 16 + key_len + value_len;
(raw + 7) & !7
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn body_size_alignment() {
assert_eq!(leaf_body_size(0, 0), 16); assert_eq!(leaf_body_size(3, 5), 24); assert_eq!(leaf_body_size(4, 4), 24); assert_eq!(leaf_body_size(1, 0), 24); assert_eq!(leaf_body_size(10, 5), 32); assert_eq!(leaf_body_size(100, 200), (16 + 100 + 200 + 7) & !7);
}
#[test]
fn body_size_always_aligned_to_8() {
for key_len in 0..64 {
for value_len in 0..64 {
let s = leaf_body_size(key_len, value_len);
assert_eq!(s % 8, 0, "leaf_body_size({key_len}, {value_len}) = {s}");
let need = 16 + key_len + value_len;
assert!(s >= need);
assert!(s < need + 8);
}
}
}
}