use std::rc::Rc;
use owning_ref::{OwningRef, Erased};
use super::{Trie, Cursor, Builder, MergeBuilder, TupleBuilder};
#[derive(Debug)]
pub struct UnorderedLayer<K> {
pub vals: Vec<K>,
}
impl<K: Clone> Trie for UnorderedLayer<K> {
type Item = K;
type Cursor = UnorderedCursor;
type MergeBuilder = UnorderedBuilder<K>;
type TupleBuilder = UnorderedBuilder<K>;
fn keys(&self) -> usize { self.vals.len() }
fn tuples(&self) -> usize { <UnorderedLayer<K> as Trie>::keys(&self) }
fn cursor_from(&self, lower: usize, upper: usize) -> Self::Cursor {
UnorderedCursor {
bounds: (lower, upper),
pos: lower,
}
}
}
pub struct UnorderedBuilder<K> {
pub vals: Vec<K>,
}
impl<K: Clone> Builder for UnorderedBuilder<K> {
type Trie = UnorderedLayer<K>;
fn boundary(&mut self) -> usize { self.vals.len() }
fn done(self) -> Self::Trie { UnorderedLayer { vals: self.vals } }
}
impl<K: Clone> MergeBuilder for UnorderedBuilder<K> {
fn with_capacity(other1: &Self::Trie, other2: &Self::Trie) -> Self {
UnorderedBuilder {
vals: Vec::with_capacity(<UnorderedLayer<K> as Trie>::keys(other1) + <UnorderedLayer<K> as Trie>::keys(other2)),
}
}
fn copy_range(&mut self, other: &Self::Trie, lower: usize, upper: usize) {
self.vals.extend_from_slice(&other.vals[lower .. upper]);
}
fn push_merge(&mut self, other1: (&Self::Trie, usize, usize), other2: (&Self::Trie, usize, usize)) -> usize {
<UnorderedBuilder<K> as MergeBuilder>::copy_range(self, &other1.0, other1.1, other1.2);
<UnorderedBuilder<K> as MergeBuilder>::copy_range(self, &other2.0, other2.1, other2.2);
self.vals.len()
}
}
impl<K: Clone> TupleBuilder for UnorderedBuilder<K> {
type Item = K;
fn new() -> Self { UnorderedBuilder { vals: Vec::new() } }
fn with_capacity(cap: usize) -> Self { UnorderedBuilder { vals: Vec::with_capacity(cap) } }
#[inline(always)] fn push_tuple(&mut self, tuple: K) { self.vals.push(tuple) }
}
#[derive(Debug)]
pub struct UnorderedCursor {
pos: usize,
bounds: (usize, usize),
}
impl<K: Clone> Cursor<UnorderedLayer<K>> for UnorderedCursor {
type Key = K;
fn key<'a>(&self, storage: &'a UnorderedLayer<K>) -> &'a Self::Key { &storage.vals[self.pos] }
fn step(&mut self, _storage: &UnorderedLayer<K>) {
self.pos += 1;
if !self.valid() {
self.pos = self.bounds.1;
}
}
fn seek(&mut self, _storage: &UnorderedLayer<K>, _key: &Self::Key) {
panic!("seeking in an UnorderedCursor");
}
fn valid(&self, _storage: &UnorderedLayer<K>) -> bool { self.pos < self.bounds.1 }
fn rewind(&mut self, _storage: &UnorderedLayer<K>) {
self.pos = self.bounds.0;
}
fn reposition(&mut self, _storage: &UnorderedLayer<K>, lower: usize, upper: usize) {
self.pos = lower;
self.bounds = (lower, upper);
}
}