fmt, fixes and additions
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
//! Error types for the TST module.
|
||||
|
||||
use thiserror::Error;
|
||||
use std::io;
|
||||
use thiserror::Error;
|
||||
|
||||
/// Error type for TST operations.
|
||||
#[derive(Debug, Error)]
|
||||
@@ -9,28 +9,28 @@ pub enum Error {
|
||||
/// Error from OurDB operations.
|
||||
#[error("OurDB error: {0}")]
|
||||
OurDB(#[from] ourdb::Error),
|
||||
|
||||
|
||||
/// Error when a key is not found.
|
||||
#[error("Key not found: {0}")]
|
||||
KeyNotFound(String),
|
||||
|
||||
|
||||
/// Error when a prefix is not found.
|
||||
#[error("Prefix not found: {0}")]
|
||||
PrefixNotFound(String),
|
||||
|
||||
|
||||
/// Error during serialization.
|
||||
#[error("Serialization error: {0}")]
|
||||
Serialization(String),
|
||||
|
||||
|
||||
/// Error during deserialization.
|
||||
#[error("Deserialization error: {0}")]
|
||||
Deserialization(String),
|
||||
|
||||
|
||||
/// Error for invalid operations.
|
||||
#[error("Invalid operation: {0}")]
|
||||
InvalidOperation(String),
|
||||
|
||||
|
||||
/// IO error.
|
||||
#[error("IO error: {0}")]
|
||||
IO(#[from] io::Error),
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ use ourdb::OurDB;
|
||||
pub struct TST {
|
||||
/// Database for persistent storage
|
||||
db: OurDB,
|
||||
|
||||
|
||||
/// Database ID of the root node
|
||||
root_id: Option<u32>,
|
||||
}
|
||||
@@ -119,4 +119,4 @@ impl TST {
|
||||
pub fn getall(&mut self, prefix: &str) -> Result<Vec<Vec<u8>>, Error> {
|
||||
operations::getall(self, prefix)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,19 +5,19 @@
|
||||
pub struct TSTNode {
|
||||
/// The character stored at this node.
|
||||
pub character: char,
|
||||
|
||||
|
||||
/// Value stored at this node (empty if not end of key).
|
||||
pub value: Vec<u8>,
|
||||
|
||||
|
||||
/// Whether this node represents the end of a key.
|
||||
pub is_end_of_key: bool,
|
||||
|
||||
|
||||
/// Reference to the left child node (for characters < current character).
|
||||
pub left_id: Option<u32>,
|
||||
|
||||
|
||||
/// Reference to the middle child node (for next character in key).
|
||||
pub middle_id: Option<u32>,
|
||||
|
||||
|
||||
/// Reference to the right child node (for characters > current character).
|
||||
pub right_id: Option<u32>,
|
||||
}
|
||||
@@ -34,7 +34,7 @@ impl TSTNode {
|
||||
right_id: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Creates a new root node.
|
||||
pub fn new_root() -> Self {
|
||||
Self {
|
||||
@@ -46,4 +46,4 @@ impl TSTNode {
|
||||
right_id: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -9,19 +9,19 @@ use std::path::PathBuf;
|
||||
/// Creates a new TST with the specified database path.
|
||||
pub fn new_tst(path: &str, reset: bool) -> Result<TST, Error> {
|
||||
let path_buf = PathBuf::from(path);
|
||||
|
||||
|
||||
// Create the configuration for OurDB with reset parameter
|
||||
let config = OurDBConfig {
|
||||
path: path_buf.clone(),
|
||||
incremental_mode: true,
|
||||
file_size: Some(1024 * 1024), // 1MB file size for better performance with large datasets
|
||||
keysize: Some(4), // Use keysize=4 (default)
|
||||
reset: Some(reset), // Use the reset parameter
|
||||
keysize: Some(4), // Use keysize=4 (default)
|
||||
reset: Some(reset), // Use the reset parameter
|
||||
};
|
||||
|
||||
|
||||
// Create a new OurDB instance (it will handle reset internally)
|
||||
let mut db = OurDB::new(config)?;
|
||||
|
||||
|
||||
let root_id = if db.get_next_id()? == 1 || reset {
|
||||
// Create a new root node
|
||||
let root = TSTNode::new_root();
|
||||
@@ -29,17 +29,14 @@ pub fn new_tst(path: &str, reset: bool) -> Result<TST, Error> {
|
||||
id: None,
|
||||
data: &root.serialize(),
|
||||
})?;
|
||||
|
||||
|
||||
Some(root_id)
|
||||
} else {
|
||||
// Use existing root node
|
||||
Some(1) // Root node always has ID 1
|
||||
};
|
||||
|
||||
Ok(TST {
|
||||
db,
|
||||
root_id,
|
||||
})
|
||||
|
||||
Ok(TST { db, root_id })
|
||||
}
|
||||
|
||||
/// Sets a key-value pair in the tree.
|
||||
@@ -47,45 +44,51 @@ pub fn set(tree: &mut TST, key: &str, value: Vec<u8>) -> Result<(), Error> {
|
||||
if key.is_empty() {
|
||||
return Err(Error::InvalidOperation("Empty key not allowed".to_string()));
|
||||
}
|
||||
|
||||
|
||||
let root_id = match tree.root_id {
|
||||
Some(id) => id,
|
||||
None => return Err(Error::InvalidOperation("Tree not initialized".to_string())),
|
||||
};
|
||||
|
||||
|
||||
let chars: Vec<char> = key.chars().collect();
|
||||
set_recursive(tree, root_id, &chars, 0, value)?;
|
||||
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Recursive helper function for setting a key-value pair.
|
||||
fn set_recursive(tree: &mut TST, node_id: u32, chars: &[char], pos: usize, value: Vec<u8>) -> Result<u32, Error> {
|
||||
fn set_recursive(
|
||||
tree: &mut TST,
|
||||
node_id: u32,
|
||||
chars: &[char],
|
||||
pos: usize,
|
||||
value: Vec<u8>,
|
||||
) -> Result<u32, Error> {
|
||||
let mut node = tree.get_node(node_id)?;
|
||||
|
||||
|
||||
if pos >= chars.len() {
|
||||
// We've reached the end of the key
|
||||
node.is_end_of_key = true;
|
||||
node.value = value;
|
||||
return tree.save_node(Some(node_id), &node);
|
||||
}
|
||||
|
||||
|
||||
let current_char = chars[pos];
|
||||
|
||||
|
||||
if node.character == '\0' {
|
||||
// Root node or empty node, set the character
|
||||
node.character = current_char;
|
||||
let node_id = tree.save_node(Some(node_id), &node)?;
|
||||
|
||||
|
||||
// Continue with the next character
|
||||
if pos + 1 < chars.len() {
|
||||
let new_node = TSTNode::new(chars[pos + 1], Vec::new(), false);
|
||||
let new_id = tree.save_node(None, &new_node)?;
|
||||
|
||||
|
||||
let mut updated_node = tree.get_node(node_id)?;
|
||||
updated_node.middle_id = Some(new_id);
|
||||
tree.save_node(Some(node_id), &updated_node)?;
|
||||
|
||||
|
||||
return set_recursive(tree, new_id, chars, pos + 1, value);
|
||||
} else {
|
||||
// This is the last character
|
||||
@@ -95,7 +98,7 @@ fn set_recursive(tree: &mut TST, node_id: u32, chars: &[char], pos: usize, value
|
||||
return tree.save_node(Some(node_id), &updated_node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if current_char < node.character {
|
||||
// Go left
|
||||
if let Some(left_id) = node.left_id {
|
||||
@@ -104,11 +107,11 @@ fn set_recursive(tree: &mut TST, node_id: u32, chars: &[char], pos: usize, value
|
||||
// Create new left node
|
||||
let new_node = TSTNode::new(current_char, Vec::new(), false);
|
||||
let new_id = tree.save_node(None, &new_node)?;
|
||||
|
||||
|
||||
// Update current node
|
||||
node.left_id = Some(new_id);
|
||||
tree.save_node(Some(node_id), &node)?;
|
||||
|
||||
|
||||
return set_recursive(tree, new_id, chars, pos, value);
|
||||
}
|
||||
} else if current_char > node.character {
|
||||
@@ -119,11 +122,11 @@ fn set_recursive(tree: &mut TST, node_id: u32, chars: &[char], pos: usize, value
|
||||
// Create new right node
|
||||
let new_node = TSTNode::new(current_char, Vec::new(), false);
|
||||
let new_id = tree.save_node(None, &new_node)?;
|
||||
|
||||
|
||||
// Update current node
|
||||
node.right_id = Some(new_id);
|
||||
tree.save_node(Some(node_id), &node)?;
|
||||
|
||||
|
||||
return set_recursive(tree, new_id, chars, pos, value);
|
||||
}
|
||||
} else {
|
||||
@@ -134,18 +137,18 @@ fn set_recursive(tree: &mut TST, node_id: u32, chars: &[char], pos: usize, value
|
||||
node.value = value;
|
||||
return tree.save_node(Some(node_id), &node);
|
||||
}
|
||||
|
||||
|
||||
if let Some(middle_id) = node.middle_id {
|
||||
return set_recursive(tree, middle_id, chars, pos + 1, value);
|
||||
} else {
|
||||
// Create new middle node
|
||||
let new_node = TSTNode::new(chars[pos + 1], Vec::new(), false);
|
||||
let new_id = tree.save_node(None, &new_node)?;
|
||||
|
||||
|
||||
// Update current node
|
||||
node.middle_id = Some(new_id);
|
||||
tree.save_node(Some(node_id), &node)?;
|
||||
|
||||
|
||||
return set_recursive(tree, new_id, chars, pos + 1, value);
|
||||
}
|
||||
}
|
||||
@@ -156,15 +159,15 @@ pub fn get(tree: &mut TST, key: &str) -> Result<Vec<u8>, Error> {
|
||||
if key.is_empty() {
|
||||
return Err(Error::InvalidOperation("Empty key not allowed".to_string()));
|
||||
}
|
||||
|
||||
|
||||
let root_id = match tree.root_id {
|
||||
Some(id) => id,
|
||||
None => return Err(Error::InvalidOperation("Tree not initialized".to_string())),
|
||||
};
|
||||
|
||||
|
||||
let chars: Vec<char> = key.chars().collect();
|
||||
let node_id = find_node(tree, root_id, &chars, 0)?;
|
||||
|
||||
|
||||
let node = tree.get_node(node_id)?;
|
||||
if node.is_end_of_key {
|
||||
Ok(node.value.clone())
|
||||
@@ -176,13 +179,13 @@ pub fn get(tree: &mut TST, key: &str) -> Result<Vec<u8>, Error> {
|
||||
/// Finds a node by key.
|
||||
fn find_node(tree: &mut TST, node_id: u32, chars: &[char], pos: usize) -> Result<u32, Error> {
|
||||
let node = tree.get_node(node_id)?;
|
||||
|
||||
|
||||
if pos >= chars.len() {
|
||||
return Ok(node_id);
|
||||
}
|
||||
|
||||
|
||||
let current_char = chars[pos];
|
||||
|
||||
|
||||
if current_char < node.character {
|
||||
// Go left
|
||||
if let Some(left_id) = node.left_id {
|
||||
@@ -216,21 +219,21 @@ pub fn delete(tree: &mut TST, key: &str) -> Result<(), Error> {
|
||||
if key.is_empty() {
|
||||
return Err(Error::InvalidOperation("Empty key not allowed".to_string()));
|
||||
}
|
||||
|
||||
|
||||
let root_id = match tree.root_id {
|
||||
Some(id) => id,
|
||||
None => return Err(Error::InvalidOperation("Tree not initialized".to_string())),
|
||||
};
|
||||
|
||||
|
||||
let chars: Vec<char> = key.chars().collect();
|
||||
let node_id = find_node(tree, root_id, &chars, 0)?;
|
||||
|
||||
|
||||
let mut node = tree.get_node(node_id)?;
|
||||
|
||||
|
||||
if !node.is_end_of_key {
|
||||
return Err(Error::KeyNotFound(key.to_string()));
|
||||
}
|
||||
|
||||
|
||||
// If the node has a middle child, just mark it as not end of key
|
||||
if node.middle_id.is_some() || node.left_id.is_some() || node.right_id.is_some() {
|
||||
node.is_end_of_key = false;
|
||||
@@ -238,14 +241,14 @@ pub fn delete(tree: &mut TST, key: &str) -> Result<(), Error> {
|
||||
tree.save_node(Some(node_id), &node)?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
||||
// Otherwise, we need to remove the node and update its parent
|
||||
// This is more complex and would require tracking the path to the node
|
||||
// For simplicity, we'll just mark it as not end of key for now
|
||||
node.is_end_of_key = false;
|
||||
node.value = Vec::new();
|
||||
tree.save_node(Some(node_id), &node)?;
|
||||
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -255,46 +258,51 @@ pub fn list(tree: &mut TST, prefix: &str) -> Result<Vec<String>, Error> {
|
||||
Some(id) => id,
|
||||
None => return Err(Error::InvalidOperation("Tree not initialized".to_string())),
|
||||
};
|
||||
|
||||
|
||||
let mut result = Vec::new();
|
||||
|
||||
|
||||
// Handle empty prefix case - will return all keys
|
||||
if prefix.is_empty() {
|
||||
collect_all_keys(tree, root_id, String::new(), &mut result)?;
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
|
||||
// Find the node corresponding to the prefix
|
||||
let chars: Vec<char> = prefix.chars().collect();
|
||||
let node_id = match find_prefix_node(tree, root_id, &chars, 0) {
|
||||
Ok(id) => id,
|
||||
Err(_) => return Ok(Vec::new()), // Prefix not found, return empty list
|
||||
};
|
||||
|
||||
|
||||
// For empty prefix, we start with an empty string
|
||||
// For non-empty prefix, we start with the prefix minus the last character
|
||||
// (since the last character is in the node we found)
|
||||
let prefix_base = if chars.len() > 1 {
|
||||
chars[0..chars.len()-1].iter().collect()
|
||||
chars[0..chars.len() - 1].iter().collect()
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
|
||||
// Collect all keys from the subtree
|
||||
collect_keys_with_prefix(tree, node_id, prefix_base, &mut result)?;
|
||||
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
/// Finds the node corresponding to a prefix.
|
||||
fn find_prefix_node(tree: &mut TST, node_id: u32, chars: &[char], pos: usize) -> Result<u32, Error> {
|
||||
fn find_prefix_node(
|
||||
tree: &mut TST,
|
||||
node_id: u32,
|
||||
chars: &[char],
|
||||
pos: usize,
|
||||
) -> Result<u32, Error> {
|
||||
if pos >= chars.len() {
|
||||
return Ok(node_id);
|
||||
}
|
||||
|
||||
|
||||
let node = tree.get_node(node_id)?;
|
||||
let current_char = chars[pos];
|
||||
|
||||
|
||||
if current_char < node.character {
|
||||
// Go left
|
||||
if let Some(left_id) = node.left_id {
|
||||
@@ -331,32 +339,32 @@ fn collect_keys_with_prefix(
|
||||
result: &mut Vec<String>,
|
||||
) -> Result<(), Error> {
|
||||
let node = tree.get_node(node_id)?;
|
||||
|
||||
|
||||
let mut new_path = current_path.clone();
|
||||
|
||||
|
||||
// For non-root nodes, add the character to the path
|
||||
if node.character != '\0' {
|
||||
new_path.push(node.character);
|
||||
}
|
||||
|
||||
|
||||
// If this node is an end of key, add it to the result
|
||||
if node.is_end_of_key {
|
||||
result.push(new_path.clone());
|
||||
}
|
||||
|
||||
|
||||
// Recursively collect keys from all children
|
||||
if let Some(left_id) = node.left_id {
|
||||
collect_keys_with_prefix(tree, left_id, current_path.clone(), result)?;
|
||||
}
|
||||
|
||||
|
||||
if let Some(middle_id) = node.middle_id {
|
||||
collect_keys_with_prefix(tree, middle_id, new_path.clone(), result)?;
|
||||
}
|
||||
|
||||
|
||||
if let Some(right_id) = node.right_id {
|
||||
collect_keys_with_prefix(tree, right_id, current_path.clone(), result)?;
|
||||
}
|
||||
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -368,32 +376,32 @@ fn collect_all_keys(
|
||||
result: &mut Vec<String>,
|
||||
) -> Result<(), Error> {
|
||||
let node = tree.get_node(node_id)?;
|
||||
|
||||
|
||||
let mut new_path = current_path.clone();
|
||||
|
||||
|
||||
// Skip adding the character for the root node
|
||||
if node.character != '\0' {
|
||||
new_path.push(node.character);
|
||||
}
|
||||
|
||||
|
||||
// If this node is an end of key, add it to the result
|
||||
if node.is_end_of_key {
|
||||
result.push(new_path.clone());
|
||||
}
|
||||
|
||||
|
||||
// Recursively collect keys from all children
|
||||
if let Some(left_id) = node.left_id {
|
||||
collect_all_keys(tree, left_id, current_path.clone(), result)?;
|
||||
}
|
||||
|
||||
|
||||
if let Some(middle_id) = node.middle_id {
|
||||
collect_all_keys(tree, middle_id, new_path.clone(), result)?;
|
||||
}
|
||||
|
||||
|
||||
if let Some(right_id) = node.right_id {
|
||||
collect_all_keys(tree, right_id, current_path.clone(), result)?;
|
||||
}
|
||||
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -401,23 +409,23 @@ fn collect_all_keys(
|
||||
pub fn getall(tree: &mut TST, prefix: &str) -> Result<Vec<Vec<u8>>, Error> {
|
||||
// Get all matching keys
|
||||
let keys = list(tree, prefix)?;
|
||||
|
||||
|
||||
// Get values for each key
|
||||
let mut values = Vec::new();
|
||||
let mut errors = Vec::new();
|
||||
|
||||
|
||||
for key in keys {
|
||||
match get(tree, &key) {
|
||||
Ok(value) => values.push(value),
|
||||
Err(e) => errors.push(format!("Error getting value for key '{}': {:?}", key, e))
|
||||
Err(e) => errors.push(format!("Error getting value for key '{}': {:?}", key, e)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If we couldn't get any values but had keys, return the first error
|
||||
if values.is_empty() && !errors.is_empty() {
|
||||
return Err(Error::InvalidOperation(errors.join("; ")));
|
||||
}
|
||||
|
||||
|
||||
Ok(values)
|
||||
}
|
||||
|
||||
@@ -442,4 +450,4 @@ impl TST {
|
||||
Err(err) => Err(Error::OurDB(err)),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -10,17 +10,17 @@ impl TSTNode {
|
||||
/// Serializes a node to bytes for storage.
|
||||
pub fn serialize(&self) -> Vec<u8> {
|
||||
let mut buffer = Vec::new();
|
||||
|
||||
|
||||
// Version
|
||||
buffer.push(VERSION);
|
||||
|
||||
|
||||
// Character (as UTF-32)
|
||||
let char_bytes = (self.character as u32).to_le_bytes();
|
||||
buffer.extend_from_slice(&char_bytes);
|
||||
|
||||
|
||||
// Is end of key
|
||||
buffer.push(if self.is_end_of_key { 1 } else { 0 });
|
||||
|
||||
|
||||
// Value (only if is_end_of_key)
|
||||
if self.is_end_of_key {
|
||||
let value_len = (self.value.len() as u32).to_le_bytes();
|
||||
@@ -30,88 +30,100 @@ impl TSTNode {
|
||||
// Zero length
|
||||
buffer.extend_from_slice(&[0, 0, 0, 0]);
|
||||
}
|
||||
|
||||
|
||||
// Child pointers
|
||||
let left_id = self.left_id.unwrap_or(0).to_le_bytes();
|
||||
buffer.extend_from_slice(&left_id);
|
||||
|
||||
|
||||
let middle_id = self.middle_id.unwrap_or(0).to_le_bytes();
|
||||
buffer.extend_from_slice(&middle_id);
|
||||
|
||||
|
||||
let right_id = self.right_id.unwrap_or(0).to_le_bytes();
|
||||
buffer.extend_from_slice(&right_id);
|
||||
|
||||
|
||||
buffer
|
||||
}
|
||||
|
||||
/// Deserializes bytes to a node.
|
||||
pub fn deserialize(data: &[u8]) -> Result<Self, Error> {
|
||||
if data.len() < 14 { // Minimum size: version + char + is_end + value_len + 3 child IDs
|
||||
if data.len() < 14 {
|
||||
// Minimum size: version + char + is_end + value_len + 3 child IDs
|
||||
return Err(Error::Deserialization("Data too short".to_string()));
|
||||
}
|
||||
|
||||
|
||||
let mut pos = 0;
|
||||
|
||||
|
||||
// Version
|
||||
let version = data[pos];
|
||||
pos += 1;
|
||||
|
||||
|
||||
if version != VERSION {
|
||||
return Err(Error::Deserialization(format!("Unsupported version: {}", version)));
|
||||
return Err(Error::Deserialization(format!(
|
||||
"Unsupported version: {}",
|
||||
version
|
||||
)));
|
||||
}
|
||||
|
||||
|
||||
// Character
|
||||
let char_bytes = [data[pos], data[pos+1], data[pos+2], data[pos+3]];
|
||||
let char_bytes = [data[pos], data[pos + 1], data[pos + 2], data[pos + 3]];
|
||||
let char_code = u32::from_le_bytes(char_bytes);
|
||||
let character = char::from_u32(char_code)
|
||||
.ok_or_else(|| Error::Deserialization("Invalid character".to_string()))?;
|
||||
pos += 4;
|
||||
|
||||
|
||||
// Is end of key
|
||||
let is_end_of_key = data[pos] != 0;
|
||||
pos += 1;
|
||||
|
||||
|
||||
// Value length
|
||||
let value_len_bytes = [data[pos], data[pos+1], data[pos+2], data[pos+3]];
|
||||
let value_len_bytes = [data[pos], data[pos + 1], data[pos + 2], data[pos + 3]];
|
||||
let value_len = u32::from_le_bytes(value_len_bytes) as usize;
|
||||
pos += 4;
|
||||
|
||||
|
||||
// Value
|
||||
let value = if value_len > 0 {
|
||||
if pos + value_len > data.len() {
|
||||
return Err(Error::Deserialization("Value length exceeds data".to_string()));
|
||||
return Err(Error::Deserialization(
|
||||
"Value length exceeds data".to_string(),
|
||||
));
|
||||
}
|
||||
data[pos..pos+value_len].to_vec()
|
||||
data[pos..pos + value_len].to_vec()
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
pos += value_len;
|
||||
|
||||
|
||||
// Child pointers
|
||||
if pos + 12 > data.len() {
|
||||
return Err(Error::Deserialization("Data too short for child pointers".to_string()));
|
||||
return Err(Error::Deserialization(
|
||||
"Data too short for child pointers".to_string(),
|
||||
));
|
||||
}
|
||||
|
||||
let left_id_bytes = [data[pos], data[pos+1], data[pos+2], data[pos+3]];
|
||||
|
||||
let left_id_bytes = [data[pos], data[pos + 1], data[pos + 2], data[pos + 3]];
|
||||
let left_id = u32::from_le_bytes(left_id_bytes);
|
||||
pos += 4;
|
||||
|
||||
let middle_id_bytes = [data[pos], data[pos+1], data[pos+2], data[pos+3]];
|
||||
|
||||
let middle_id_bytes = [data[pos], data[pos + 1], data[pos + 2], data[pos + 3]];
|
||||
let middle_id = u32::from_le_bytes(middle_id_bytes);
|
||||
pos += 4;
|
||||
|
||||
let right_id_bytes = [data[pos], data[pos+1], data[pos+2], data[pos+3]];
|
||||
|
||||
let right_id_bytes = [data[pos], data[pos + 1], data[pos + 2], data[pos + 3]];
|
||||
let right_id = u32::from_le_bytes(right_id_bytes);
|
||||
|
||||
|
||||
Ok(TSTNode {
|
||||
character,
|
||||
value,
|
||||
is_end_of_key,
|
||||
left_id: if left_id == 0 { None } else { Some(left_id) },
|
||||
middle_id: if middle_id == 0 { None } else { Some(middle_id) },
|
||||
middle_id: if middle_id == 0 {
|
||||
None
|
||||
} else {
|
||||
Some(middle_id)
|
||||
},
|
||||
right_id: if right_id == 0 { None } else { Some(right_id) },
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Function removed as it was unused
|
||||
// Function removed as it was unused
|
||||
|
Reference in New Issue
Block a user