1use std::borrow::Borrow;
2use std::hash::Hash;
3use std::ops::Index;
4
5pub(crate) use self::ordered::OrderedMap;
6pub(crate) use self::unordered::UnorderedMap;
7pub(crate) use std::collections::hash_map::Entry;
8
9mod ordered {
10 use indexmap::Equivalent;
11 use std::hash::Hash;
12
13 pub(crate) struct OrderedMap<K, V>(indexmap::IndexMap<K, V>);
14
15 impl<K, V> OrderedMap<K, V> {
16 pub(crate) fn new() -> Self {
17 OrderedMap(indexmap::IndexMap::new())
18 }
19
20 pub(crate) fn keys(&self) -> indexmap::map::Keys<K, V> {
21 self.0.keys()
22 }
23
24 pub(crate) fn contains_key<Q>(&self, key: &Q) -> bool
25 where
26 Q: ?Sized + Hash + Equivalent<K>,
27 {
28 self.0.contains_key(key)
29 }
30 }
31
32 impl<K, V> OrderedMap<K, V>
33 where
34 K: Hash + Eq,
35 {
36 pub(crate) fn insert(&mut self, key: K, value: V) -> Option<V> {
37 self.0.insert(key, value)
38 }
39
40 pub(crate) fn entry(&mut self, key: K) -> indexmap::map::Entry<K, V> {
41 self.0.entry(key)
42 }
43 }
44
45 impl<'a, K, V> IntoIterator for &'a OrderedMap<K, V> {
46 type Item = (&'a K, &'a V);
47 type IntoIter = indexmap::map::Iter<'a, K, V>;
48 fn into_iter(self) -> Self::IntoIter {
49 self.0.iter()
50 }
51 }
52}
53
54mod unordered {
55 use crate::syntax::set::UnorderedSet;
56 use std::borrow::Borrow;
57 use std::collections::hash_map::{Entry, HashMap};
58 use std::hash::Hash;
59
60 pub(crate) struct UnorderedMap<K, V>(HashMap<K, V>);
63
64 impl<K, V> UnorderedMap<K, V> {
65 pub(crate) fn new() -> Self {
66 UnorderedMap(HashMap::new())
67 }
68 }
69
70 impl<K, V> UnorderedMap<K, V>
71 where
72 K: Hash + Eq,
73 {
74 pub(crate) fn insert(&mut self, key: K, value: V) -> Option<V> {
75 self.0.insert(key, value)
76 }
77
78 pub(crate) fn contains_key<Q>(&self, key: &Q) -> bool
79 where
80 K: Borrow<Q>,
81 Q: ?Sized + Hash + Eq,
82 {
83 self.0.contains_key(key)
84 }
85
86 pub(crate) fn get<Q>(&self, key: &Q) -> Option<&V>
87 where
88 K: Borrow<Q>,
89 Q: ?Sized + Hash + Eq,
90 {
91 self.0.get(key)
92 }
93
94 pub(crate) fn entry(&mut self, key: K) -> Entry<K, V> {
95 self.0.entry(key)
96 }
97
98 #[allow(dead_code)] pub(crate) fn remove<Q>(&mut self, key: &Q) -> Option<V>
100 where
101 K: Borrow<Q>,
102 Q: ?Sized + Hash + Eq,
103 {
104 self.0.remove(key)
105 }
106
107 pub(crate) fn keys(&self) -> UnorderedSet<K>
108 where
109 K: Copy,
110 {
111 let mut set = UnorderedSet::new();
112 for key in self.0.keys() {
113 set.insert(*key);
114 }
115 set
116 }
117 }
118}
119
120impl<K, V> Default for UnorderedMap<K, V> {
121 fn default() -> Self {
122 UnorderedMap::new()
123 }
124}
125
126impl<Q, K, V> Index<&Q> for UnorderedMap<K, V>
127where
128 K: Borrow<Q> + Hash + Eq,
129 Q: ?Sized + Hash + Eq,
130{
131 type Output = V;
132
133 fn index(&self, key: &Q) -> &V {
134 self.get(key).unwrap()
135 }
136}