diff --git a/src/core/skip.rs b/src/core/skip.rs index 716168c4d..7f0062c4f 100644 --- a/src/core/skip.rs +++ b/src/core/skip.rs @@ -1,5 +1,9 @@ use std::io::Write; use std::io::BufWriter; +use std::io::Read; +use std::io::Cursor; +use std::io::SeekFrom; +use std::io::Seek; use core::DocId; use std::ops::DerefMut; use serde::Serialize; @@ -10,9 +14,6 @@ use core::error; use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; - -// writer - struct LayerBuilder { period: usize, buffer: Vec, @@ -69,7 +70,6 @@ pub struct SkipListBuilder { layers: Vec, } - enum InsertResult { SkipPointer(usize), NoNeedForSkip, @@ -128,3 +128,47 @@ impl SkipListBuilder { Ok(()) } } + + +// --------------------------- + + +struct Layer { + reader: R, + num_items: u32, +} + +impl Layer { + fn read(reader: &mut R) -> Layer { + // TODO error handling? + let num_items = reader.read_u32::().unwrap() as u32; + let num_bytes = reader.read_u32::().unwrap() as u32; + let reader_clone = reader.clone(); + reader.seek(SeekFrom::Current(num_bytes as i64)); + Layer { + reader: reader_clone, + num_items: num_items, + } + } +} + +pub struct SkipList { + layers: Vec>, +} + +impl SkipList { + + pub fn read(data: &[u8]) -> SkipList> { + let mut cursor = Cursor::new(data); + // TODO error handling? + let num_layers = cursor.read_u8().unwrap(); + let mut layers = Vec::new(); + for _ in (0..num_layers) { + layers.push(Layer::read(&mut cursor)); + } + SkipList { + layers: layers + } + } + +} diff --git a/tests/skip.rs b/tests/skip.rs index 1e195d0df..71bcbcf1c 100644 --- a/tests/skip.rs +++ b/tests/skip.rs @@ -35,3 +35,16 @@ fn test_skip_list_builder() { assert_eq!(output[0], 3); } } + + +#[test] +fn test_skip_list_builder() { + { + let mut output: Vec = Vec::new(); + let mut skip_list_builder: SkipListBuilder = SkipListBuilder::new(10); + skip_list_builder.insert(2, 3); + skip_list_builder.write::>(&mut output); + let skip_list = SkipList::read(output.as_slice()); + } + +}