frozen_collections_core/maps/
scan_map.rs1use crate::maps::decl_macros::{
2 common_primary_funcs, debug_trait_funcs, get_disjoint_mut_funcs, index_trait_funcs, into_iterator_trait_funcs,
3 into_iterator_trait_mut_ref_funcs, into_iterator_trait_ref_funcs, len_trait_funcs, map_extras_trait_funcs, map_iteration_trait_funcs,
4 map_query_trait_funcs, partial_eq_trait_funcs, scan_primary_funcs,
5};
6use crate::maps::{IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, Values, ValuesMut};
7use crate::traits::{Len, Map, MapExtras, MapIteration, MapQuery};
8use crate::utils::DeduppedVec;
9use core::fmt::{Debug, Formatter, Result};
10use core::ops::Index;
11use equivalent::Equivalent;
12
13#[cfg(not(feature = "std"))]
14use {alloc::boxed::Box, alloc::vec::Vec};
15
16#[cfg(feature = "serde")]
17use {
18 crate::maps::decl_macros::serialize_trait_funcs,
19 serde::ser::SerializeMap,
20 serde::{Serialize, Serializer},
21};
22
23#[doc = include_str!("../doc_snippets/private_api_warning.md")]
26#[doc = include_str!("../doc_snippets/about.md")]
27#[derive(Clone, Eq)]
29pub struct ScanMap<K, V> {
30 entries: Box<[(K, V)]>,
31}
32
33impl<K, V> ScanMap<K, V> {
34 #[must_use]
36 pub fn new(entries: Vec<(K, V)>) -> Self
37 where
38 K: Eq,
39 {
40 Self::from_dedupped(DeduppedVec::using_eq(entries, |x, y| x.0.eq(&y.0)))
41 }
42
43 #[must_use]
45 pub(crate) fn from_dedupped(entries: DeduppedVec<(K, V)>) -> Self {
46 Self {
47 entries: entries.into_boxed_slice(),
48 }
49 }
50
51 scan_primary_funcs!();
52 common_primary_funcs!(non_const_len, entries);
53}
54
55impl<K, V> Default for ScanMap<K, V> {
56 fn default() -> Self {
57 Self { entries: Box::default() }
58 }
59}
60
61impl<K, V, Q> Map<K, V, Q> for ScanMap<K, V> where Q: ?Sized + Equivalent<K> {}
62
63impl<K, V, Q> MapExtras<K, V, Q> for ScanMap<K, V>
64where
65 Q: ?Sized + Equivalent<K>,
66{
67 map_extras_trait_funcs!();
68}
69
70impl<K, V, Q> MapQuery<Q, V> for ScanMap<K, V>
71where
72 Q: ?Sized + Equivalent<K>,
73{
74 map_query_trait_funcs!();
75}
76
77impl<K, V> MapIteration<K, V> for ScanMap<K, V> {
78 type Iterator<'a>
79 = Iter<'a, K, V>
80 where
81 K: 'a,
82 V: 'a;
83
84 type KeyIterator<'a>
85 = Keys<'a, K, V>
86 where
87 K: 'a,
88 V: 'a;
89
90 type ValueIterator<'a>
91 = Values<'a, K, V>
92 where
93 K: 'a,
94 V: 'a;
95
96 type MutIterator<'a>
97 = IterMut<'a, K, V>
98 where
99 K: 'a,
100 V: 'a;
101
102 type ValueMutIterator<'a>
103 = ValuesMut<'a, K, V>
104 where
105 K: 'a,
106 V: 'a;
107
108 map_iteration_trait_funcs!();
109}
110
111impl<K, V> Len for ScanMap<K, V> {
112 len_trait_funcs!();
113}
114
115impl<Q, K, V> Index<&Q> for ScanMap<K, V>
116where
117 Q: ?Sized + Equivalent<K>,
118{
119 index_trait_funcs!();
120}
121
122impl<K, V> IntoIterator for ScanMap<K, V> {
123 into_iterator_trait_funcs!();
124}
125
126impl<'a, K, V> IntoIterator for &'a ScanMap<K, V> {
127 into_iterator_trait_ref_funcs!();
128}
129
130impl<'a, K, V> IntoIterator for &'a mut ScanMap<K, V> {
131 into_iterator_trait_mut_ref_funcs!();
132}
133
134impl<K, V, MT> PartialEq<MT> for ScanMap<K, V>
135where
136 K: PartialEq,
137 V: PartialEq,
138 MT: MapQuery<K, V>,
139{
140 partial_eq_trait_funcs!();
141}
142
143impl<K, V> Debug for ScanMap<K, V>
144where
145 K: Debug,
146 V: Debug,
147{
148 debug_trait_funcs!();
149}
150
151#[cfg(feature = "serde")]
152impl<K, V> Serialize for ScanMap<K, V>
153where
154 K: Serialize,
155 V: Serialize,
156{
157 serialize_trait_funcs!();
158}