Mercurial > lbo > hg > leveldb-rs
changeset 38:6ccabb8a96f4
Implement BlockHandle
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 12 Jun 2016 20:02:12 +0200 |
parents | 4b7f20805274 |
children | e38f5617df6f |
files | src/types.rs |
diffstat | 1 files changed, 66 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/types.rs Sun Jun 12 19:51:30 2016 +0200 +++ b/src/types.rs Sun Jun 12 20:02:12 2016 +0200 @@ -1,6 +1,8 @@ use std::default::Default; use std::cmp::Ordering; +use integer_encoding::VarInt; + pub enum ValueType { TypeDeletion = 0, TypeValue = 1, @@ -95,3 +97,67 @@ } } } + +pub struct BlockHandle { + offset: usize, + size: usize, +} + +impl BlockHandle { + /// Decodes a block handle from `from` and returns a block handle + /// together with how many bytes were read from the slice. + pub fn decode(from: &[u8]) -> (BlockHandle, usize) { + let (off, offsize) = usize::decode_var(from); + let (sz, szsize) = usize::decode_var(&from[offsize..]); + + (BlockHandle { + offset: off, + size: sz, + }, + offsize + szsize) + } + + pub fn new(offset: usize, size: usize) -> BlockHandle { + BlockHandle { + offset: offset, + size: size, + } + } + + pub fn offset(&self) -> usize { + self.offset + } + + pub fn size(&self) -> usize { + self.size + } + + /// Returns how many bytes were written, or 0 if the write failed because `dst` is too small. + pub fn encode_to(&self, dst: &mut [u8]) -> usize { + if dst.len() < self.offset.required_space() + self.size.required_space() { + 0 + } else { + let off = self.offset.encode_var(dst); + off + self.size.encode_var(&mut dst[off..]) + } + + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_blockhandle() { + let bh = BlockHandle::new(890, 777); + let mut dst = [0 as u8; 128]; + let enc_sz = bh.encode_to(&mut dst[..]); + + let (bh2, dec_sz) = BlockHandle::decode(&dst); + + assert_eq!(enc_sz, dec_sz); + assert_eq!(bh.size(), bh2.size()); + assert_eq!(bh.offset(), bh2.offset()); + } +}