Skip to main content

worktable/index/table_index/
mod.rs

1use 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}