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