diff --git a/src/lib.rs b/src/lib.rs index 52d8b26..cd561d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,8 @@ extern crate alloc; pub mod path; +#[cfg(test)] +pub mod path_test; pub mod subtree; #[cfg(feature = "std")] diff --git a/src/path.rs b/src/path.rs index e7e6cf8..4456e88 100644 --- a/src/path.rs +++ b/src/path.rs @@ -118,8 +118,11 @@ impl> PathUtils for T { Direction::Left } + /// Returns the first differing bit of `self`, from `start` bit of `self`(inclusive). + /// If all bits are the same, returns None instead. fn split_point(&self, start: usize, b: S) -> Option { - let max_bit_len = core::cmp::min(self.bit_len(), b.bit_len()); + assert!(self.bit_len() >= start); + let max_bit_len = core::cmp::min(self.bit_len() - start, b.bit_len()); let (src_start_byte, src_start_bit, seg_end_byte) = (start / 8, start % 8, (max_bit_len + 7) / 8); let mut count = 0; diff --git a/src/path_test.rs b/src/path_test.rs new file mode 100644 index 0000000..1286f91 --- /dev/null +++ b/src/path_test.rs @@ -0,0 +1,19 @@ +use crate::path::{BitLength, Path, PathSegment}; +use crate::ZERO_HASH; + +#[test] +fn path_bit_len() { + let current_key = Path(ZERO_HASH); + for depth in 0..256 { + for point in depth..256 { + let seg = PathSegment::from_path(current_key, depth, point); + assert_eq!( + seg.bit_len(), + point - depth, + "depth:{} point:{}", + depth, + point + ); + } + } +} diff --git a/src/tx.rs b/src/tx.rs index 6bcee9b..457b0b3 100644 --- a/src/tx.rs +++ b/src/tx.rs @@ -361,7 +361,7 @@ impl<'db, H: NodeHasher> WriteTransaction<'db, H> { let point = current_key.split_point(0, key).unwrap(); let prefix = PathSegment::from_path(current_key, depth, point); - let depth = depth + prefix.bit_len(); + let depth = point; let node_direction = key.direction(depth); let current_node = Node::from_leaf(current_key, current_value); let node = Node::from_leaf(key, value);