scsys_stores/kv/
mod.rs

1/*
2    Appellation: kv <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5//! Key-Value Store
6
7pub trait KeyValue<K, V> {
8    fn get(&self, key: &K) -> Option<&V>;
9
10    fn insert(&mut self, key: K, value: V) -> Option<V>;
11
12    fn remove(&mut self, key: &K) -> Option<V>;
13}
14
15pub trait OrInsert<K, V> {
16    fn or_insert(&mut self, key: K, value: V) -> &mut V;
17}
18
19macro_rules! impl_kv {
20    ($t:ty, where $($preds:tt)* ) => {
21
22        impl<K, V> KeyValue<K, V> for $t where $($preds)* {
23            fn get(&self, key: &K) -> Option<&V> {
24                <$t>::get(self, &key)
25            }
26
27            fn insert(&mut self, key: K, value: V) -> Option<V> {
28                <$t>::insert(self, key, value)
29            }
30
31            fn remove(&mut self, key: &K) -> Option<V> {
32                <$t>::remove(self, &key)
33            }
34        }
35    };
36}
37
38use std::collections::{BTreeMap, HashMap};
39
40impl_kv!(BTreeMap<K, V>, where K: std::cmp::Ord);
41impl_kv!(HashMap<K, V>, where K: std::cmp::Eq + std::hash::Hash);
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_kv() {
49        let mut map = HashMap::new();
50        map.insert(1, "one");
51        map.insert(2, "two");
52        map.insert(3, "three");
53
54        assert_eq!(map.get(&1), Some(&"one"));
55        assert_eq!(map.get(&2), Some(&"two"));
56        assert_eq!(map.get(&3), Some(&"three"));
57
58        assert_eq!(map.remove(&1), Some("one"));
59        assert_eq!(map.remove(&2), Some("two"));
60        assert_eq!(map.remove(&3), Some("three"));
61
62        assert_eq!(map.get(&1), None);
63        assert_eq!(map.get(&2), None);
64        assert_eq!(map.get(&3), None);
65    }
66}