use core::ops::{Bound, RangeBounds};
use dbutils::equivalent::Comparable;
use crate::{
sealed::{WithVersion, WithoutVersion},
types::Kind,
wal::{KeyPointer, ValuePointer},
};
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
pub mod linked;
pub mod arena;
pub mod alternative;
pub trait BaseEntry<'a>: Sized {
type Key: ?Sized;
type Value: ?Sized;
fn key(&self) -> KeyPointer<Self::Key>;
fn next(&mut self) -> Option<Self>;
fn prev(&mut self) -> Option<Self>;
}
pub trait MemtableEntry<'a>: BaseEntry<'a> + WithoutVersion {
fn value(&self) -> ValuePointer<Self::Value>;
}
pub trait VersionedMemtableEntry<'a>: BaseEntry<'a> + WithVersion {
fn value(&self) -> Option<ValuePointer<Self::Value>>;
fn version(&self) -> u64;
}
pub trait BaseTable {
type Key: ?Sized;
type Value: ?Sized;
type Options;
type Error;
type Item<'a>: BaseEntry<'a, Key = Self::Key, Value = Self::Value> + Clone
where
Self: 'a;
type Iterator<'a>: DoubleEndedIterator<Item = Self::Item<'a>>
where
Self: 'a;
type Range<'a, Q, R>: DoubleEndedIterator<Item = Self::Item<'a>>
where
Self: 'a,
R: RangeBounds<Q> + 'a,
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn new(opts: Self::Options) -> Result<Self, Self::Error>
where
Self: Sized;
fn insert(
&self,
version: Option<u64>,
kp: KeyPointer<Self::Key>,
vp: ValuePointer<Self::Value>,
) -> Result<(), Self::Error>
where
KeyPointer<Self::Key>: Ord + 'static;
fn remove(&self, version: Option<u64>, key: KeyPointer<Self::Key>) -> Result<(), Self::Error>
where
KeyPointer<Self::Key>: Ord + 'static;
fn kind() -> Kind;
}
pub trait Memtable: BaseTable
where
for<'a> Self::Item<'a>: MemtableEntry<'a>,
{
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn upper_bound<Q>(&self, bound: Bound<&Q>) -> Option<Self::Item<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn lower_bound<Q>(&self, bound: Bound<&Q>) -> Option<Self::Item<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn first(&self) -> Option<Self::Item<'_>>
where
KeyPointer<Self::Key>: Ord;
fn last(&self) -> Option<Self::Item<'_>>
where
KeyPointer<Self::Key>: Ord;
fn get<Q>(&self, key: &Q) -> Option<Self::Item<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn contains<Q>(&self, key: &Q) -> bool
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn iter(&self) -> Self::Iterator<'_>;
fn range<'a, Q, R>(&'a self, range: R) -> Self::Range<'a, Q, R>
where
R: RangeBounds<Q> + 'a,
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
}
pub trait MultipleVersionMemtable: BaseTable
where
for<'a> Self::Item<'a>: VersionedMemtableEntry<'a>,
{
type VersionedItem<'a>: VersionedMemtableEntry<'a, Key = Self::Key, Value = Self::Value> + Clone
where
KeyPointer<Self::Key>: 'a,
Self: 'a;
type IterAll<'a>: DoubleEndedIterator<Item = Self::VersionedItem<'a>>
where
KeyPointer<Self::Key>: 'a,
Self: 'a;
type RangeAll<'a, Q, R>: DoubleEndedIterator<Item = Self::VersionedItem<'a>>
where
KeyPointer<Self::Key>: 'a,
Self: 'a,
R: RangeBounds<Q> + 'a,
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn maximum_version(&self) -> u64;
fn minimum_version(&self) -> u64;
fn may_contain_version(&self, version: u64) -> bool;
fn upper_bound<Q>(&self, version: u64, bound: Bound<&Q>) -> Option<Self::Item<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn upper_bound_versioned<Q>(
&self,
version: u64,
bound: Bound<&Q>,
) -> Option<Self::VersionedItem<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn lower_bound<Q>(&self, version: u64, bound: Bound<&Q>) -> Option<Self::Item<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn lower_bound_versioned<Q>(
&self,
version: u64,
bound: Bound<&Q>,
) -> Option<Self::VersionedItem<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn first(&self, version: u64) -> Option<Self::Item<'_>>
where
KeyPointer<Self::Key>: Ord;
fn first_versioned(&self, version: u64) -> Option<Self::VersionedItem<'_>>
where
KeyPointer<Self::Key>: Ord;
fn last(&self, version: u64) -> Option<Self::Item<'_>>
where
KeyPointer<Self::Key>: Ord;
fn last_versioned(&self, version: u64) -> Option<Self::VersionedItem<'_>>
where
KeyPointer<Self::Key>: Ord;
fn get<Q>(&self, version: u64, key: &Q) -> Option<Self::Item<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn get_versioned<Q>(&self, version: u64, key: &Q) -> Option<Self::VersionedItem<'_>>
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn contains<Q>(&self, version: u64, key: &Q) -> bool
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn contains_versioned<Q>(&self, version: u64, key: &Q) -> bool
where
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn iter(&self, version: u64) -> Self::Iterator<'_>;
fn iter_all_versions(&self, version: u64) -> Self::IterAll<'_>;
fn range<'a, Q, R>(&'a self, version: u64, range: R) -> Self::Range<'a, Q, R>
where
R: RangeBounds<Q> + 'a,
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
fn range_all_versions<'a, Q, R>(&'a self, version: u64, range: R) -> Self::RangeAll<'a, Q, R>
where
R: RangeBounds<Q> + 'a,
Q: ?Sized + Comparable<KeyPointer<Self::Key>>;
}