immutable_chunkmap/map.rs
1use crate::avl::{Iter, IterMut, Tree, WeakTree};
2pub use crate::chunk::DEFAULT_SIZE;
3use core::{
4 borrow::Borrow,
5 cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd},
6 default::Default,
7 fmt::{self, Debug, Formatter},
8 hash::{Hash, Hasher},
9 iter::FromIterator,
10 ops::{Index, IndexMut, RangeBounds, RangeFull},
11};
12
13#[cfg(feature = "serde")]
14use serde::{
15 de::{MapAccess, Visitor},
16 ser::SerializeMap,
17 Deserialize, Deserializer, Serialize, Serializer,
18};
19
20#[cfg(feature = "serde")]
21use core::marker::PhantomData;
22
23#[cfg(feature = "rayon")]
24use rayon::{
25 iter::{FromParallelIterator, IntoParallelIterator},
26 prelude::*,
27};
28
29/// This Map uses a similar strategy to BTreeMap to ensure cache
30/// efficient performance on modern hardware while still providing
31/// log(N) get, insert, and remove operations.
32///
33/// For good performance, it is very important to understand
34/// that clone is a fundamental operation, it needs to be fast
35/// for your key and data types, because it's going to be
36/// called a lot whenever you change the map.
37///
38/// # Why
39///
40/// 1. Multiple threads can read this structure even while one thread
41/// is updating it. Using a library like arc_swap you can avoid ever
42/// blocking readers.
43///
44/// 2. Snapshotting this structure is free.
45///
46/// # Examples
47/// ```
48/// # extern crate alloc;
49/// use alloc::string::String;
50/// use self::immutable_chunkmap::map::MapM;
51///
52/// let m =
53/// MapM::new()
54/// .insert(String::from("1"), 1).0
55/// .insert(String::from("2"), 2).0
56/// .insert(String::from("3"), 3).0;
57///
58/// assert_eq!(m.get("1"), Option::Some(&1));
59/// assert_eq!(m.get("2"), Option::Some(&2));
60/// assert_eq!(m.get("3"), Option::Some(&3));
61/// assert_eq!(m.get("4"), Option::None);
62///
63/// for (k, v) in &m {
64/// println!("key {}, val: {}", k, v)
65/// }
66/// ```
67#[derive(Clone)]
68pub struct Map<K: Ord + Clone, V: Clone, const SIZE: usize>(Tree<K, V, SIZE>);
69
70/// Map using a smaller chunk size, faster to update, slower to search
71pub type MapS<K, V> = Map<K, V, { DEFAULT_SIZE / 2 }>;
72
73/// Map using the default chunk size, a good balance of update and search
74pub type MapM<K, V> = Map<K, V, DEFAULT_SIZE>;
75
76/// Map using a larger chunk size, faster to search, slower to update
77pub type MapL<K, V> = Map<K, V, { DEFAULT_SIZE * 2 }>;
78
79/// A weak reference to a map.
80#[derive(Clone)]
81pub struct WeakMapRef<K: Ord + Clone, V: Clone, const SIZE: usize>(WeakTree<K, V, SIZE>);
82
83pub type WeakMapRefS<K, V> = WeakMapRef<K, V, { DEFAULT_SIZE / 2 }>;
84pub type WeakMapRefM<K, V> = WeakMapRef<K, V, DEFAULT_SIZE>;
85pub type WeakMapRefL<K, V> = WeakMapRef<K, V, { DEFAULT_SIZE * 2 }>;
86
87impl<K, V, const SIZE: usize> WeakMapRef<K, V, SIZE>
88where
89 K: Ord + Clone,
90 V: Clone,
91{
92 pub fn upgrade(&self) -> Option<Map<K, V, SIZE>> {
93 self.0.upgrade().map(Map)
94 }
95}
96
97impl<K, V, const SIZE: usize> Hash for Map<K, V, SIZE>
98where
99 K: Hash + Ord + Clone,
100 V: Hash + Clone,
101{
102 fn hash<H: Hasher>(&self, state: &mut H) {
103 self.0.hash(state)
104 }
105}
106
107impl<K, V, const SIZE: usize> Default for Map<K, V, SIZE>
108where
109 K: Ord + Clone,
110 V: Clone,
111{
112 fn default() -> Map<K, V, SIZE> {
113 Map::new()
114 }
115}
116
117impl<K, V, const SIZE: usize> PartialEq for Map<K, V, SIZE>
118where
119 K: PartialEq + Ord + Clone,
120 V: PartialEq + Clone,
121{
122 fn eq(&self, other: &Map<K, V, SIZE>) -> bool {
123 self.0 == other.0
124 }
125}
126
127impl<K, V, const SIZE: usize> Eq for Map<K, V, SIZE>
128where
129 K: Eq + Ord + Clone,
130 V: Eq + Clone,
131{
132}
133
134impl<K, V, const SIZE: usize> PartialOrd for Map<K, V, SIZE>
135where
136 K: Ord + Clone,
137 V: PartialOrd + Clone,
138{
139 fn partial_cmp(&self, other: &Map<K, V, SIZE>) -> Option<Ordering> {
140 self.0.partial_cmp(&other.0)
141 }
142}
143
144impl<K, V, const SIZE: usize> Ord for Map<K, V, SIZE>
145where
146 K: Ord + Clone,
147 V: Ord + Clone,
148{
149 fn cmp(&self, other: &Map<K, V, SIZE>) -> Ordering {
150 self.0.cmp(&other.0)
151 }
152}
153
154impl<K, V, const SIZE: usize> Debug for Map<K, V, SIZE>
155where
156 K: Debug + Ord + Clone,
157 V: Debug + Clone,
158{
159 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
160 self.0.fmt(f)
161 }
162}
163
164impl<'a, Q, K, V, const SIZE: usize> Index<&'a Q> for Map<K, V, SIZE>
165where
166 Q: Ord,
167 K: Ord + Clone + Borrow<Q>,
168 V: Clone,
169{
170 type Output = V;
171 fn index(&self, k: &Q) -> &V {
172 self.get(k).expect("element not found for key")
173 }
174}
175
176impl<'a, Q, K, V, const SIZE: usize> IndexMut<&'a Q> for Map<K, V, SIZE>
177where
178 Q: Ord,
179 K: Ord + Clone + Borrow<Q>,
180 V: Clone,
181{
182 fn index_mut(&mut self, k: &'a Q) -> &mut Self::Output {
183 self.get_mut_cow(k).expect("element not found for key")
184 }
185}
186
187impl<K, V, const SIZE: usize> FromIterator<(K, V)> for Map<K, V, SIZE>
188where
189 K: Ord + Clone,
190 V: Clone,
191{
192 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
193 Map::new().insert_many(iter)
194 }
195}
196
197impl<'a, K, V, const SIZE: usize> IntoIterator for &'a Map<K, V, SIZE>
198where
199 K: 'a + Ord + Clone,
200 V: 'a + Clone,
201{
202 type Item = (&'a K, &'a V);
203 type IntoIter = Iter<'a, RangeFull, K, K, V, SIZE>;
204 fn into_iter(self) -> Self::IntoIter {
205 self.0.into_iter()
206 }
207}
208
209#[cfg(feature = "serde")]
210impl<K, V, const SIZE: usize> Serialize for Map<K, V, SIZE>
211where
212 K: Serialize + Clone + Ord,
213 V: Serialize + Clone,
214{
215 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
216 where
217 S: Serializer,
218 {
219 let mut map = serializer.serialize_map(Some(self.len()))?;
220 for (k, v) in self {
221 map.serialize_entry(k, v)?
222 }
223 map.end()
224 }
225}
226
227#[cfg(feature = "serde")]
228struct MapVisitor<K: Clone + Ord, V: Clone, const SIZE: usize> {
229 marker: PhantomData<fn() -> Map<K, V, SIZE>>,
230}
231
232#[cfg(feature = "serde")]
233impl<'a, K, V, const SIZE: usize> Visitor<'a> for MapVisitor<K, V, SIZE>
234where
235 K: Deserialize<'a> + Clone + Ord,
236 V: Deserialize<'a> + Clone,
237{
238 type Value = Map<K, V, SIZE>;
239
240 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
241 formatter.write_str("expected an immutable_chunkmap::Map")
242 }
243
244 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
245 where
246 A: MapAccess<'a>,
247 {
248 let mut t = Map::<K, V, SIZE>::new();
249 while let Some((k, v)) = map.next_entry()? {
250 t.insert_cow(k, v);
251 }
252 Ok(t)
253 }
254}
255
256#[cfg(feature = "serde")]
257impl<'a, K, V, const SIZE: usize> Deserialize<'a> for Map<K, V, SIZE>
258where
259 K: Deserialize<'a> + Clone + Ord,
260 V: Deserialize<'a> + Clone,
261{
262 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
263 where
264 D: Deserializer<'a>,
265 {
266 deserializer.deserialize_map(MapVisitor {
267 marker: PhantomData,
268 })
269 }
270}
271
272#[cfg(feature = "rayon")]
273impl<'a, K, V, const SIZE: usize> IntoParallelIterator for &'a Map<K, V, SIZE>
274where
275 K: 'a + Ord + Clone + Send + Sync,
276 V: Clone + Send + Sync,
277{
278 type Item = (&'a K, &'a V);
279 type Iter = rayon::vec::IntoIter<(&'a K, &'a V)>;
280
281 fn into_par_iter(self) -> Self::Iter {
282 self.into_iter().collect::<Vec<_>>().into_par_iter()
283 }
284}
285
286#[cfg(feature = "rayon")]
287impl<K, V, const SIZE: usize> FromParallelIterator<(K, V)> for Map<K, V, SIZE>
288where
289 K: Ord + Clone + Send + Sync,
290 V: Clone + Send + Sync,
291{
292 fn from_par_iter<I>(i: I) -> Self
293 where
294 I: IntoParallelIterator<Item = (K, V)>,
295 {
296 i.into_par_iter()
297 .fold_with(Map::new(), |mut m, (k, v)| {
298 m.insert_cow(k, v);
299 m
300 })
301 .reduce_with(|m0, m1| m0.union(&m1, |_k, _v0, v1| Some(v1.clone())))
302 .unwrap_or_else(Map::new)
303 }
304}
305
306impl<K, V, const SIZE: usize> Map<K, V, SIZE>
307where
308 K: Ord + Clone,
309 V: Clone,
310{
311 /// Create a new empty map
312 pub fn new() -> Self {
313 Map(Tree::new())
314 }
315
316 /// Create a weak reference to this map
317 pub fn downgrade(&self) -> WeakMapRef<K, V, SIZE> {
318 WeakMapRef(self.0.downgrade())
319 }
320
321 /// Return the number of strong references to this map (see Arc)
322 pub fn strong_count(&self) -> usize {
323 self.0.strong_count()
324 }
325
326 /// Return the number of weak references to this map (see Arc)
327 pub fn weak_count(&self) -> usize {
328 self.0.weak_count()
329 }
330
331 /// This will insert many elements at once, and is
332 /// potentially a lot faster than inserting one by one,
333 /// especially if the data is sorted. It is just a wrapper
334 /// around the more general update_many method.
335 ///
336 /// #Examples
337 ///```
338 /// use self::immutable_chunkmap::map::MapM;
339 ///
340 /// let mut v = vec![(1, 3), (10, 1), (-12, 2), (44, 0), (50, -1)];
341 /// v.sort_unstable_by_key(|&(k, _)| k);
342 ///
343 /// let m = MapM::new().insert_many(v.iter().map(|(k, v)| (*k, *v)));
344 ///
345 /// for (k, v) in &v {
346 /// assert_eq!(m.get(k), Option::Some(v))
347 /// }
348 /// ```
349 pub fn insert_many<E: IntoIterator<Item = (K, V)>>(&self, elts: E) -> Self {
350 Map(self.0.insert_many(elts))
351 }
352
353 /// This will remove many elements at once, and is potentially a
354 /// lot faster than removing elements one by one, especially if
355 /// the data is sorted. It is just a wrapper around the more
356 /// general update_many method.
357 pub fn remove_many<Q, E>(&self, elts: E) -> Self
358 where
359 E: IntoIterator<Item = Q>,
360 Q: Ord,
361 K: Borrow<Q>,
362 {
363 self.update_many(elts.into_iter().map(|q| (q, ())), |_, _, _| None)
364 }
365
366 /// This method updates multiple bindings in one call. Given an
367 /// iterator of an arbitrary type (Q, D), where Q is any borrowed
368 /// form of K, an update function taking Q, D, the current binding
369 /// in the map, if any, and producing the new binding, if any,
370 /// this method will produce a new map with updated bindings of
371 /// many elements at once. It will skip intermediate node
372 /// allocations where possible. If the data in elts is sorted, it
373 /// will be able to skip many more intermediate allocations, and
374 /// can produce a speedup of about 10x compared to
375 /// inserting/updating one by one. In any case it should always be
376 /// faster than inserting elements one by one, even with random
377 /// unsorted keys.
378 ///
379 /// #Examples
380 /// ```
381 /// use core::iter::FromIterator;
382 /// use self::immutable_chunkmap::map::MapM;
383 ///
384 /// let m = MapM::from_iter((0..4).map(|k| (k, k)));
385 /// let m = m.update_many(
386 /// (0..4).map(|x| (x, ())),
387 /// |k, (), cur| cur.map(|(_, c)| (k, c + 1))
388 /// );
389 /// assert_eq!(
390 /// m.into_iter().map(|(k, v)| (*k, *v)).collect::<Vec<_>>(),
391 /// vec![(0, 1), (1, 2), (2, 3), (3, 4)]
392 /// );
393 /// ```
394 pub fn update_many<Q, D, E, F>(&self, elts: E, mut f: F) -> Self
395 where
396 E: IntoIterator<Item = (Q, D)>,
397 Q: Ord,
398 K: Borrow<Q>,
399 F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>,
400 {
401 Map(self.0.update_many(elts, &mut f))
402 }
403
404 /// return a new map with (k, v) inserted into it. If k
405 /// already exists in the old map, the old binding will be
406 /// returned, and the new map will contain the new
407 /// binding. In fact this method is just a wrapper around
408 /// update.
409 pub fn insert(&self, k: K, v: V) -> (Self, Option<V>) {
410 let (root, prev) = self.0.insert(k, v);
411 (Map(root), prev)
412 }
413
414 /// insert in place using copy on write semantics if self is not a
415 /// unique reference to the map. see `update_cow`.
416 pub fn insert_cow(&mut self, k: K, v: V) -> Option<V> {
417 self.0.insert_cow(k, v)
418 }
419
420 /// return a new map with the binding for q, which can be any
421 /// borrowed form of k, updated to the result of f. If f returns
422 /// None, the binding will be removed from the new map, otherwise
423 /// it will be inserted. This function is more efficient than
424 /// calling `get` and then `insert`, since it makes only one tree
425 /// traversal instead of two. This method runs in log(N) time and
426 /// space where N is the size of the map.
427 ///
428 /// # Examples
429 /// ```
430 /// use self::immutable_chunkmap::map::MapM;
431 ///
432 /// let (m, _) = MapM::new().update(0, 0, |k, d, _| Some((k, d)));
433 /// let (m, _) = m.update(1, 1, |k, d, _| Some((k, d)));
434 /// let (m, _) = m.update(2, 2, |k, d, _| Some((k, d)));
435 /// assert_eq!(m.get(&0), Some(&0));
436 /// assert_eq!(m.get(&1), Some(&1));
437 /// assert_eq!(m.get(&2), Some(&2));
438 ///
439 /// let (m, _) = m.update(0, (), |k, (), v| v.map(move |(_, v)| (k, v + 1)));
440 /// assert_eq!(m.get(&0), Some(&1));
441 /// assert_eq!(m.get(&1), Some(&1));
442 /// assert_eq!(m.get(&2), Some(&2));
443 ///
444 /// let (m, _) = m.update(1, (), |_, (), _| None);
445 /// assert_eq!(m.get(&0), Some(&1));
446 /// assert_eq!(m.get(&1), None);
447 /// assert_eq!(m.get(&2), Some(&2));
448 /// ```
449 pub fn update<Q, D, F>(&self, q: Q, d: D, mut f: F) -> (Self, Option<V>)
450 where
451 Q: Ord,
452 K: Borrow<Q>,
453 F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>,
454 {
455 let (root, prev) = self.0.update(q, d, &mut f);
456 (Map(root), prev)
457 }
458
459 /// Perform a copy on write update to the map. In the case that
460 /// self is a unique reference to the map, then the update will be
461 /// performed completly in place. self will be mutated, and no
462 /// previous version will be available. In the case that self has
463 /// a clone, or clones, then only the parts of the map that need
464 /// to be mutated will be copied before the update is
465 /// performed. self will reference the mutated copy, and previous
466 /// versions of the map will not be modified. self will still
467 /// share all the parts of the map that did not need to be mutated
468 /// with any pre existing clones.
469 ///
470 /// COW semantics are a flexible middle way between full
471 /// peristance and full mutability. Needless to say in the case
472 /// where you have a unique reference to the map, using update_cow
473 /// is a lot faster than using update, and a lot more flexible
474 /// than update_many.
475 ///
476 /// Other than copy on write the semanics of this method are
477 /// identical to those of update.
478 ///
479 /// #Examples
480 ///```
481 /// use self::immutable_chunkmap::map::MapM;
482 ///
483 /// let mut m = MapM::new().update(0, 0, |k, d, _| Some((k, d))).0;
484 /// let orig = m.clone();
485 /// m.update_cow(1, 1, |k, d, _| Some((k, d))); // copies the original chunk
486 /// m.update_cow(2, 2, |k, d, _| Some((k, d))); // doesn't copy anything
487 /// assert_eq!(m.len(), 3);
488 /// assert_eq!(orig.len(), 1);
489 /// assert_eq!(m.get(&0), Some(&0));
490 /// assert_eq!(m.get(&1), Some(&1));
491 /// assert_eq!(m.get(&2), Some(&2));
492 /// assert_eq!(orig.get(&0), Some(&0));
493 /// assert_eq!(orig.get(&1), None);
494 /// assert_eq!(orig.get(&2), None);
495 ///```
496 pub fn update_cow<Q, D, F>(&mut self, q: Q, d: D, mut f: F) -> Option<V>
497 where
498 Q: Ord,
499 K: Borrow<Q>,
500 F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>,
501 {
502 self.0.update_cow(q, d, &mut f)
503 }
504
505 /// Merge two maps together. Bindings that exist in both maps will
506 /// be passed to f, which may elect to remove the binding by
507 /// returning None. This function runs in O(log(n) + m) time and
508 /// space, where n is the size of the largest map, and m is the
509 /// number of intersecting chunks. It will never be slower than
510 /// calling update_many on the first map with an iterator over the
511 /// second, and will be significantly faster if the intersection
512 /// is minimal or empty.
513 ///
514 /// # Examples
515 /// ```
516 /// use core::iter::FromIterator;
517 /// use self::immutable_chunkmap::map::MapM;
518 ///
519 /// let m0 = MapM::from_iter((0..10).map(|k| (k, 1)));
520 /// let m1 = MapM::from_iter((10..20).map(|k| (k, 1)));
521 /// let m2 = m0.union(&m1, |_k, _v0, _v1| panic!("no intersection expected"));
522 ///
523 /// for i in 0..20 {
524 /// assert!(m2.get(&i).is_some())
525 /// }
526 ///
527 /// let m3 = MapM::from_iter((5..9).map(|k| (k, 1)));
528 /// let m4 = m3.union(&m2, |_k, v0, v1| Some(v0 + v1));
529 ///
530 /// for i in 0..20 {
531 /// assert!(
532 /// *m4.get(&i).unwrap() ==
533 /// *m3.get(&i).unwrap_or(&0) + *m2.get(&i).unwrap_or(&0)
534 /// )
535 /// }
536 /// ```
537 pub fn union<F>(&self, other: &Map<K, V, SIZE>, mut f: F) -> Self
538 where
539 F: FnMut(&K, &V, &V) -> Option<V>,
540 {
541 Map(Tree::union(&self.0, &other.0, &mut f))
542 }
543
544 /// Produce a map containing the mapping over F of the
545 /// intersection (by key) of two maps. The function f runs on each
546 /// intersecting element, and has the option to omit elements from
547 /// the intersection by returning None, or change the value any
548 /// way it likes. Runs in O(log(N) + M) time and space where N is
549 /// the size of the smallest map, and M is the number of
550 /// intersecting chunks.
551 ///
552 /// # Examples
553 ///```
554 /// use core::iter::FromIterator;
555 /// use self::immutable_chunkmap::map::MapM;
556 ///
557 /// let m0 = MapM::from_iter((0..100000).map(|k| (k, 1)));
558 /// let m1 = MapM::from_iter((50..30000).map(|k| (k, 1)));
559 /// let m2 = m0.intersect(&m1, |_k, v0, v1| Some(v0 + v1));
560 ///
561 /// for i in 0..100000 {
562 /// if i >= 30000 || i < 50 {
563 /// assert!(m2.get(&i).is_none());
564 /// } else {
565 /// assert!(*m2.get(&i).unwrap() == 2);
566 /// }
567 /// }
568 /// ```
569 pub fn intersect<F>(&self, other: &Map<K, V, SIZE>, mut f: F) -> Self
570 where
571 F: FnMut(&K, &V, &V) -> Option<V>,
572 {
573 Map(Tree::intersect(&self.0, &other.0, &mut f))
574 }
575
576 /// Produce a map containing the second map subtracted from the
577 /// first. The function F is called for each intersecting element,
578 /// and ultimately decides whether it appears in the result, for
579 /// example, to compute a classical set diff, the function should
580 /// always return None.
581 ///
582 /// # Examples
583 ///```
584 /// use core::iter::FromIterator;
585 /// use self::immutable_chunkmap::map::MapM;
586 ///
587 /// let m0 = MapM::from_iter((0..10000).map(|k| (k, 1)));
588 /// let m1 = MapM::from_iter((50..3000).map(|k| (k, 1)));
589 /// let m2 = m0.diff(&m1, |_k, _v0, _v1| None);
590 ///
591 /// m2.invariant();
592 /// dbg!(m2.len());
593 /// assert!(m2.len() == 10000 - 2950);
594 /// for i in 0..10000 {
595 /// if i >= 3000 || i < 50 {
596 /// assert!(*m2.get(&i).unwrap() == 1);
597 /// } else {
598 /// assert!(m2.get(&i).is_none());
599 /// }
600 /// }
601 /// ```
602 pub fn diff<F>(&self, other: &Map<K, V, SIZE>, mut f: F) -> Self
603 where
604 F: FnMut(&K, &V, &V) -> Option<V>,
605 K: Debug,
606 V: Debug,
607 {
608 Map(Tree::diff(&self.0, &other.0, &mut f))
609 }
610
611 /// lookup the mapping for k. If it doesn't exist return
612 /// None. Runs in log(N) time and constant space. where N
613 /// is the size of the map.
614 pub fn get<'a, Q: ?Sized + Ord>(&'a self, k: &Q) -> Option<&'a V>
615 where
616 K: Borrow<Q>,
617 {
618 self.0.get(k)
619 }
620
621 /// lookup the mapping for k. Return the key. If it doesn't exist
622 /// return None. Runs in log(N) time and constant space. where N
623 /// is the size of the map.
624 pub fn get_key<'a, Q: ?Sized + Ord>(&'a self, k: &Q) -> Option<&'a K>
625 where
626 K: Borrow<Q>,
627 {
628 self.0.get_key(k)
629 }
630
631 /// lookup the mapping for k. Return both the key and the
632 /// value. If it doesn't exist return None. Runs in log(N) time
633 /// and constant space. where N is the size of the map.
634 pub fn get_full<'a, Q: ?Sized + Ord>(&'a self, k: &Q) -> Option<(&'a K, &'a V)>
635 where
636 K: Borrow<Q>,
637 {
638 self.0.get_full(k)
639 }
640
641 /// Get a mutable reference to the value mapped to `k` using copy on write semantics.
642 /// This works as `Arc::make_mut`, it will only clone the parts of the tree that are,
643 /// - required to reach `k`
644 /// - have a strong count > 1
645 ///
646 /// This operation is also triggered by mut indexing on the map, e.g. `&mut m[k]`
647 /// calls `get_mut_cow` on `m`
648 ///
649 /// # Example
650 /// ```
651 /// use core::iter::FromIterator;
652 /// use self::immutable_chunkmap::map::MapM as Map;
653 ///
654 /// let mut m = Map::from_iter((0..100).map(|k| (k, Map::from_iter((0..100).map(|k| (k, 1))))));
655 /// let orig = m.clone();
656 ///
657 /// if let Some(inner) = m.get_mut_cow(&0) {
658 /// if let Some(v) = inner.get_mut_cow(&0) {
659 /// *v += 1
660 /// }
661 /// }
662 ///
663 /// assert_eq!(m.get(&0).and_then(|m| m.get(&0)), Some(&2));
664 /// assert_eq!(orig.get(&0).and_then(|m| m.get(&0)), Some(&1));
665 /// ```
666 pub fn get_mut_cow<'a, Q: ?Sized + Ord>(&'a mut self, k: &Q) -> Option<&'a mut V>
667 where
668 K: Borrow<Q>,
669 {
670 self.0.get_mut_cow(k)
671 }
672
673 /// Same as `get_mut_cow` except if the value is not in the map it will
674 /// first be inserted by calling `f`
675 pub fn get_or_insert_cow<'a, F>(&'a mut self, k: K, f: F) -> &'a mut V
676 where
677 F: FnOnce() -> V,
678 {
679 self.0.get_or_insert_cow(k, f)
680 }
681
682 /// return a new map with the mapping under k removed. If
683 /// the binding existed in the old map return it. Runs in
684 /// log(N) time and log(N) space, where N is the size of
685 /// the map.
686 pub fn remove<Q: Sized + Ord>(&self, k: &Q) -> (Self, Option<V>)
687 where
688 K: Borrow<Q>,
689 {
690 let (t, prev) = self.0.remove(k);
691 (Map(t), prev)
692 }
693
694 /// remove in place using copy on write semantics if self is not a
695 /// unique reference to the map. see `update_cow`.
696 pub fn remove_cow<Q: Sized + Ord>(&mut self, k: &Q) -> Option<V>
697 where
698 K: Borrow<Q>,
699 {
700 self.0.remove_cow(k)
701 }
702
703 /// get the number of elements in the map O(1) time and space
704 pub fn len(&self) -> usize {
705 self.0.len()
706 }
707
708 /// return an iterator over the subset of elements in the
709 /// map that are within the specified range.
710 ///
711 /// The returned iterator runs in O(log(N) + M) time, and
712 /// constant space. N is the number of elements in the
713 /// tree, and M is the number of elements you examine.
714 ///
715 /// if lbound >= ubound the returned iterator will be empty
716 pub fn range<'a, Q, R>(&'a self, r: R) -> Iter<'a, R, Q, K, V, SIZE>
717 where
718 Q: Ord + ?Sized + 'a,
719 K: Borrow<Q>,
720 R: RangeBounds<Q> + 'a,
721 {
722 self.0.range(r)
723 }
724
725 /// return a mutable iterator over the subset of elements in the
726 /// map that are within the specified range. The iterator will
727 /// copy on write the part of the tree that it visits,
728 /// specifically it will be as if you ran get_mut_cow on every
729 /// element you visit.
730 ///
731 /// The returned iterator runs in O(log(N) + M) time, and
732 /// constant space. N is the number of elements in the
733 /// tree, and M is the number of elements you examine.
734 ///
735 /// if lbound >= ubound the returned iterator will be empty
736 pub fn range_mut_cow<'a, Q, R>(&'a mut self, r: R) -> IterMut<'a, R, Q, K, V, SIZE>
737 where
738 Q: Ord + ?Sized + 'a,
739 K: Borrow<Q>,
740 R: RangeBounds<Q> + 'a,
741 {
742 self.0.range_mut_cow(r)
743 }
744
745 /// return a mutable iterator over the entire map. The iterator
746 /// will copy on write every element in the tree, specifically it
747 /// will be as if you ran get_mut_cow on every element.
748 ///
749 /// The returned iterator runs in O(log(N) + M) time, and
750 /// constant space. N is the number of elements in the
751 /// tree, and M is the number of elements you examine.
752 pub fn iter_mut_cow<'a>(&'a mut self) -> IterMut<'a, RangeFull, K, K, V, SIZE> {
753 self.0.iter_mut_cow()
754 }
755}
756
757impl<K, V, const SIZE: usize> Map<K, V, SIZE>
758where
759 K: Ord + Clone,
760 V: Clone + Default,
761{
762 /// Same as `get_mut_cow` except if the value isn't in the map it will
763 /// be added by calling `V::default`
764 pub fn get_or_default_cow<'a>(&'a mut self, k: K) -> &'a mut V {
765 self.get_or_insert_cow(k, V::default)
766 }
767}
768
769impl<K, V, const SIZE: usize> Map<K, V, SIZE>
770where
771 K: Ord + Clone + Debug,
772 V: Clone + Debug,
773{
774 #[allow(dead_code)]
775 pub fn invariant(&self) -> () {
776 self.0.invariant()
777 }
778}