use std::{
fmt::Debug,
ops::{Add, Sub},
};
mod layer;
mod leaf;
pub use layer::{Layer, LayerBuilder, LayerCursor, LayerFactories};
pub use leaf::{Leaf, LeafBuilder, LeafCursor, LeafFactories};
use size_of::SizeOf;
use crate::{algebra::HasZero, trace::Rkyv};
#[cfg(test)]
mod test;
pub trait OrdOffset:
Copy
+ Debug
+ PartialEq
+ PartialOrd
+ Add<Output = Self>
+ Sub<Output = Self>
+ TryFrom<usize>
+ TryInto<usize>
+ HasZero
+ SizeOf
+ Sized
+ Rkyv
+ Send
+ Sync
+ 'static
{
fn from_usize(offset: usize) -> Self;
fn into_usize(self) -> usize;
}
impl<O> OrdOffset for O
where
O: Copy
+ Debug
+ PartialEq
+ PartialOrd
+ Add<Output = Self>
+ Sub<Output = Self>
+ TryFrom<usize>
+ TryInto<usize>
+ HasZero
+ SizeOf
+ Sized
+ Rkyv
+ Send
+ Sync
+ 'static,
<O as TryInto<usize>>::Error: Debug,
<O as TryFrom<usize>>::Error: Debug,
{
#[inline]
fn from_usize(offset: usize) -> Self {
offset.try_into().unwrap()
}
#[inline]
fn into_usize(self) -> usize {
self.try_into().unwrap()
}
}
pub trait Trie: Sized {
type Item<'a>;
type ItemRef<'a>;
type Factories: Clone;
type Cursor<'s>: Cursor<'s>
where
Self: 's;
type MergeBuilder: MergeBuilder<Trie = Self>;
type TupleBuilder: TupleBuilder<Trie = Self>;
type LeafKey: ?Sized;
fn keys(&self) -> usize;
fn is_empty(&self) -> bool {
self.keys() == 0
}
fn tuples(&self) -> usize;
fn cursor(&self) -> Self::Cursor<'_> {
self.cursor_from(0, self.keys())
}
fn cursor_from(&self, lower: usize, upper: usize) -> Self::Cursor<'_>;
fn merge(&self, other: &Self) -> Self {
let mut merger = Self::MergeBuilder::with_capacity(self, other);
merger.push_merge(self.cursor(), other.cursor(), None);
merger.done()
}
fn approximate_byte_size(&self) -> usize;
}
pub trait Builder {
type Trie: Trie;
fn boundary(&mut self) -> usize;
fn done(self) -> Self::Trie;
}
pub trait MergeBuilder: Builder {
fn with_capacity(other1: &Self::Trie, other2: &Self::Trie) -> Self;
fn reserve(&mut self, additional: usize);
fn keys(&self) -> usize;
fn copy_range(
&mut self,
other: &Self::Trie,
lower: usize,
upper: usize,
map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
);
fn copy_range_retain_keys<'a, F>(
&mut self,
other: &'a Self::Trie,
lower: usize,
upper: usize,
filter: &F,
map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
) where
F: Fn(&<<Self::Trie as Trie>::Cursor<'a> as Cursor<'a>>::Key) -> bool;
fn push_merge<'a>(
&'a mut self,
other1: <Self::Trie as Trie>::Cursor<'a>,
other2: <Self::Trie as Trie>::Cursor<'a>,
map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
);
fn push_merge_retain_keys<'a, F>(
&'a mut self,
other1: <Self::Trie as Trie>::Cursor<'a>,
other2: <Self::Trie as Trie>::Cursor<'a>,
filter: &F,
map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
) where
F: Fn(&<<Self::Trie as Trie>::Cursor<'a> as Cursor<'a>>::Key) -> bool;
}
pub trait TupleBuilder: Builder {
fn new(factories: &<Self::Trie as Trie>::Factories) -> Self;
fn with_capacity(factories: &<Self::Trie as Trie>::Factories, capacity: usize) -> Self;
fn reserve_tuples(&mut self, additional: usize);
fn push_tuple(&mut self, tuple: <Self::Trie as Trie>::Item<'_>);
fn push_refs(&mut self, tuple: <Self::Trie as Trie>::ItemRef<'_>);
fn extend_tuples<'a, I>(&'a mut self, tuples: I)
where
I: IntoIterator<Item = <Self::Trie as Trie>::Item<'a>>,
{
let tuples = tuples.into_iter();
let (lower, upper) = tuples.size_hint();
self.reserve_tuples(upper.unwrap_or(lower));
for tuple in tuples {
self.push_tuple(tuple);
}
}
fn tuples(&self) -> usize;
}
pub trait Cursor<'s> {
type Item<'k>
where
Self: 'k;
type Key: ?Sized;
type ValueCursor: Cursor<'s>;
fn keys(&self) -> usize;
fn item(&self) -> Self::Item<'_>;
fn values(&self) -> Self::ValueCursor;
fn step(&mut self);
fn step_reverse(&mut self);
fn seek(&mut self, key: &Self::Key);
fn seek_reverse(&mut self, key: &Self::Key);
fn valid(&self) -> bool;
fn rewind(&mut self);
fn fast_forward(&mut self);
fn position(&self) -> usize;
fn reposition(&mut self, lower: usize, upper: usize);
}
impl Trie for () {
type Item<'a> = ();
type ItemRef<'a> = ();
type Cursor<'s> = ();
type MergeBuilder = ();
type TupleBuilder = ();
type Factories = ();
type LeafKey = ();
fn keys(&self) -> usize {
0
}
fn tuples(&self) -> usize {
0
}
fn cursor_from(&self, _lower: usize, _upper: usize) -> Self::Cursor<'_> {}
fn merge(&self, _other: &Self) -> Self {}
fn approximate_byte_size(&self) -> usize {
0
}
}
impl Builder for () {
type Trie = ();
fn boundary(&mut self) -> usize {
0
}
fn done(self) -> Self::Trie {}
}
impl MergeBuilder for () {
fn with_capacity(_other1: &(), _other2: &()) -> Self {}
fn reserve(&mut self, _additional: usize) {}
fn keys(&self) -> usize {
0
}
fn copy_range(
&mut self,
_other: &Self::Trie,
_lower: usize,
_upper: usize,
_map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
) {
}
fn copy_range_retain_keys<'a, F>(
&mut self,
_other: &'a Self::Trie,
_lower: usize,
_upper: usize,
_filter: &F,
_map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
) where
F: Fn(&<<Self::Trie as Trie>::Cursor<'a> as Cursor<'a>>::Key) -> bool,
{
}
fn push_merge(
&mut self,
_other1: <Self::Trie as Trie>::Cursor<'static>,
_other2: <Self::Trie as Trie>::Cursor<'static>,
_map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
) {
}
fn push_merge_retain_keys<'a, F>(
&mut self,
_other1: <Self::Trie as Trie>::Cursor<'static>,
_other2: <Self::Trie as Trie>::Cursor<'static>,
_filter: &F,
_map_func: Option<&dyn Fn(&mut <<Self as Builder>::Trie as Trie>::LeafKey)>,
) where
F: Fn(&<<Self::Trie as Trie>::Cursor<'a> as Cursor<'a>>::Key) -> bool,
{
}
}
impl TupleBuilder for () {
fn new(_vtables: &()) -> Self {}
fn with_capacity(_vtables: &(), _capacity: usize) -> Self {}
fn reserve_tuples(&mut self, _additional: usize) {}
fn push_tuple(&mut self, _tuple: <Self::Trie as Trie>::Item<'_>) {}
fn push_refs(&mut self, _tuple: <Self::Trie as Trie>::ItemRef<'_>) {}
fn tuples(&self) -> usize {
0
}
}
impl Cursor<'_> for () {
type Key = ();
type Item<'k> = &'k ();
type ValueCursor = ();
fn keys(&self) -> usize {
0
}
fn item(&self) -> Self::Item<'_> {
&()
}
fn values(&self) {}
fn step(&mut self) {}
fn seek(&mut self, _key: &Self::Key) {}
fn valid(&self) -> bool {
false
}
fn rewind(&mut self) {}
fn position(&self) -> usize {
0
}
fn reposition(&mut self, _lower: usize, _upper: usize) {}
fn step_reverse(&mut self) {}
fn seek_reverse(&mut self, _key: &Self::Key) {}
fn fast_forward(&mut self) {}
}