-
Notifications
You must be signed in to change notification settings - Fork 319
/
Copy pathgeneric_containers.rs
94 lines (88 loc) · 2.26 KB
/
generic_containers.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//! **Private** generalizations of containers:
//! - `Map`: `BTreeMap` and `HashMap` (any hasher).
#![cfg(feature = "use_alloc")]
use alloc::collections::BTreeMap;
use alloc::vec::Vec;
#[cfg(feature = "use_std")]
use core::hash::{BuildHasher, Hash};
#[cfg(feature = "use_std")]
use std::collections::HashMap;
pub trait Map {
type Key;
type Value;
fn insert(&mut self, key: Self::Key, value: Self::Value) -> Option<Self::Value>;
fn remove(&mut self, key: &Self::Key) -> Option<Self::Value>;
fn entry_or_default(&mut self, key: Self::Key) -> &mut Self::Value
where
Self::Value: Default;
}
impl<K, V> Map for BTreeMap<K, V>
where
K: Ord,
{
type Key = K;
type Value = V;
fn insert(&mut self, key: K, value: V) -> Option<V> {
self.insert(key, value)
}
fn remove(&mut self, key: &K) -> Option<V> {
self.remove(key)
}
fn entry_or_default(&mut self, key: K) -> &mut V
where
V: Default,
{
self.entry(key).or_default()
}
}
#[cfg(feature = "use_std")]
impl<K, V, S> Map for HashMap<K, V, S>
where
K: Eq + Hash,
S: BuildHasher,
{
type Key = K;
type Value = V;
fn insert(&mut self, key: K, value: V) -> Option<V> {
self.insert(key, value)
}
fn remove(&mut self, key: &K) -> Option<V> {
self.remove(key)
}
fn entry_or_default(&mut self, key: K) -> &mut V
where
V: Default,
{
self.entry(key).or_default()
}
}
impl<K, V> Map for Vec<(K, V)>
where
K: Eq,
{
type Key = K;
type Value = V;
fn insert(&mut self, key: K, value: V) -> Option<V> {
match self.iter_mut().find(|(k, _)| k == &key) {
Some((_, v)) => Some(core::mem::replace(v, value)),
None => {
self.push((key, value));
None
}
}
}
fn remove(&mut self, key: &K) -> Option<V> {
let index = self.iter().position(|(k, _)| k == key)?;
Some(self.swap_remove(index).1)
}
fn entry_or_default(&mut self, key: K) -> &mut V
where
V: Default,
{
let index = self.iter().position(|(k, _)| k == &key).unwrap_or_else(|| {
self.push((key, V::default()));
self.len() - 1
});
&mut self[index].1
}
}