-
Notifications
You must be signed in to change notification settings - Fork 533
/
Copy pathtable.rs
97 lines (77 loc) · 2.19 KB
/
table.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
95
96
97
use {super::*, std::collections::btree_map};
#[derive(Debug, PartialEq, Serialize)]
#[serde(transparent)]
pub(crate) struct Table<'key, V: Keyed<'key>> {
map: BTreeMap<&'key str, V>,
}
impl<'key, V: Keyed<'key>> Table<'key, V> {
pub(crate) fn new() -> Self {
Self {
map: BTreeMap::new(),
}
}
pub(crate) fn insert(&mut self, value: V) {
self.map.insert(value.key(), value);
}
pub(crate) fn len(&self) -> usize {
self.map.len()
}
pub(crate) fn get(&self, key: &str) -> Option<&V> {
self.map.get(key)
}
pub(crate) fn is_empty(&self) -> bool {
self.map.is_empty()
}
pub(crate) fn values(&self) -> btree_map::Values<&'key str, V> {
self.map.values()
}
pub(crate) fn contains_key(&self, key: &str) -> bool {
self.map.contains_key(key)
}
pub(crate) fn keys(&self) -> btree_map::Keys<&'key str, V> {
self.map.keys()
}
pub(crate) fn iter(&self) -> btree_map::Iter<&'key str, V> {
self.map.iter()
}
pub(crate) fn pop(&mut self) -> Option<V> {
let key = self.map.keys().next().copied()?;
self.map.remove(key)
}
pub(crate) fn remove(&mut self, key: &str) -> Option<V> {
self.map.remove(key)
}
}
impl<'key, V: Keyed<'key>> Default for Table<'key, V> {
fn default() -> Self {
Self::new()
}
}
impl<'key, V: Keyed<'key>> FromIterator<V> for Table<'key, V> {
fn from_iter<I: IntoIterator<Item = V>>(iter: I) -> Self {
Self {
map: iter.into_iter().map(|value| (value.key(), value)).collect(),
}
}
}
impl<'key, V: Keyed<'key>> Index<&'key str> for Table<'key, V> {
type Output = V;
#[inline]
fn index(&self, key: &str) -> &V {
self.map.get(key).expect("no entry found for key")
}
}
impl<'key, V: Keyed<'key>> IntoIterator for Table<'key, V> {
type IntoIter = btree_map::IntoIter<&'key str, V>;
type Item = (&'key str, V);
fn into_iter(self) -> btree_map::IntoIter<&'key str, V> {
self.map.into_iter()
}
}
impl<'table, V: Keyed<'table> + 'table> IntoIterator for &'table Table<'table, V> {
type IntoIter = btree_map::Iter<'table, &'table str, V>;
type Item = (&'table &'table str, &'table V);
fn into_iter(self) -> btree_map::Iter<'table, &'table str, V> {
self.map.iter()
}
}