view src/test_util.rs @ 157:de83256f4423

Refactor Env and PosixDiskEnv to be more dynamic. This comes closer to the original LevelDB implementation, is more flexible, and most importantly enables inclusion as member of Options.
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 09 Jul 2017 20:33:20 +0200
parents 7c13a7d4f795
children 50642ad716ea
line wrap: on
line source

use types::LdbIterator;
use cmp::{Cmp, DefaultCmp};
use std::cmp::Ordering;

pub struct TestLdbIter<'a> {
    v: Vec<(&'a [u8], &'a [u8])>,
    ix: usize,
    init: bool,
}

impl<'a> TestLdbIter<'a> {
    pub fn new(c: Vec<(&'a [u8], &'a [u8])>) -> TestLdbIter<'a> {
        return TestLdbIter {
            v: c,
            ix: 0,
            init: false,
        };
    }
}

impl<'a> Iterator for TestLdbIter<'a> {
    type Item = (&'a [u8], &'a [u8]);

    fn next(&mut self) -> Option<Self::Item> {
        if self.ix == self.v.len() {
            return None;
        } else if !self.init {
            self.init = true;
            Some(self.v[self.ix])
        } else {
            self.ix += 1;
            Some(self.v[self.ix - 1])
        }
    }
}

impl<'a> LdbIterator for TestLdbIter<'a> {
    fn reset(&mut self) {
        self.ix = 0;
        self.init = false;
    }
    fn current(&self) -> Option<Self::Item> {
        if self.init && self.ix < self.v.len() {
            Some(self.v[self.ix])
        } else {
            None
        }
    }
    fn valid(&self) -> bool {
        self.init
    }
    fn seek(&mut self, k: &[u8]) {
        self.ix = 0;
        while self.ix < self.v.len() && DefaultCmp.cmp(self.v[self.ix].0, k) == Ordering::Less {
            self.ix += 1;
        }
    }
    fn prev(&mut self) -> Option<Self::Item> {
        if !self.init || self.ix == 0 {
            None
        } else {
            self.ix -= 1;
            Some(self.v[self.ix])
        }
    }
}