Skip to main content

frozen_collections_core/maps/
scan_map.rs

1use 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/// A general-purpose map implemented using linear scanning.
24///
25#[doc = include_str!("../doc_snippets/private_api_warning.md")]
26#[doc = include_str!("../doc_snippets/about.md")]
27///
28#[derive(Clone, Eq)]
29pub struct ScanMap<K, V> {
30    entries: Box<[(K, V)]>,
31}
32
33impl<K, V> ScanMap<K, V> {
34    /// Creates a frozen map.
35    #[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    /// Creates a frozen map.
44    #[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}