worktable/index/table_index/
mod.rs1use std::fmt::Debug;
2use std::hash::Hash;
3
4use data_bucket::Link;
5use indexset::core::multipair::MultiPair;
6use indexset::core::node::NodeLike;
7use indexset::core::pair::Pair;
8
9use crate::util::OffsetEqLink;
10use crate::{IndexMap, IndexMultiMap};
11
12mod cdc;
13pub mod util;
14
15pub use cdc::TableIndexCdc;
16pub use util::convert_change_events;
17
18pub trait TableIndex<T> {
19 fn insert(&self, value: T, link: Link) -> Option<Link>;
20 fn insert_checked(&self, value: T, link: Link) -> Option<()>;
21 fn remove(&self, value: &T, link: Link) -> Option<(T, Link)>;
22}
23
24impl<T, Node> TableIndex<T> for IndexMultiMap<T, OffsetEqLink, Node>
25where
26 T: Debug + Eq + Hash + Clone + Send + Ord,
27 Node: NodeLike<MultiPair<T, OffsetEqLink>> + Send + 'static,
28{
29 fn insert(&self, value: T, link: Link) -> Option<Link> {
30 self.insert(value, OffsetEqLink(link)).map(|l| l.0)
31 }
32
33 fn insert_checked(&self, value: T, link: Link) -> Option<()> {
34 if self.insert(value, OffsetEqLink(link)).is_some() {
35 None
36 } else {
37 Some(())
38 }
39 }
40
41 fn remove(&self, value: &T, link: Link) -> Option<(T, Link)> {
42 self.remove(value, &OffsetEqLink(link))
43 .map(|(v, l)| (v, l.0))
44 }
45}
46
47impl<T, Node> TableIndex<T> for IndexMap<T, OffsetEqLink, Node>
48where
49 T: Debug + Eq + Hash + Clone + Send + Ord,
50 Node: NodeLike<Pair<T, OffsetEqLink>> + Send + 'static,
51{
52 fn insert(&self, value: T, link: Link) -> Option<Link> {
53 self.insert(value, OffsetEqLink(link)).map(|l| l.0)
54 }
55
56 fn insert_checked(&self, value: T, link: Link) -> Option<()> {
57 self.checked_insert(value, OffsetEqLink(link))
58 }
59
60 fn remove(&self, value: &T, _: Link) -> Option<(T, Link)> {
61 self.remove(value).map(|(v, l)| (v, l.0))
62 }
63}