use std::mem::{offset_of, size_of};
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Leaf {
pub value_size: u16,
pub tombstone: u8,
_pad: u8,
pub key_offset: u32,
pub seq: u64,
}
const _: () = assert!(size_of::<Leaf>() == 16);
const _: () = assert!(offset_of!(Leaf, value_size) == 0);
const _: () = assert!(offset_of!(Leaf, tombstone) == 2);
const _: () = assert!(offset_of!(Leaf, key_offset) == 4);
const _: () = assert!(offset_of!(Leaf, seq) == 8);
impl Leaf {
#[must_use]
pub const fn live(key_offset: u32, value_size: u16, seq: u64) -> Self {
Self {
value_size,
tombstone: 0,
_pad: 0,
key_offset,
seq,
}
}
}
#[must_use]
pub const fn leaf_extent_size(key_len: u32, value_len: u32) -> u32 {
let raw = 2 + key_len + value_len;
(raw + 7) & !7
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn extent_size_alignment() {
assert_eq!(leaf_extent_size(0, 0), 8);
assert_eq!(leaf_extent_size(3, 3), 8); assert_eq!(leaf_extent_size(4, 4), 16); assert_eq!(leaf_extent_size(10, 4), 16); assert_eq!(leaf_extent_size(10, 5), 24); assert_eq!(leaf_extent_size(100, 200), (2 + 100 + 200 + 7) & !7);
}
}