This commit is contained in:
Paul Masurel
2016-02-04 10:46:45 +09:00
parent f790425679
commit e7f77d9866
2 changed files with 61 additions and 4 deletions

View File

@@ -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<u8>,
@@ -69,7 +70,6 @@ pub struct SkipListBuilder {
layers: Vec<LayerBuilder>,
}
enum InsertResult {
SkipPointer(usize),
NoNeedForSkip,
@@ -128,3 +128,47 @@ impl SkipListBuilder {
Ok(())
}
}
// ---------------------------
struct Layer<R: Read + Seek> {
reader: R,
num_items: u32,
}
impl<R: Read + Seek + Clone> Layer<R> {
fn read(reader: &mut R) -> Layer<R> {
// TODO error handling?
let num_items = reader.read_u32::<BigEndian>().unwrap() as u32;
let num_bytes = reader.read_u32::<BigEndian>().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<R: Read + Seek> {
layers: Vec<Layer<R>>,
}
impl<R: Read + Seek> SkipList<R> {
pub fn read(data: &[u8]) -> SkipList<Cursor<&[u8]>> {
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
}
}
}

View File

@@ -35,3 +35,16 @@ fn test_skip_list_builder() {
assert_eq!(output[0], 3);
}
}
#[test]
fn test_skip_list_builder() {
{
let mut output: Vec<u8> = Vec::new();
let mut skip_list_builder: SkipListBuilder = SkipListBuilder::new(10);
skip_list_builder.insert(2, 3);
skip_list_builder.write::<Vec<u8>>(&mut output);
let skip_list = SkipList::read(output.as_slice());
}
}