76 lines
1.5 KiB
V
76 lines
1.5 KiB
V
module radixtree
|
|
|
|
import freeflowuniverse.herolib.data.encoder
|
|
|
|
const version = u8(1) // Current binary format version
|
|
|
|
// Serializes a node to bytes for storage
|
|
fn serialize_node(node Node) []u8 {
|
|
mut e := encoder.new()
|
|
|
|
// Add version byte
|
|
e.add_u8(version)
|
|
|
|
// Add key segment
|
|
e.add_string(node.key_segment)
|
|
|
|
// Add value as []u8
|
|
e.add_u16(u16(node.value.len))
|
|
e.data << node.value
|
|
|
|
// Add children
|
|
e.add_u16(u16(node.children.len))
|
|
for child in node.children {
|
|
e.add_string(child.key_part)
|
|
e.add_u32(child.node_id)
|
|
}
|
|
|
|
// Add leaf flag
|
|
e.add_u8(if node.is_leaf { u8(1) } else { u8(0) })
|
|
|
|
return e.data
|
|
}
|
|
|
|
// Deserializes bytes to a node
|
|
fn deserialize_node(data []u8) !Node {
|
|
mut d := encoder.decoder_new(data)
|
|
|
|
// Read and verify version
|
|
version_byte := d.get_u8()!
|
|
if version_byte != version {
|
|
return error('Invalid version byte: expected ${version}, got ${version_byte}')
|
|
}
|
|
|
|
// Read key segment
|
|
key_segment := d.get_string()!
|
|
|
|
// Read value as []u8
|
|
value_len := d.get_u16()!
|
|
mut value := []u8{len: int(value_len)}
|
|
for i in 0 .. int(value_len) {
|
|
value[i] = d.get_u8()!
|
|
}
|
|
|
|
// Read children
|
|
children_len := d.get_u16()!
|
|
mut children := []NodeRef{cap: int(children_len)}
|
|
for _ in 0 .. children_len {
|
|
key_part := d.get_string()!
|
|
node_id := d.get_u32()!
|
|
children << NodeRef{
|
|
key_part: key_part
|
|
node_id: node_id
|
|
}
|
|
}
|
|
|
|
// Read leaf flag
|
|
is_leaf := d.get_u8()! == 1
|
|
|
|
return Node{
|
|
key_segment: key_segment
|
|
value: value
|
|
children: children
|
|
is_leaf: is_leaf
|
|
}
|
|
}
|