1use std::collections::btree_map::Entry;
2use std::collections::BTreeMap;
3
4#[derive(Clone, Debug, PartialEq)]
6pub struct Map<K: Ord, V> {
7 pub values: Vec<V>,
9 pub map: BTreeMap<K, usize>,
11}
12impl<K: Ord, V> Map<K, V> {
13 pub fn insert(&mut self, key: K, value: V) -> Result<usize, V> {
16 if let Entry::Vacant(e) = self.map.entry(key) {
17 let index = self.values.len();
18 self.values.push(value);
19 e.insert(index);
20 Ok(index)
21 } else {
22 Err(value)
23 }
24 }
25 pub fn get(&self, key: &K) -> Option<&V> {
27 let index = *self.map.get(key)?;
28 self.values.get(index)
29 }
30 pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
32 let index = *self.map.get(key)?;
33 self.values.get_mut(index)
34 }
35}
36impl<K: Ord, V> Default for Map<K, V> {
37 fn default() -> Self {
38 Self {
39 values: vec![],
40 map: BTreeMap::new(),
41 }
42 }
43}