1use std::{
2 borrow::Borrow,
3 cmp::Ordering,
4 collections::{BTreeMap, btree_map},
5 fmt,
6 hash::{Hash, Hasher},
7 marker::PhantomData,
8 mem,
9 ops::Bound,
10};
11
12use serde::{
13 Deserialize,
14 Deserializer,
15 Serialize,
16 Serializer,
17 de::{MapAccess, Visitor},
18 ser::SerializeMap,
19};
20
21use crate::{
22 CoordPair,
23 coords::{CoordPairBounds, CoordRange},
24 orientation::Axis,
25};
26
27#[cfg(test)]
28mod test;
29
30#[derive(Debug, Clone)]
31pub struct CoordMap<K, V> {
32 len: usize,
33 inner: CoordPair<BTreeMap<K, BTreeMap<K, V>>>,
34}
35
36impl<K, V> Default for CoordMap<K, V> {
37 fn default() -> Self {
38 Self::new()
39 }
40}
41
42impl<K, V> CoordMap<K, V> {
43 pub fn new() -> Self {
44 Self { len: 0, inner: CoordPair::from_axes(|_| BTreeMap::new()) }
45 }
46
47 pub fn len(&self) -> usize {
48 self.len
49 }
50
51 pub fn is_empty(&self) -> bool {
52 self.len() == 0
53 }
54}
55
56impl<K, V> CoordMap<K, V>
57where
58 K: Ord,
59{
60 pub fn contains_key<Q>(&self, key: CoordPair<&Q>) -> bool
61 where
62 K: Borrow<Q>,
63 Q: Ord,
64 {
65 self.get(key).is_some()
66 }
67
68 pub fn get<Q>(&self, key: CoordPair<&Q>) -> Option<&V>
69 where
70 K: Borrow<Q>,
71 Q: Ord,
72 {
73 let (_, value) = self.get_key_value(key)?;
74 Some(value)
75 }
76
77 pub fn get_key_value<Q>(
78 &self,
79 key: CoordPair<&Q>,
80 ) -> Option<(CoordPair<&K>, &V)>
81 where
82 K: Borrow<Q>,
83 Q: Ord,
84 {
85 let (key_y, entry) = self.inner.y.get_key_value(key.y)?;
86 let (key_x, value) = entry.get_key_value(key.x)?;
87 Some((CoordPair { y: key_y, x: key_x }, value))
88 }
89}
90
91impl<K, V> CoordMap<K, V>
92where
93 K: Ord,
94 V: Clone,
95{
96 pub fn with_mut<Q, F, T>(
97 &mut self,
98 key: CoordPair<&Q>,
99 modifier: F,
100 ) -> Option<T>
101 where
102 K: Borrow<Q>,
103 Q: Ord,
104 F: FnOnce(&mut V) -> T,
105 {
106 let entry_ref = self.inner.y.get_mut(key.y)?.get_mut(key.x)?;
107 let output = modifier(entry_ref);
108 let value = entry_ref.clone();
109 let entry_ref = self
110 .inner
111 .x
112 .get_mut(key.x)
113 .and_then(|entry| entry.get_mut(key.y))
114 .expect("The coord map should be mirrored (with_mut xy)");
115 *entry_ref = value;
116 Some(output)
117 }
118}
119
120impl<K, V> CoordMap<K, V>
121where
122 K: Ord + Clone,
123 V: Clone,
124{
125 pub fn insert(&mut self, key: CoordPair<K>, value: V) -> Option<V> {
126 match self.entry(key) {
127 Entry::Vacant(entry) => {
128 entry.insert(value);
129 None
130 },
131 Entry::Occupied(mut entry) => Some(entry.insert(value)),
132 }
133 }
134}
135
136impl<K, V> CoordMap<K, V>
137where
138 K: Ord,
139{
140 pub fn remove_entry<Q>(
141 &mut self,
142 key: CoordPair<&Q>,
143 ) -> Option<(CoordPair<K>, V)>
144 where
145 K: Borrow<Q>,
146 Q: Ord,
147 {
148 let yx_tree = self.inner.y.get_mut(key.y)?;
149 let (key_x, value) = yx_tree.remove_entry(key.x)?;
150 self.len -= 1;
151 if yx_tree.is_empty() {
152 self.inner.y.remove(key.y);
153 }
154 let xy_tree = self.inner.x.get_mut(key.x).expect(
155 "The coord map should be mirrored (remove_entry get_mut xy)",
156 );
157 let (key_y, _) = xy_tree
158 .remove_entry(key.y)
159 .expect("The coord map should be mirrored (remove_entry xy)");
160 if xy_tree.is_empty() {
161 self.inner.x.remove(key.x);
162 }
163 Some((CoordPair { y: key_y, x: key_x }, value))
164 }
165
166 pub fn remove<Q>(&mut self, key: CoordPair<&Q>) -> Option<V>
167 where
168 K: Borrow<Q>,
169 Q: Ord,
170 {
171 let (_, value) = self.remove_entry(key)?;
172 Some(value)
173 }
174}
175
176impl<K, V> CoordMap<K, V>
177where
178 K: Ord + Clone,
179{
180 pub fn entry(&mut self, key: CoordPair<K>) -> Entry<K, V> {
181 match self
182 .inner
183 .as_mut()
184 .zip2_with(key.clone(), |inner, key| inner.entry(key))
185 {
186 CoordPair {
187 y: btree_map::Entry::Occupied(y_entry),
188 x: btree_map::Entry::Occupied(x_entry),
189 } => {
190 let is_occupied = y_entry.get().contains_key(&key.x);
191 let entries = CoordPair { y: y_entry, x: x_entry };
192 if is_occupied {
193 Entry::Occupied(OccupiedEntry {
194 len: &mut self.len,
195 entries,
196 })
197 } else {
198 Entry::Vacant(VacantEntry {
199 len: &mut self.len,
200 inner: VacantEntryInner::BothNested {
201 key,
202 top_level: entries,
203 },
204 })
205 }
206 },
207
208 CoordPair {
209 y: btree_map::Entry::Vacant(y_entry),
210 x: btree_map::Entry::Vacant(x_entry),
211 } => Entry::Vacant(VacantEntry {
212 len: &mut self.len,
213 inner: VacantEntryInner::BothTopLevel(CoordPair {
214 y: y_entry,
215 x: x_entry,
216 }),
217 }),
218
219 CoordPair {
220 y: btree_map::Entry::Occupied(y_entry),
221 x: btree_map::Entry::Vacant(x_entry),
222 } => Entry::Vacant(VacantEntry {
223 len: &mut self.len,
224 inner: VacantEntryInner::OneNested {
225 selected_axis: Axis::Y,
226 selected_key: key.y,
227 selected_nested: y_entry.into_mut().entry(key.x),
228 unselected_top_level: x_entry,
229 },
230 }),
231
232 CoordPair {
233 y: btree_map::Entry::Vacant(y_entry),
234 x: btree_map::Entry::Occupied(x_entry),
235 } => Entry::Vacant(VacantEntry {
236 len: &mut self.len,
237 inner: VacantEntryInner::OneNested {
238 selected_axis: Axis::X,
239 selected_key: key.x,
240 selected_nested: x_entry.into_mut().entry(key.y),
241 unselected_top_level: y_entry,
242 },
243 }),
244 }
245 }
246}
247
248impl<K, V> CoordMap<K, V>
249where
250 K: Ord,
251{
252 pub fn range<'q, 'a, R, Q>(
253 &'a self,
254 higher_axis: Axis,
255 ranges: R,
256 ) -> Range<'q, 'a, Q, K, V>
257 where
258 R: Into<CoordPairBounds<&'q Q>>,
259 K: Borrow<Q>,
260 Q: Ord + 'q,
261 {
262 let (outer_range, (inner_range_start, inner_range_end)) =
263 ranges.into().shift_rev_to(higher_axis).into_order();
264 let inner_range = (inner_range_start, inner_range_end);
265 let mut outer = self.inner[higher_axis].range(outer_range);
266 let inner_front =
267 outer.next().map(|(key, tree)| (key, tree.range(inner_range)));
268 let inner_back =
269 outer.next_back().map(|(key, tree)| (key, tree.range(inner_range)));
270 Range {
271 higher_axis,
272 inner_range_start,
273 inner_range_end,
274 outer,
275 inner_front,
276 inner_back,
277 }
278 }
279
280 pub fn next_neighbor<Q>(
281 &self,
282 axis: Axis,
283 key: CoordPair<&Q>,
284 ) -> Option<(CoordPair<&K>, &V)>
285 where
286 K: Borrow<Q>,
287 Q: Ord,
288 {
289 let (first_key, second_key) = key.shift_rev_to(axis).into_order();
290 let range = CoordRange::with_order(
291 (Bound::Excluded(first_key), Bound::Unbounded),
292 second_key ..= second_key,
293 );
294 let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
295 iter.next()
296 }
297
298 pub fn last_neighbor<Q>(
299 &self,
300 axis: Axis,
301 key: CoordPair<&Q>,
302 ) -> Option<(CoordPair<&K>, &V)>
303 where
304 K: Borrow<Q>,
305 Q: Ord,
306 {
307 let (first_key, second_key) = key.shift_rev_to(axis).into_order();
308 let range = CoordRange::with_order(
309 (Bound::Excluded(first_key), Bound::Unbounded),
310 second_key ..= second_key,
311 );
312 let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
313 iter.next_back()
314 }
315
316 pub fn prev_neighbor<Q>(
317 &self,
318 axis: Axis,
319 key: CoordPair<&Q>,
320 ) -> Option<(CoordPair<&K>, &V)>
321 where
322 K: Borrow<Q>,
323 Q: Ord,
324 {
325 let (first_key, second_key) = key.shift_rev_to(axis).into_order();
326 let range =
327 CoordRange::with_order(.. first_key, second_key ..= second_key);
328 let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
329 iter.next_back()
330 }
331
332 pub fn first_neighbor<Q>(
333 &self,
334 axis: Axis,
335 key: CoordPair<&Q>,
336 ) -> Option<(CoordPair<&K>, &V)>
337 where
338 K: Borrow<Q>,
339 Q: Ord,
340 {
341 let (first_key, second_key) = key.shift_rev_to(axis).into_order();
342 let range =
343 CoordRange::with_order(.. first_key, second_key ..= second_key);
344 let mut iter = self.range(axis, range.as_bounds().shift_to(axis));
345 iter.next()
346 }
347}
348
349impl<K, V> CoordMap<K, V> {
350 pub fn iter(&self, higher_axis: Axis) -> Iter<K, V> {
351 let mut outer = self.inner[higher_axis].iter();
352 let inner_front = outer.next().map(|(key, tree)| (key, tree.iter()));
353 let inner_back =
354 outer.next_back().map(|(key, tree)| (key, tree.iter()));
355 Iter { axis: higher_axis, outer, inner_front, inner_back }
356 }
357
358 pub fn rows(&self) -> Iter<K, V> {
359 self.iter(Axis::Y)
360 }
361
362 pub fn columns(&self) -> Iter<K, V> {
363 self.iter(Axis::X)
364 }
365
366 pub fn keys(&self, higher_axis: Axis) -> Keys<K, V> {
367 Keys { inner: self.iter(higher_axis) }
368 }
369
370 pub fn key_rows(&self) -> Keys<K, V> {
371 self.keys(Axis::Y)
372 }
373
374 pub fn key_columns(&self) -> Keys<K, V> {
375 self.keys(Axis::X)
376 }
377
378 pub fn values(&self, higher_axis: Axis) -> Values<K, V> {
379 Values { inner: self.iter(higher_axis) }
380 }
381
382 pub fn value_rows(&self) -> Values<K, V> {
383 self.values(Axis::Y)
384 }
385
386 pub fn value_columns(&self) -> Values<K, V> {
387 self.values(Axis::X)
388 }
389}
390
391impl<K, V> CoordMap<K, V>
392where
393 K: Clone,
394{
395 pub fn into_iter_with(self, higher_axis: Axis) -> IntoIter<K, V> {
396 let mut outer = self.inner.extract(higher_axis).into_iter();
397 let inner_front =
398 outer.next().map(|(key, tree)| (key, tree.into_iter()));
399 let inner_back =
400 outer.next_back().map(|(key, tree)| (key, tree.into_iter()));
401 IntoIter { axis: higher_axis, outer, inner_front, inner_back }
402 }
403
404 pub fn into_rows(self) -> IntoIter<K, V> {
405 self.into_iter_with(Axis::Y)
406 }
407
408 pub fn into_columns(self) -> IntoIter<K, V> {
409 self.into_iter_with(Axis::X)
410 }
411
412 pub fn into_keys(self, higher_axis: Axis) -> IntoKeys<K, V> {
413 IntoKeys { inner: self.into_iter_with(higher_axis) }
414 }
415
416 pub fn into_key_rows(self) -> IntoKeys<K, V> {
417 self.into_keys(Axis::Y)
418 }
419
420 pub fn into_key_columns(self) -> IntoKeys<K, V> {
421 self.into_keys(Axis::X)
422 }
423}
424
425impl<K, V> CoordMap<K, V> {
426 pub fn into_values(self, higher_axis: Axis) -> IntoValues<K, V> {
427 let mut outer = self.inner.extract(higher_axis).into_values();
428 let inner_front = outer.next().map(BTreeMap::into_values);
429 let inner_back = outer.next_back().map(BTreeMap::into_values);
430 IntoValues { outer, inner_front, inner_back }
431 }
432
433 pub fn into_value_rows(self) -> IntoValues<K, V> {
434 self.into_values(Axis::Y)
435 }
436
437 pub fn into_value_columns(self) -> IntoValues<K, V> {
438 self.into_values(Axis::X)
439 }
440}
441
442impl<K, V> PartialEq for CoordMap<K, V>
443where
444 K: PartialEq,
445 V: PartialEq,
446{
447 fn eq(&self, other: &Self) -> bool {
448 self.rows().eq(other.rows())
449 }
450}
451
452impl<K, V> Eq for CoordMap<K, V>
453where
454 K: Eq,
455 V: Eq,
456{
457}
458
459impl<K, V> PartialOrd for CoordMap<K, V>
460where
461 K: PartialOrd,
462 V: PartialOrd,
463{
464 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
465 self.rows().partial_cmp(other.rows())
466 }
467}
468
469impl<K, V> Ord for CoordMap<K, V>
470where
471 K: Ord,
472 V: Ord,
473{
474 fn cmp(&self, other: &Self) -> Ordering {
475 self.rows().cmp(other.rows())
476 }
477}
478
479impl<K, V> Hash for CoordMap<K, V>
480where
481 K: Hash,
482 V: Hash,
483{
484 fn hash<H>(&self, state: &mut H)
485 where
486 H: Hasher,
487 {
488 state.write_usize(self.len());
489 for (key, value) in self.rows() {
490 key.hash(state);
491 value.hash(state);
492 }
493 }
494}
495
496impl<K, V> Serialize for CoordMap<K, V>
497where
498 K: Serialize,
499 V: Serialize,
500{
501 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
502 where
503 S: Serializer,
504 {
505 let mut map_serializer = serializer.serialize_map(Some(self.len()))?;
506 for (key, value) in self.rows() {
507 map_serializer.serialize_entry(&key, value)?;
508 }
509 map_serializer.end()
510 }
511}
512
513impl<'de, K, V> Deserialize<'de> for CoordMap<K, V>
514where
515 K: Deserialize<'de> + Ord + Clone,
516 V: Deserialize<'de> + Clone,
517{
518 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
519 where
520 D: Deserializer<'de>,
521 {
522 struct CoordMapVisitor<K0, V0> {
523 _marker: PhantomData<(CoordPair<K0>, V0)>,
524 }
525
526 impl<'de0, K0, V0> Visitor<'de0> for CoordMapVisitor<K0, V0>
527 where
528 K0: Deserialize<'de0> + Ord + Clone,
529 V0: Deserialize<'de0> + Clone,
530 {
531 type Value = CoordMap<K0, V0>;
532
533 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
534 write!(formatter, "a coordinate map")
535 }
536
537 fn visit_map<A>(
538 self,
539 mut access: A,
540 ) -> Result<Self::Value, A::Error>
541 where
542 A: MapAccess<'de0>,
543 {
544 let mut map = CoordMap::new();
545 while let Some((key, value)) = access.next_entry()? {
546 map.insert(key, value);
547 }
548 Ok(map)
549 }
550 }
551
552 deserializer.deserialize_map(CoordMapVisitor { _marker: PhantomData })
553 }
554}
555
556impl<'a, K, V> IntoIterator for &'a CoordMap<K, V> {
557 type Item = (CoordPair<&'a K>, &'a V);
558 type IntoIter = Iter<'a, K, V>;
559
560 fn into_iter(self) -> Self::IntoIter {
561 self.rows()
562 }
563}
564
565impl<K, V> IntoIterator for CoordMap<K, V>
566where
567 K: Clone,
568{
569 type Item = (CoordPair<K>, V);
570 type IntoIter = IntoIter<K, V>;
571
572 fn into_iter(self) -> Self::IntoIter {
573 self.into_rows()
574 }
575}
576
577enum VacantEntryInner<'a, K, V> {
578 BothTopLevel(CoordPair<btree_map::VacantEntry<'a, K, BTreeMap<K, V>>>),
579 BothNested {
580 key: CoordPair<K>,
581 top_level: CoordPair<btree_map::OccupiedEntry<'a, K, BTreeMap<K, V>>>,
582 },
583 OneNested {
584 selected_axis: Axis,
585 selected_key: K,
586 selected_nested: btree_map::Entry<'a, K, V>,
587 unselected_top_level: btree_map::VacantEntry<'a, K, BTreeMap<K, V>>,
588 },
589}
590
591impl<'a, K, V> VacantEntryInner<'a, K, V>
592where
593 K: Ord,
594{
595 pub fn key(&self) -> CoordPair<&K> {
596 match self {
597 Self::BothTopLevel(entries) => {
598 entries.as_ref().map(btree_map::VacantEntry::key)
599 },
600
601 Self::BothNested { key, .. } => key.as_ref(),
602
603 Self::OneNested {
604 selected_key,
605 unselected_top_level,
606 selected_axis,
607 ..
608 } => {
609 CoordPair::with_order(selected_key, unselected_top_level.key())
610 .shift_to(*selected_axis)
611 },
612 }
613 }
614
615 pub fn into_key(self) -> CoordPair<K> {
616 match self {
617 Self::BothTopLevel(entries) => {
618 entries.map(btree_map::VacantEntry::into_key)
619 },
620
621 Self::BothNested { key, .. } => key,
622
623 Self::OneNested {
624 selected_axis,
625 selected_key,
626 unselected_top_level,
627 ..
628 } => CoordPair::with_order(
629 selected_key,
630 unselected_top_level.into_key(),
631 )
632 .shift_to(selected_axis),
633 }
634 }
635
636 pub fn insert(self, value: V) -> &'a V
637 where
638 K: Clone,
639 V: Clone,
640 {
641 match self {
642 Self::BothTopLevel(entries) => {
643 let key = CoordPair {
644 y: entries.y.key().clone(),
645 x: entries.x.key().clone(),
646 };
647 entries
648 .y
649 .insert(BTreeMap::new())
650 .entry(key.x)
651 .or_insert(value.clone());
652 let entry_ref = entries
653 .x
654 .insert(BTreeMap::new())
655 .entry(key.y)
656 .or_insert(value);
657 &*entry_ref
658 },
659
660 Self::BothNested { top_level, key } => {
661 top_level.y.into_mut().entry(key.x).or_insert(value.clone());
662 let entry_ref =
663 top_level.x.into_mut().entry(key.y).or_insert(value);
664 &*entry_ref
665 },
666
667 Self::OneNested {
668 selected_key,
669 selected_nested,
670 unselected_top_level,
671 ..
672 } => {
673 match selected_nested {
674 btree_map::Entry::Vacant(entry) => {
675 entry.insert(value.clone());
676 },
677 btree_map::Entry::Occupied(mut entry) => {
678 entry.insert(value.clone());
679 },
680 }
681 let entry_ref = unselected_top_level
682 .insert(BTreeMap::new())
683 .entry(selected_key)
684 .or_insert(value);
685 &*entry_ref
686 },
687 }
688 }
689}
690
691pub struct VacantEntry<'a, K, V> {
692 len: &'a mut usize,
693 inner: VacantEntryInner<'a, K, V>,
694}
695
696impl<'a, K, V> VacantEntry<'a, K, V>
697where
698 K: Ord,
699{
700 pub fn key(&self) -> CoordPair<&K> {
701 self.inner.key()
702 }
703
704 pub fn into_key(self) -> CoordPair<K> {
705 self.inner.into_key()
706 }
707
708 pub fn insert(self, value: V) -> &'a V
709 where
710 V: Clone,
711 K: Clone,
712 {
713 *self.len += 1;
714 self.inner.insert(value)
715 }
716}
717
718pub struct OccupiedEntry<'a, K, V> {
719 len: &'a mut usize,
720 entries: CoordPair<btree_map::OccupiedEntry<'a, K, BTreeMap<K, V>>>,
721}
722
723impl<'a, K, V> OccupiedEntry<'a, K, V>
724where
725 K: Ord,
726{
727 pub fn key(&self) -> CoordPair<&K> {
728 self.entries.as_ref().map(btree_map::OccupiedEntry::key)
729 }
730
731 pub fn remove_entry(mut self) -> (CoordPair<K>, V)
732 where
733 K: Clone,
734 {
735 *self.len -= 1;
736 let value = self.entries.y.get_mut().remove(self.entries.x.key());
737 self.entries.x.get_mut().remove(self.entries.y.key());
738 let keys = self.entries.map(|entry| {
739 if entry.get().is_empty() {
740 let (key, _) = entry.remove_entry();
741 key
742 } else {
743 entry.key().clone()
744 }
745 });
746 (keys, value.expect("The coord map should be mirrored (remove entry)"))
747 }
748
749 pub fn get(&self) -> &V {
750 self.entries
751 .y
752 .get()
753 .get(self.entries.x.key())
754 .expect("The coord map should be mirrored (get entry value)")
755 }
756
757 pub fn with_mut<F, T>(&mut self, modifier: F) -> T
758 where
759 V: Clone,
760 F: FnOnce(&mut V) -> T,
761 {
762 let entry_ref = self
763 .entries
764 .y
765 .get_mut()
766 .get_mut(self.entries.x.key())
767 .expect("The coord map should be mirrored (with_mut entry yx)");
768 let output = modifier(entry_ref);
769 let value = entry_ref.clone();
770 let entry_ref = self
771 .entries
772 .x
773 .get_mut()
774 .get_mut(self.entries.y.key())
775 .expect("The coord map should be mirrored (with_mut entry xy)");
776 *entry_ref = value;
777 output
778 }
779
780 pub fn into_ref(self) -> &'a V {
781 self.entries
782 .y
783 .into_mut()
784 .get(self.entries.x.key())
785 .expect("The coord map shpuçd be mirrored (into_ref)")
786 }
787
788 pub fn insert(&mut self, value: V) -> V
789 where
790 V: Clone,
791 {
792 let entry_ref =
793 self.entries.y.get_mut().get_mut(self.entries.x.key()).expect(
794 "The coord map should be mirrored (insert entry value yx)",
795 );
796 let old_value = mem::replace(entry_ref, value.clone());
797
798 let entry_ref =
799 self.entries.x.get_mut().get_mut(self.entries.y.key()).expect(
800 "The coord map should be mirrored (insert entry value xy)",
801 );
802 *entry_ref = value;
803
804 old_value
805 }
806
807 pub fn remove(self) -> V
808 where
809 K: Clone,
810 {
811 let (_, value) = self.remove_entry();
812 value
813 }
814}
815
816pub enum Entry<'a, K, V> {
817 Vacant(VacantEntry<'a, K, V>),
818 Occupied(OccupiedEntry<'a, K, V>),
819}
820
821impl<'a, K, V> Entry<'a, K, V>
822where
823 K: Ord,
824{
825 pub fn or_insert(self, default: V) -> &'a V
826 where
827 K: Clone,
828 V: Clone,
829 {
830 match self {
831 Self::Vacant(entry) => entry.insert(default),
832 Self::Occupied(entry) => entry.into_ref(),
833 }
834 }
835
836 pub fn or_insert_with<F>(self, default: F) -> &'a V
837 where
838 K: Clone,
839 V: Clone,
840 F: FnOnce() -> V,
841 {
842 match self {
843 Self::Vacant(entry) => entry.insert(default()),
844 Self::Occupied(entry) => entry.into_ref(),
845 }
846 }
847
848 pub fn or_insert_with_key<F>(self, default: F) -> &'a V
849 where
850 K: Clone,
851 V: Clone,
852 F: FnOnce(CoordPair<&K>) -> V,
853 {
854 match self {
855 Self::Vacant(entry) => {
856 let value = default(entry.key());
857 entry.insert(value)
858 },
859 Self::Occupied(entry) => entry.into_ref(),
860 }
861 }
862
863 pub fn key(&self) -> CoordPair<&K> {
864 match self {
865 Self::Vacant(entry) => entry.key(),
866 Self::Occupied(entry) => entry.key(),
867 }
868 }
869
870 pub fn and_modify<F>(mut self, modifier: F) -> Self
871 where
872 K: Clone,
873 V: Clone,
874 F: FnOnce(&mut V),
875 {
876 match &mut self {
877 Self::Occupied(entry) => {
878 entry.with_mut(modifier);
879 },
880 _ => (),
881 }
882 self
883 }
884
885 pub fn or_default(self) -> &'a V
886 where
887 K: Clone,
888 V: Clone + Default,
889 {
890 self.or_insert_with(Default::default)
891 }
892}
893
894#[derive(Debug, Clone)]
895pub struct Iter<'a, K, V> {
896 axis: Axis,
897 outer: btree_map::Iter<'a, K, BTreeMap<K, V>>,
898 inner_front: Option<(&'a K, btree_map::Iter<'a, K, V>)>,
899 inner_back: Option<(&'a K, btree_map::Iter<'a, K, V>)>,
900}
901
902impl<'a, K, V> Iterator for Iter<'a, K, V> {
903 type Item = (CoordPair<&'a K>, &'a V);
904
905 fn next(&mut self) -> Option<Self::Item> {
906 loop {
907 let (outer_key, mut inner_iter) =
908 self.inner_front.take().or_else(|| self.inner_back.take())?;
909 match inner_iter.next() {
910 Some((inner_key, value)) => {
911 self.inner_front = Some((outer_key, inner_iter));
912 let key = CoordPair::with_order(outer_key, inner_key)
913 .shift_to(self.axis);
914 break Some((key, value));
915 },
916 None => {
917 self.inner_front =
918 self.outer.next().map(|(key, tree)| (key, tree.iter()));
919 },
920 }
921 }
922 }
923
924 fn size_hint(&self) -> (usize, Option<usize>) {
925 let (outer_low, _) = self.outer.size_hint();
926 let front_low = self
927 .inner_front
928 .as_ref()
929 .map(|(_, iter)| iter.size_hint())
930 .map(|(low, _)| low)
931 .unwrap_or_default();
932 let back_low = self
933 .inner_back
934 .as_ref()
935 .map(|(_, iter)| iter.size_hint())
936 .map(|(low, _)| low)
937 .unwrap_or_default();
938 (outer_low + front_low + back_low, None)
939 }
940}
941
942impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
943 fn next_back(&mut self) -> Option<Self::Item> {
944 loop {
945 let (outer_key, mut inner_iter) =
946 self.inner_back.take().or_else(|| self.inner_front.take())?;
947 match inner_iter.next_back() {
948 Some((inner_key, value)) => {
949 self.inner_back = Some((outer_key, inner_iter));
950 let key = CoordPair::with_order(outer_key, inner_key)
951 .shift_to(self.axis);
952 break Some((key, value));
953 },
954 None => {
955 self.inner_back = self
956 .outer
957 .next_back()
958 .map(|(key, tree)| (key, tree.iter()));
959 },
960 }
961 }
962 }
963}
964
965#[derive(Debug, Clone)]
966pub struct Keys<'a, K, V> {
967 inner: Iter<'a, K, V>,
968}
969
970impl<'a, K, V> Iterator for Keys<'a, K, V> {
971 type Item = CoordPair<&'a K>;
972
973 fn next(&mut self) -> Option<Self::Item> {
974 self.inner.next().map(|(key, _)| key)
975 }
976
977 fn size_hint(&self) -> (usize, Option<usize>) {
978 self.inner.size_hint()
979 }
980}
981
982impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
983 fn next_back(&mut self) -> Option<Self::Item> {
984 self.inner.next_back().map(|(key, _)| key)
985 }
986}
987
988#[derive(Debug, Clone)]
989pub struct Values<'a, K, V> {
990 inner: Iter<'a, K, V>,
991}
992
993impl<'a, K, V> Iterator for Values<'a, K, V> {
994 type Item = &'a V;
995
996 fn next(&mut self) -> Option<Self::Item> {
997 self.inner.next().map(|(_, value)| value)
998 }
999
1000 fn size_hint(&self) -> (usize, Option<usize>) {
1001 self.inner.size_hint()
1002 }
1003}
1004
1005impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
1006 fn next_back(&mut self) -> Option<Self::Item> {
1007 self.inner.next_back().map(|(_, value)| value)
1008 }
1009}
1010
1011#[derive(Debug)]
1012pub struct IntoIter<K, V> {
1013 axis: Axis,
1014 outer: btree_map::IntoIter<K, BTreeMap<K, V>>,
1015 inner_front: Option<(K, btree_map::IntoIter<K, V>)>,
1016 inner_back: Option<(K, btree_map::IntoIter<K, V>)>,
1017}
1018
1019impl<K, V> Iterator for IntoIter<K, V>
1020where
1021 K: Clone,
1022{
1023 type Item = (CoordPair<K>, V);
1024
1025 fn next(&mut self) -> Option<Self::Item> {
1026 loop {
1027 let (outer_key, mut inner_iter) =
1028 self.inner_front.take().or_else(|| self.inner_back.take())?;
1029 match inner_iter.next() {
1030 Some((inner_key, value)) => {
1031 self.inner_front = Some((outer_key.clone(), inner_iter));
1032 let key = CoordPair::with_order(outer_key, inner_key)
1033 .shift_to(self.axis);
1034 break Some((key, value));
1035 },
1036 None => {
1037 self.inner_front = self
1038 .outer
1039 .next()
1040 .map(|(key, tree)| (key, tree.into_iter()));
1041 },
1042 }
1043 }
1044 }
1045
1046 fn size_hint(&self) -> (usize, Option<usize>) {
1047 let (outer_low, _) = self.outer.size_hint();
1048 let front_low = self
1049 .inner_front
1050 .as_ref()
1051 .map(|(_, iter)| iter.size_hint())
1052 .map(|(low, _)| low)
1053 .unwrap_or_default();
1054 let back_low = self
1055 .inner_back
1056 .as_ref()
1057 .map(|(_, iter)| iter.size_hint())
1058 .map(|(low, _)| low)
1059 .unwrap_or_default();
1060 (outer_low + front_low + back_low, None)
1061 }
1062}
1063
1064impl<K, V> DoubleEndedIterator for IntoIter<K, V>
1065where
1066 K: Clone,
1067{
1068 fn next_back(&mut self) -> Option<Self::Item> {
1069 loop {
1070 let (outer_key, mut inner_iter) =
1071 self.inner_back.take().or_else(|| self.inner_front.take())?;
1072 match inner_iter.next_back() {
1073 Some((inner_key, value)) => {
1074 self.inner_back = Some((outer_key.clone(), inner_iter));
1075 let key = CoordPair::with_order(outer_key, inner_key)
1076 .shift_to(self.axis);
1077 break Some((key, value));
1078 },
1079 None => {
1080 self.inner_back = self
1081 .outer
1082 .next_back()
1083 .map(|(key, tree)| (key, tree.into_iter()));
1084 },
1085 }
1086 }
1087 }
1088}
1089
1090#[derive(Debug)]
1091pub struct IntoKeys<K, V> {
1092 inner: IntoIter<K, V>,
1093}
1094
1095impl<K, V> Iterator for IntoKeys<K, V>
1096where
1097 K: Clone,
1098{
1099 type Item = CoordPair<K>;
1100
1101 fn next(&mut self) -> Option<Self::Item> {
1102 self.inner.next().map(|(key, _)| key)
1103 }
1104
1105 fn size_hint(&self) -> (usize, Option<usize>) {
1106 self.inner.size_hint()
1107 }
1108}
1109
1110impl<K, V> DoubleEndedIterator for IntoKeys<K, V>
1111where
1112 K: Clone,
1113{
1114 fn next_back(&mut self) -> Option<Self::Item> {
1115 self.inner.next_back().map(|(key, _)| key)
1116 }
1117}
1118
1119#[derive(Debug)]
1120pub struct IntoValues<K, V> {
1121 outer: btree_map::IntoValues<K, BTreeMap<K, V>>,
1122 inner_front: Option<btree_map::IntoValues<K, V>>,
1123 inner_back: Option<btree_map::IntoValues<K, V>>,
1124}
1125
1126impl<K, V> Iterator for IntoValues<K, V> {
1127 type Item = V;
1128
1129 fn next(&mut self) -> Option<Self::Item> {
1130 loop {
1131 let mut inner_iter =
1132 self.inner_front.take().or_else(|| self.inner_back.take())?;
1133 match inner_iter.next() {
1134 Some(value) => {
1135 self.inner_front = Some(inner_iter);
1136 break Some(value);
1137 },
1138 None => {
1139 self.inner_front =
1140 self.outer.next().map(BTreeMap::into_values)
1141 },
1142 }
1143 }
1144 }
1145
1146 fn size_hint(&self) -> (usize, Option<usize>) {
1147 let (outer_low, _) = self.outer.size_hint();
1148 let front_low = self
1149 .inner_front
1150 .as_ref()
1151 .map(|iter| iter.size_hint())
1152 .map(|(low, _)| low)
1153 .unwrap_or_default();
1154 let back_low = self
1155 .inner_back
1156 .as_ref()
1157 .map(|iter| iter.size_hint())
1158 .map(|(low, _)| low)
1159 .unwrap_or_default();
1160 (outer_low + front_low + back_low, None)
1161 }
1162}
1163
1164impl<K, V> DoubleEndedIterator for IntoValues<K, V> {
1165 fn next_back(&mut self) -> Option<Self::Item> {
1166 loop {
1167 let mut inner_iter =
1168 self.inner_back.take().or_else(|| self.inner_front.take())?;
1169 match inner_iter.next_back() {
1170 Some(value) => {
1171 self.inner_back = Some(inner_iter);
1172 break Some(value);
1173 },
1174 None => {
1175 self.inner_back =
1176 self.outer.next_back().map(BTreeMap::into_values)
1177 },
1178 }
1179 }
1180 }
1181}
1182
1183#[derive(Debug, Clone)]
1184pub struct Range<'q, 'a, Q, K, V> {
1185 higher_axis: Axis,
1186 inner_range_start: Bound<&'q Q>,
1187 inner_range_end: Bound<&'q Q>,
1188 outer: btree_map::Range<'a, K, BTreeMap<K, V>>,
1189 inner_front: Option<(&'a K, btree_map::Range<'a, K, V>)>,
1190 inner_back: Option<(&'a K, btree_map::Range<'a, K, V>)>,
1191}
1192
1193impl<'q, 'a, Q, K, V> Iterator for Range<'q, 'a, Q, K, V>
1194where
1195 K: Ord + Borrow<Q>,
1196 Q: Ord,
1197{
1198 type Item = (CoordPair<&'a K>, &'a V);
1199
1200 fn next(&mut self) -> Option<Self::Item> {
1201 loop {
1202 let (outer_key, mut inner_iter) =
1203 self.inner_front.take().or_else(|| self.inner_back.take())?;
1204 match inner_iter.next() {
1205 Some((inner_key, value)) => {
1206 self.inner_front = Some((outer_key, inner_iter));
1207 let key = CoordPair::with_order(outer_key, inner_key)
1208 .shift_to(self.higher_axis);
1209 break Some((key, value));
1210 },
1211 None => {
1212 let inner_range =
1213 (self.inner_range_start, self.inner_range_end);
1214 self.inner_front = self
1215 .outer
1216 .next()
1217 .map(|(key, tree)| (key, tree.range(inner_range)));
1218 },
1219 }
1220 }
1221 }
1222
1223 fn size_hint(&self) -> (usize, Option<usize>) {
1224 let (outer_low, _) = self.outer.size_hint();
1225 let front_low = self
1226 .inner_front
1227 .as_ref()
1228 .map(|(_, iter)| iter.size_hint())
1229 .map(|(low, _)| low)
1230 .unwrap_or_default();
1231 let back_low = self
1232 .inner_back
1233 .as_ref()
1234 .map(|(_, iter)| iter.size_hint())
1235 .map(|(low, _)| low)
1236 .unwrap_or_default();
1237 (outer_low + front_low + back_low, None)
1238 }
1239}
1240
1241impl<'q, 'a, Q, K, V> DoubleEndedIterator for Range<'q, 'a, Q, K, V>
1242where
1243 K: Ord + Borrow<Q>,
1244 Q: Ord,
1245{
1246 fn next_back(&mut self) -> Option<Self::Item> {
1247 loop {
1248 let (outer_key, mut inner_iter) =
1249 self.inner_back.take().or_else(|| self.inner_front.take())?;
1250 match inner_iter.next_back() {
1251 Some((inner_key, value)) => {
1252 self.inner_back = Some((outer_key, inner_iter));
1253 let key = CoordPair::with_order(outer_key, inner_key)
1254 .shift_to(self.higher_axis);
1255 break Some((key, value));
1256 },
1257 None => {
1258 let inner_range =
1259 (self.inner_range_start, self.inner_range_end);
1260 self.inner_back = self
1261 .outer
1262 .next_back()
1263 .map(|(key, tree)| (key, tree.range(inner_range)));
1264 },
1265 }
1266 }
1267 }
1268}