competitive/data_structure/
vec_map.rs1use super::{Container, ContainerEntry, ContainerFactory};
2use std::{
3 fmt::{self, Debug},
4 iter::{FilterMap, Map, repeat_with},
5 marker::PhantomData,
6 mem::replace,
7 slice,
8};
9
10#[derive(Debug, Clone)]
11pub struct VecMapFactory<K, V, F> {
12 key_to_index: F,
13 _marker: PhantomData<fn() -> (K, V)>,
14}
15
16#[derive(Debug, Clone)]
17pub struct FixedVecMapFactory<K, V, F> {
18 key_to_index: F,
19 len: usize,
20 _marker: PhantomData<fn() -> (K, V)>,
21}
22
23#[derive(Debug, Clone)]
24pub struct VecMapFactoryWithCapacity<K, V, F> {
25 key_to_index: F,
26 capacity: usize,
27 _marker: PhantomData<fn() -> (K, V)>,
28}
29
30#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
31pub struct VecMap<const FIXED: bool, K, V, F> {
32 pub data: Vec<Option<(K, V)>>,
33 key_to_index: F,
34}
35
36impl<const FIXED: bool, K, V, F> Debug for VecMap<FIXED, K, V, F>
37where
38 K: Debug,
39 V: Debug,
40{
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 f.debug_map()
43 .entries(self.data.iter().flatten().map(|(k, v): &(K, V)| (k, v)))
44 .finish()
45 }
46}
47
48#[derive(Debug)]
49pub struct Entry<'a, K, V> {
50 key: K,
51 entry: &'a mut Option<(K, V)>,
52}
53
54impl<K, V, F> VecMapFactory<K, V, F> {
55 pub fn new(key_to_index: F) -> Self {
56 Self {
57 key_to_index,
58 _marker: PhantomData,
59 }
60 }
61}
62
63impl<K, V, F> ContainerFactory for VecMapFactory<K, V, F>
64where
65 F: Fn(&K) -> usize + Clone,
66{
67 type Container = VecMap<false, K, V, F>;
68
69 fn create_container(&self) -> Self::Container {
70 VecMap {
71 data: Vec::new(),
72 key_to_index: self.key_to_index.clone(),
73 }
74 }
75}
76
77impl<K, V, F> FixedVecMapFactory<K, V, F> {
78 pub fn new(key_to_index: F, len: usize) -> Self {
79 Self {
80 key_to_index,
81 len,
82 _marker: PhantomData,
83 }
84 }
85}
86
87impl<K, V, F> ContainerFactory for FixedVecMapFactory<K, V, F>
88where
89 F: Fn(&K) -> usize + Clone,
90{
91 type Container = VecMap<true, K, V, F>;
92
93 fn create_container(&self) -> Self::Container {
94 VecMap {
95 data: repeat_with(|| None).take(self.len).collect(),
96 key_to_index: self.key_to_index.clone(),
97 }
98 }
99}
100
101impl<K, V, F> VecMapFactoryWithCapacity<K, V, F> {
102 pub fn new(key_to_index: F, capacity: usize) -> Self {
103 Self {
104 key_to_index,
105 capacity,
106 _marker: PhantomData,
107 }
108 }
109}
110
111impl<K, V, F> ContainerFactory for VecMapFactoryWithCapacity<K, V, F>
112where
113 F: Fn(&K) -> usize + Clone,
114{
115 type Container = VecMap<false, K, V, F>;
116
117 fn create_container(&self) -> Self::Container {
118 VecMap {
119 data: Vec::with_capacity(self.capacity),
120 key_to_index: self.key_to_index.clone(),
121 }
122 }
123}
124
125impl<const FIXED: bool, K, V, F> Container for VecMap<FIXED, K, V, F>
126where
127 F: Fn(&K) -> usize,
128{
129 type Key = K;
130 type Value = V;
131 type Entry<'a>
132 = Entry<'a, K, V>
133 where
134 Self: 'a,
135 Self::Key: 'a,
136 Self::Value: 'a;
137 type Iter<'a>
138 = Map<
139 FilterMap<slice::Iter<'a, Option<(K, V)>>, fn(&Option<(K, V)>) -> Option<&(K, V)>>,
140 fn(&(K, V)) -> (&K, &V),
141 >
142 where
143 Self: 'a,
144 Self::Key: 'a,
145 Self::Value: 'a;
146 type Drain<'a>
147 = FilterMap<slice::IterMut<'a, Option<(K, V)>>, fn(&mut Option<(K, V)>) -> Option<(K, V)>>
148 where
149 Self: 'a,
150 Self::Key: 'a,
151 Self::Value: 'a;
152
153 fn get(&self, key: &Self::Key) -> Option<&Self::Value> {
154 let index = (self.key_to_index)(key);
155 self.data.get(index).and_then(|x| x.as_ref()).map(|x| &x.1)
156 }
157
158 fn get_mut(&mut self, key: &Self::Key) -> Option<&mut Self::Value> {
159 let index = (self.key_to_index)(key);
160 self.data
161 .get_mut(index)
162 .and_then(|x| x.as_mut())
163 .map(|x| &mut x.1)
164 }
165
166 fn insert(&mut self, key: Self::Key, value: Self::Value) -> Option<Self::Value> {
167 let index = (self.key_to_index)(&key);
168 let entry = if FIXED {
169 self.data.get_mut(index).unwrap()
170 } else {
171 if index >= self.data.len() {
172 self.data.resize_with(index + 1, Default::default);
173 }
174 unsafe { self.data.get_unchecked_mut(index) }
175 };
176 match entry {
177 Some((_, v)) => Some(replace(v, value)),
178 entry => {
179 *entry = Some((key, value));
180 None
181 }
182 }
183 }
184
185 fn remove(&mut self, key: &Self::Key) -> Option<Self::Value> {
186 let index = (self.key_to_index)(key);
187 self.data.get_mut(index).and_then(|x| x.take()).map(|x| x.1)
188 }
189
190 fn entry(&mut self, key: Self::Key) -> Self::Entry<'_> {
191 let index = (self.key_to_index)(&key);
192 let entry = if FIXED {
193 self.data.get_mut(index).unwrap()
194 } else {
195 if index >= self.data.len() {
196 self.data.resize_with(index + 1, Default::default);
197 }
198 unsafe { self.data.get_unchecked_mut(index) }
199 };
200 Entry { key, entry }
201 }
202
203 fn iter(&self) -> Self::Iter<'_> {
204 self.data
205 .iter()
206 .filter_map::<_, fn(&Option<(K, V)>) -> Option<&(K, V)>>(Option::as_ref)
207 .map::<_, fn(&(K, V)) -> (&K, &V)>(|(k, v)| (k, v))
208 }
209
210 fn drain(&mut self) -> Self::Drain<'_> {
211 self.data
212 .iter_mut()
213 .filter_map::<_, fn(&mut Option<(K, V)>) -> Option<(K, V)>>(Option::take)
214 }
215}
216
217impl<'a, K, V> ContainerEntry<'a> for Entry<'a, K, V> {
218 type Key = K;
219 type Value = V;
220
221 fn or_default(self) -> &'a mut Self::Value
222 where
223 Self::Value: Default,
224 {
225 match self.entry {
226 Some((_, value)) => value,
227 entry => {
228 *entry = Some((self.key, Default::default()));
229 unsafe { &mut entry.as_mut().unwrap_unchecked().1 }
230 }
231 }
232 }
233
234 fn or_insert(self, default: Self::Value) -> &'a mut Self::Value {
235 match self.entry {
236 Some((_, value)) => value,
237 entry => {
238 *entry = Some((self.key, default));
239 unsafe { &mut entry.as_mut().unwrap_unchecked().1 }
240 }
241 }
242 }
243
244 fn or_insert_with<F>(self, default: F) -> &'a mut Self::Value
245 where
246 F: FnOnce() -> Self::Value,
247 {
248 match self.entry {
249 Some((_, value)) => value,
250 entry => {
251 *entry = Some((self.key, default()));
252 unsafe { &mut entry.as_mut().unwrap_unchecked().1 }
253 }
254 }
255 }
256
257 fn or_insert_with_key<F>(self, default: F) -> &'a mut Self::Value
258 where
259 F: FnOnce(&Self::Key) -> Self::Value,
260 {
261 match self.entry {
262 Some((_, value)) => value,
263 entry => {
264 let default = default(&self.key);
265 *entry = Some((self.key, default));
266 unsafe { &mut entry.as_mut().unwrap_unchecked().1 }
267 }
268 }
269 }
270
271 fn key(&self) -> &Self::Key {
272 &self.key
273 }
274
275 fn and_modify<F>(self, f: F) -> Self
276 where
277 F: FnOnce(&mut Self::Value),
278 {
279 if let Some((_, value)) = self.entry {
280 f(value);
281 }
282 self
283 }
284}
285
286#[cfg(test)]
287mod tests {
288 use super::*;
289
290 #[test]
291 fn test_vec_map_get() {
292 let mut map = VecMapFactory::new(|&x: &usize| x).create_container();
293 map.insert(0, 0);
294 assert_eq!(map.get(&0), Some(&0));
295 assert_eq!(map.get(&1), None);
296 }
297
298 #[test]
299 fn test_vec_map_get_mut() {
300 let mut map = VecMapFactory::new(|&x: &usize| x).create_container();
301 map.insert(0, 0);
302 *map.get_mut(&0).unwrap() += 1;
303 assert_eq!(map.get(&0), Some(&1));
304 }
305
306 #[test]
307 fn test_vec_map_insert() {
308 let mut map = VecMapFactory::new(|&x: &usize| x).create_container();
309 assert_eq!(map.insert(0, 0), None);
310 assert_eq!(map.insert(0, 1), Some(0));
311 assert_eq!(map.get(&0), Some(&1));
312 }
313
314 #[test]
315 fn test_vec_map_remove() {
316 let mut map = VecMapFactory::new(|&x: &usize| x).create_container();
317 map.insert(0, 0);
318 assert_eq!(map.remove(&0), Some(0));
319 assert_eq!(map.remove(&0), None);
320 }
321
322 #[test]
323 fn test_vec_map_entry() {
324 let mut map = VecMapFactory::new(|&x: &usize| x).create_container();
325 map.entry(0).or_insert(0);
326 assert_eq!(*map.entry(0).or_insert(1), 0);
327 assert_eq!(*map.entry(1).and_modify(|e| *e += 1).or_default(), 0);
328 assert_eq!(*map.entry(1).and_modify(|e| *e += 1).or_default(), 1);
329 }
330}