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());
+    }
+}