use std::mem::{offset_of, size_of};
use super::node::NodeType;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct Node4 {
pub count: u8,
pub node_type: u8,
_pad_2: [u8; 2],
pub keys: [u8; 4],
pub children: [u32; 4],
}
const _: () = assert!(size_of::<Node4>() == 24);
const _: () = assert!(offset_of!(Node4, keys) == 4);
const _: () = assert!(offset_of!(Node4, children) == 8);
impl Node4 {
#[must_use]
pub fn empty() -> Self {
Self {
count: 0,
node_type: NodeType::Node4.as_u8(),
_pad_2: [0; 2],
keys: [0; 4],
children: [0; 4],
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct Node16 {
pub count: u8,
pub node_type: u8,
_pad: [u8; 6],
pub keys: [u8; 16],
pub children: [u32; 16],
}
const _: () = assert!(size_of::<Node16>() == 88);
const _: () = assert!(offset_of!(Node16, keys) == 8);
const _: () = assert!(offset_of!(Node16, children) == 24);
impl Node16 {
#[must_use]
pub fn empty() -> Self {
Self {
count: 0,
node_type: NodeType::Node16.as_u8(),
_pad: [0; 6],
keys: [0; 16],
children: [0; 16],
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct Node48 {
pub count: u8,
pub node_type: u8,
_pad: [u8; 6],
pub index: [u8; 256],
pub children: [u32; 48],
}
const _: () = assert!(size_of::<Node48>() == 456);
const _: () = assert!(offset_of!(Node48, index) == 8);
const _: () = assert!(offset_of!(Node48, children) == 264);
impl Node48 {
#[must_use]
pub fn empty() -> Self {
Self {
count: 0,
node_type: NodeType::Node48.as_u8(),
_pad: [0; 6],
index: [0; 256],
children: [0; 48],
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct Node256 {
pub count: u8,
pub node_type: u8,
_pad: [u8; 6],
pub children: [u32; 256],
}
const _: () = assert!(size_of::<Node256>() == 1032);
const _: () = assert!(offset_of!(Node256, children) == 8);
impl Node256 {
#[must_use]
pub fn empty() -> Self {
Self {
count: 0,
node_type: NodeType::Node256.as_u8(),
_pad: [0; 6],
children: [0; 256],
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sizes_pinned_at_compile_time() {
assert_eq!(size_of::<Node4>(), 24);
assert_eq!(size_of::<Node16>(), 88);
assert_eq!(size_of::<Node48>(), 456);
assert_eq!(size_of::<Node256>(), 1032);
}
#[test]
fn empty_constructors_set_node_type() {
assert_eq!(Node4::empty().node_type, NodeType::Node4.as_u8());
assert_eq!(Node16::empty().node_type, NodeType::Node16.as_u8());
assert_eq!(Node48::empty().node_type, NodeType::Node48.as_u8());
assert_eq!(Node256::empty().node_type, NodeType::Node256.as_u8());
}
}