use crate::errors::SuffixError;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct SuffixItem<T> {
pub item: SuffixItemType<T>,
pub item_ver: u64,
pub decision_ver: Option<u64>,
pub is_decided: bool,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct SuffixConfig {
pub capacity: usize,
pub prune_start_threshold: Option<usize>,
pub min_size_after_prune: Option<usize>,
}
impl Default for SuffixConfig {
fn default() -> Self {
const DEFAULT_CAPACITY: usize = 100_000;
Self {
capacity: DEFAULT_CAPACITY,
prune_start_threshold: Default::default(),
min_size_after_prune: Default::default(),
}
}
}
#[derive(Debug, Default, Clone)]
pub struct SuffixMeta {
pub head: u64,
pub last_insert_vers: u64,
pub prune_index: Option<usize>,
pub prune_start_threshold: Option<usize>,
pub min_size_after_prune: Option<usize>,
}
pub type SuffixItemType<T> = T;
pub trait SuffixTrait<T> {
fn get(&self, version: u64) -> SuffixResult<Option<SuffixItem<T>>>;
fn get_mut(&mut self, version: u64) -> Option<&mut SuffixItem<T>>;
fn get_meta(&self) -> &SuffixMeta;
fn insert(&mut self, version: u64, message: SuffixItemType<T>) -> SuffixResult<()>;
fn update_decision(&mut self, version: u64, decision_ver: u64) -> SuffixResult<()>;
fn prune_till_index(&mut self, index: usize) -> SuffixResult<Vec<Option<SuffixItem<T>>>>;
fn prune_till_version(&mut self, version: u64) -> SuffixResult<Vec<Option<SuffixItem<T>>>>;
fn remove(&mut self, version: u64) -> SuffixResult<()>;
}
pub type SuffixResult<T> = Result<T, SuffixError>;