use crate::factory::{FTerm, TermFactory};
use crate::RefTerm;
pub trait TermIndexMap: Default {
type Index: Copy + Eq;
type Factory: TermFactory;
const NULL_INDEX: Self::Index;
fn get_index(&self, t: &RefTerm) -> Option<Self::Index>;
fn make_index(&mut self, t: &RefTerm) -> Self::Index;
fn get_term(&self, i: Self::Index) -> Option<&FTerm<Self::Factory>>;
fn inc_ref(&mut self, i: Self::Index);
fn dec_ref(&mut self, i: Self::Index);
fn shrink_to_fit(&mut self);
fn get_index_for_graph_name(&self, g: Option<&RefTerm>) -> Option<Self::Index> {
match g {
None => Some(Self::NULL_INDEX),
Some(t) => self.get_index(t),
}
}
fn make_index_for_graph_name(&mut self, g: Option<&RefTerm>) -> Self::Index {
match g {
None => Self::NULL_INDEX,
Some(t) => self.make_index(t),
}
}
#[allow(clippy::option_option)]
fn get_graph_name(&self, i: Self::Index) -> Option<Option<&FTerm<Self::Factory>>> {
if i == Self::NULL_INDEX {
Some(None)
} else {
self.get_term(i).map(Some)
}
}
}
#[allow(clippy::cognitive_complexity)]
pub fn assert_term_index_map_works<T: TermIndexMap>(ti: &mut T) {
let t = RefTerm::new_iri("http://example.org/").unwrap();
assert!(ti.get_index(&t).is_none());
let it = ti.make_index(&t);
assert!(ti.get_index(&t).is_some());
assert!(ti.get_index(&t).unwrap() == it);
assert!(ti.get_term(it).is_some());
assert!(ti.get_term(it).unwrap() == &t);
ti.dec_ref(it);
assert!(ti.get_index(&t).is_none());
assert!(ti.get_term(it).is_none());
let it = ti.make_index(&t);
assert!(ti.get_index(&t).is_some());
assert!(ti.get_index(&t).unwrap() == it);
assert!(ti.get_term(it).is_some());
assert!(ti.get_term(it).unwrap() == &t);
let it2 = ti.make_index(&t);
assert!(it == it2);
ti.dec_ref(it);
assert!(ti.get_index(&t).is_some());
assert!(ti.get_index(&t).unwrap() == it);
assert!(ti.get_term(it).is_some());
assert!(ti.get_term(it).unwrap() == &t);
ti.dec_ref(it);
assert!(ti.get_index(&t).is_none());
assert!(ti.get_term(it).is_none());
let it = ti.make_index(&t);
assert!(ti.get_index(&t).is_some());
assert!(ti.get_index(&t).unwrap() == it);
assert!(ti.get_term(it).is_some());
assert!(ti.get_term(it).unwrap() == &t);
ti.inc_ref(it);
ti.dec_ref(it);
assert!(ti.get_index(&t).is_some());
assert!(ti.get_index(&t).unwrap() == it);
assert!(ti.get_term(it).is_some());
assert!(ti.get_term(it).unwrap() == &t);
ti.dec_ref(it);
assert!(ti.get_index(&t).is_none());
assert!(ti.get_term(it).is_none());
let t1 = t;
let t2 = RefTerm::new_iri("http://example.org/2").unwrap();
let it1 = ti.make_index(&t1);
let it2 = ti.make_index(&t2);
assert!(it1 != it2);
ti.dec_ref(it2);
assert!(ti.get_index(&t1).is_some());
assert!(ti.get_index(&t2).is_none());
ti.dec_ref(it1);
assert!(ti.get_index(&t1).is_none());
assert!(ti.get_index(&t2).is_none());
}
#[cfg(test)]
mod test {
}