From 31ad86a4f26276f0416519a59d23a992228ed920 Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Thu, 12 Sep 2024 18:37:56 -0500 Subject: [PATCH] Hide inner Entry structure --- src/bin/mtbl_dump.rs | 2 +- src/dupsort_func.rs | 4 ++-- src/entry.rs | 20 ++++++++++++++++++-- src/iter.rs | 4 ++-- src/merge_func.rs | 7 +++---- src/merger.rs | 14 +++++++------- src/reader/block.rs | 22 +++++++++------------- src/reader/mod.rs | 2 +- src/sorter.rs | 4 ++-- src/source.rs | 12 ++++++------ src/writer/block_builder.rs | 4 +--- src/writer/mod.rs | 10 +++++----- tests/rwtest.rs | 3 +-- 13 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/bin/mtbl_dump.rs b/src/bin/mtbl_dump.rs index 4b0142b..c1de724 100644 --- a/src/bin/mtbl_dump.rs +++ b/src/bin/mtbl_dump.rs @@ -6,6 +6,6 @@ fn main() { .expect("Usage: mtbl_dump "); let reader = mtbl::reader::from_file(fname); for e in reader.iter() { - println!("{:?}: {:?}", *e.key, *e.value); + println!("{:?}: {:?}", e.key(), e.value()); } } diff --git a/src/dupsort_func.rs b/src/dupsort_func.rs index 956233c..4023106 100644 --- a/src/dupsort_func.rs +++ b/src/dupsort_func.rs @@ -88,7 +88,7 @@ where // println!("2: {:?} / {:?}", self.next, self.run); while let Some(e) = self.iter.next() { - if e.key == self.run[0].key { + if e.key() == self.run[0].key() { self.run.push(e); continue; } @@ -126,7 +126,7 @@ fn test_dupsort() { .collect(), ); - let s = ts.dupsort_func(|a, b| a.value[0].cmp(&b.value[0])); + let s = ts.dupsort_func(|a, b| a.value()[0].cmp(&b.value()[0])); assert_eq!( Vec::from_iter((&s).iter()), diff --git a/src/entry.rs b/src/entry.rs index 06d7707..491a294 100644 --- a/src/entry.rs +++ b/src/entry.rs @@ -2,8 +2,8 @@ use std::sync::Arc; #[derive(Debug, Clone, PartialEq, Eq)] pub struct Entry { - pub key: Arc>, - pub value: Arc>, + key: Arc>, + value: Arc>, } impl Entry { @@ -27,4 +27,20 @@ impl Entry { Arc::make_mut(&mut self.key).clear(); Arc::make_mut(&mut self.value).clear(); } + + pub fn key(&self) -> &[u8] { + self.key.as_slice() + } + + pub fn key_mut(&mut self) -> &mut Vec { + Arc::make_mut(&mut self.key) + } + + pub fn value(&self) -> &[u8] { + self.value.as_slice() + } + + pub fn value_mut(&mut self) -> &mut Vec { + Arc::make_mut(&mut self.value) + } } diff --git a/src/iter.rs b/src/iter.rs index 7e062c3..f92f301 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -32,7 +32,7 @@ impl Iterator for PrefixIter { type Item = Entry; fn next(&mut self) -> Option { let item = self.iter.next()?; - if item.key.starts_with(self.prefix.as_slice()) { + if item.key().starts_with(self.prefix.as_slice()) { Some(item) } else { None @@ -67,7 +67,7 @@ impl Iterator for RangeIter { type Item = Entry; fn next(&mut self) -> Option { let item = self.iter.next()?; - if item.key.as_slice() <= self.end.as_slice() { + if item.key() <= self.end.as_slice() { Some(item) } else { None diff --git a/src/merge_func.rs b/src/merge_func.rs index 1e16f0e..6fa1f01 100644 --- a/src/merge_func.rs +++ b/src/merge_func.rs @@ -1,5 +1,4 @@ use crate::{Entry, Iter, Source}; -use std::sync::Arc; pub struct MergeFunc, &Entry)> { source: S, @@ -66,8 +65,8 @@ where fn next(&mut self) -> Option { let mut cur = self.prev.take().or_else(|| self.iter.next())?; while let Some(e) = self.iter.next() { - if e.key == cur.key { - (self.merge_func)(Arc::make_mut(&mut cur.value), &e); + if e.key() == cur.key() { + (self.merge_func)(cur.value_mut(), &e); } else { self.prev.replace(e); break; @@ -101,7 +100,7 @@ fn test_merge_func() { ); let s = ts.merge_func(|v, e| { - v[0] += e.value[0]; + v[0] += e.value()[0]; }); assert_eq!( diff --git a/src/merger.rs b/src/merger.rs index a0bdca8..558a672 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -25,20 +25,20 @@ struct MergeEntry { impl PartialEq for MergeEntry { fn eq(&self, other: &Self) -> bool { - self.e.key == other.e.key + self.e.key() == other.e.key() } } impl Eq for MergeEntry {} impl PartialOrd for MergeEntry { fn partial_cmp(&self, other: &Self) -> Option { - Some(other.e.key.cmp(&self.e.key)) + Some(other.e.key().cmp(&self.e.key())) } } impl Ord for MergeEntry { fn cmp(&self, other: &Self) -> Ordering { - other.e.key.cmp(&self.e.key) + other.e.key().cmp(&self.e.key()) } } @@ -81,7 +81,7 @@ impl Iterator for MergeIter { if let Some(e) = next.it.next() { next.e = e; self.last_key.clear(); - self.last_key.extend(next.e.key.as_slice()); + self.last_key.extend(next.e.key()); return Some(cur); } } @@ -97,9 +97,9 @@ impl Iter for MergeIter { match self.heap.peek_mut() { None => return, Some(mut head) => { - if head.e.key.as_slice() >= key { + if head.e.key() >= key { self.last_key.clear(); - self.last_key.extend_from_slice(head.e.key.as_slice()); + self.last_key.extend_from_slice(head.e.key()); return; } head.it.seek(key); @@ -180,7 +180,7 @@ mod test { v.extend(tnum(i)) } v.sort(); - let v2 = Vec::from_iter(s.iter().map(|e| e.key[0])); + let v2 = Vec::from_iter(s.iter().map(|e| e.key()[0])); assert_eq!(v2, v); } diff --git a/src/reader/block.rs b/src/reader/block.rs index d456f6b..b6abaad 100644 --- a/src/reader/block.rs +++ b/src/reader/block.rs @@ -1,7 +1,6 @@ use crate::{Entry, Iter, Result}; use integer_encoding::VarInt; use std::mem::size_of; -use std::sync::Arc; #[derive(Debug)] enum RestartType { @@ -154,10 +153,7 @@ impl> BlockIter { } let data = self.block.data.as_ref(); - let entry = self.cur_ent.get_or_insert(Entry { - key: Arc::new(Vec::new()), - value: Arc::new(Vec::new()), - }); + let entry = self.cur_ent.get_or_insert(Entry::new([], [])); let (shared_key, len) = usize::decode_var(&data[idx..])?; idx += len; @@ -166,17 +162,17 @@ impl> BlockIter { let (len_val, len) = usize::decode_var(&data[idx..])?; idx += len; - if shared_key > entry.key.len() { + if shared_key > entry.key().len() { // return Err("shared_key too long".into()); return None; } - let key = Arc::make_mut(&mut entry.key); + let key = entry.key_mut(); key.truncate(shared_key); key.extend_from_slice(get_bytes(&data[idx..], unshared_key).ok()?); idx += unshared_key; - let val = Arc::make_mut(&mut entry.value); + let val = entry.value_mut(); val.clear(); val.extend_from_slice(get_bytes(&data[idx..], len_val).ok()?); idx += len_val; @@ -204,7 +200,7 @@ impl> Iter for BlockIter { match self.decode() { None => break, Some(e) => { - if e.key.as_slice() >= key { + if e.key() >= key { self.off = poff; return; } @@ -250,10 +246,10 @@ mod test { let b = build_block(n, 1, 10); let bi = b.into_iter(); assert_eq!( - bi.map(|e| e.key).collect::>(), + bi.map(|e| Vec::from(e.key())).collect::>(), build_ref(n, 1) .into_iter() - .map(|e| e.key) + .map(|e| Vec::from(e.key())) .collect::>() ); } @@ -264,8 +260,8 @@ mod test { let b = build_block(n, 10, 10); let mut bi = b.into_iter(); bi.seek(&u32::to_be_bytes(40)); - assert_eq!(bi.next().unwrap().key.as_ref(), &u32::to_be_bytes(40)); + assert_eq!(bi.next().unwrap().key(), &u32::to_be_bytes(40)); bi.seek(&u32::to_be_bytes(32)); - assert_eq!(bi.next().unwrap().key.as_ref(), &u32::to_be_bytes(40)); + assert_eq!(bi.next().unwrap().key(), &u32::to_be_bytes(40)); } } diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 1f31a3e..cf2873c 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -160,7 +160,7 @@ impl> Iter for ReaderIter { self.index_iter .next() .and_then(|e| { - self.next_offset = usize::decode_var(e.value.as_slice())?.0; + self.next_offset = usize::decode_var(e.value())?.0; self.next_block().map(|_| { self.data_iter.as_mut().unwrap().seek(key); }) diff --git a/src/sorter.rs b/src/sorter.rs index 5012530..232bbfc 100644 --- a/src/sorter.rs +++ b/src/sorter.rs @@ -27,7 +27,7 @@ where } pub fn add(&mut self, e: Entry) { - let esize = e.key.len() + e.value.len(); + let esize = e.key().len() + e.value().len(); if esize + self.batch_size > self.max_size { self.write_chunk(); } @@ -52,7 +52,7 @@ where let mut w = Writer::new(Vec::new()); self.batch .get_mut() - .sort_unstable_by(|a, b| a.key.cmp(&b.key)); + .sort_unstable_by(|a, b| a.key().cmp(b.key())); self.batch .take() .merge_func(&self.merge_func) diff --git a/src/source.rs b/src/source.rs index dd79f88..a9f7347 100644 --- a/src/source.rs +++ b/src/source.rs @@ -56,7 +56,7 @@ impl<'a> Iter for VecIter<'a> { let mut right = self.vec.len() - 1; while left < right { let mid = (left + right + 1) / 2; - if self.vec[mid].key.as_slice() < key { + if self.vec[mid].key() < key { left = mid; } else { right = mid - 1; @@ -105,7 +105,7 @@ pub mod test_source { impl<'a> Iter for TestIter<'a> { fn seek(&mut self, key: &[u8]) { self.off = 0; - while self.off < self.source.0.len() && self.source.0[self.off].key.as_slice() < key { + while self.off < self.source.0.len() && self.source.0[self.off].key() < key { self.off += 1; } } @@ -142,21 +142,21 @@ pub mod test { let s = &test_source(); assert_eq!( - Vec::from_iter(s.iter().map(|e| e.value[0])), + Vec::from_iter(s.iter().map(|e| e.value()[0])), vec![0, 1, 2, 3, 4] ); assert_eq!( - Vec::from_iter(s.get(vec![0, 0, 1, 0].as_slice()).map(|e| e.value[0])), + Vec::from_iter(s.get(vec![0, 0, 1, 0].as_slice()).map(|e| e.value()[0])), vec![2] ); assert_eq!( - Vec::from_iter(s.get_prefix(vec![0, 0].as_slice()).map(|e| e.value[0])), + Vec::from_iter(s.get_prefix(vec![0, 0].as_slice()).map(|e| e.value()[0])), vec![0, 1, 2] ); assert_eq!( Vec::from_iter( s.get_range(vec![0, 0, 0, 1].as_slice(), vec![0, 1, 0, 0].as_slice()) - .map(|e| e.value[0]) + .map(|e| e.value()[0]) ), vec![1, 2, 3] ); diff --git a/src/writer/block_builder.rs b/src/writer/block_builder.rs index 70e39d7..da6743f 100644 --- a/src/writer/block_builder.rs +++ b/src/writer/block_builder.rs @@ -124,9 +124,7 @@ mod test { let bi = Block::new(DataSlice::new(bb.as_slice())) .unwrap() .into_iter(); - let vcmp = Vec::from_iter( - bi.map(|e| (Vec::from(e.key.as_slice()), Vec::from(e.value.as_slice()))), - ); + let vcmp = Vec::from_iter(bi.map(|e| (Vec::from(e.key()), Vec::from(e.value())))); assert_eq!(v, vcmp); } } diff --git a/src/writer/mod.rs b/src/writer/mod.rs index 2da054a..a19f6db 100644 --- a/src/writer/mod.rs +++ b/src/writer/mod.rs @@ -111,15 +111,15 @@ impl Writer { } pub fn add(&mut self, e: Entry) -> Result<()> { - let est = e.key.len() + e.value.len() + 15; + let est = e.key().len() + e.value().len() + 15; if self.block.len() + est >= self.blocksize { - bytesep(&mut self.last_key, e.key.as_slice()); + bytesep(&mut self.last_key, e.key()); self.write_block()?; } - self.meta.add_entry(e.key.len(), e.value.len()); - self.block.add(e.key.as_slice(), e.value.as_slice()); + self.meta.add_entry(e.key().len(), e.value().len()); + self.block.add(e.key(), e.value()); self.last_key.clear(); - self.last_key.extend_from_slice(e.key.as_slice()); + self.last_key.extend_from_slice(e.key()); Ok(()) } diff --git a/tests/rwtest.rs b/tests/rwtest.rs index 31e9ea5..e3136b7 100644 --- a/tests/rwtest.rs +++ b/tests/rwtest.rs @@ -26,8 +26,7 @@ fn test_write_readback() { rangei.collect::>(), reference .into_iter() - .filter(|e| e.key.as_slice() >= &u32::to_be_bytes(192) - && e.key.as_slice() <= &u32::to_be_bytes(256)) + .filter(|e| e.key() >= &u32::to_be_bytes(192) && e.key() <= &u32::to_be_bytes(256)) .collect::>() ) } -- 2.50.1