frozen_collections_core/inline_maps/
inline_hash_map_no_collisions.rs

1use crate::hash_tables::InlineHashTableNoCollisions;
2use crate::hashers::BridgeHasher;
3use crate::maps::decl_macros::{
4    common_primary_funcs, debug_trait_funcs, get_disjoint_mut_funcs, hash_primary_funcs, index_trait_funcs, into_iterator_trait_funcs,
5    into_iterator_trait_mut_ref_funcs, into_iterator_trait_ref_funcs, len_trait_funcs, map_extras_trait_funcs, map_iteration_trait_funcs,
6    map_query_trait_funcs, partial_eq_trait_funcs,
7};
8use crate::maps::{IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, Values, ValuesMut};
9use crate::traits::{CollectionMagnitude, Hasher, Len, Map, MapExtras, MapIteration, MapQuery, SmallCollection};
10use core::fmt::{Debug, Formatter, Result};
11use core::ops::Index;
12use equivalent::Equivalent;
13
14#[cfg(feature = "serde")]
15use {
16    crate::maps::decl_macros::serialize_trait_funcs,
17    serde::ser::SerializeMap,
18    serde::{Serialize, Serializer},
19};
20
21/// A general-purpose map implemented using a hash table.
22///
23#[doc = include_str!("../doc_snippets/private_api_warning.md")]
24#[doc = include_str!("../doc_snippets/about.md")]
25#[doc = include_str!("../doc_snippets/hash_warning.md")]
26///
27/// # Type Parameters
28///
29/// - `K`: The key type.
30/// - `V`: The value type.
31/// - `CM`: The magnitude of the map, one of [`SmallCollection`](SmallCollection), [`MediumCollection`](crate::traits::MediumCollection), or [`LargeCollection`](crate::traits::LargeCollection).
32/// - `SZ`: The number of entries in the map.
33/// - `NHS`: The number of hash table slots.
34/// - `H`: The hasher to generate hash codes.
35#[derive(Clone)]
36pub struct InlineHashMapNoCollisions<K, V, const SZ: usize, const NHS: usize, CM = SmallCollection, H = BridgeHasher> {
37    entries: InlineHashTableNoCollisions<(K, V), SZ, NHS, CM>,
38    hasher: H,
39}
40
41impl<K, V, const SZ: usize, const NHS: usize, CM, H> InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
42where
43    CM: CollectionMagnitude,
44{
45    /// Creates a frozen map.
46    #[must_use]
47    pub const fn new_raw(table: InlineHashTableNoCollisions<(K, V), SZ, NHS, CM>, hasher: H) -> Self {
48        Self { entries: table, hasher }
49    }
50
51    hash_primary_funcs!();
52    common_primary_funcs!(const_len, entries entries);
53}
54
55impl<K, V, Q, const SZ: usize, const NHS: usize, CM, H> Map<K, V, Q> for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
56where
57    CM: CollectionMagnitude,
58    Q: ?Sized + Equivalent<K>,
59    H: Hasher<Q>,
60{
61}
62
63impl<K, V, Q, const SZ: usize, const NHS: usize, CM, H> MapExtras<K, V, Q> for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
64where
65    CM: CollectionMagnitude,
66    Q: ?Sized + Equivalent<K>,
67    H: Hasher<Q>,
68{
69    map_extras_trait_funcs!();
70}
71
72impl<K, V, Q, const SZ: usize, const NHS: usize, CM, H> MapQuery<Q, V> for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
73where
74    CM: CollectionMagnitude,
75    Q: ?Sized + Equivalent<K>,
76    H: Hasher<Q>,
77{
78    map_query_trait_funcs!();
79}
80
81impl<K, V, const SZ: usize, const NHS: usize, CM, H> MapIteration<K, V> for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
82where
83    CM: CollectionMagnitude,
84{
85    type Iterator<'a>
86        = Iter<'a, K, V>
87    where
88        K: 'a,
89        V: 'a,
90        CM: 'a,
91        H: 'a;
92
93    type KeyIterator<'a>
94        = Keys<'a, K, V>
95    where
96        K: 'a,
97        V: 'a,
98        CM: 'a,
99        H: 'a;
100
101    type ValueIterator<'a>
102        = Values<'a, K, V>
103    where
104        K: 'a,
105        V: 'a,
106        CM: 'a,
107        H: 'a;
108
109    type MutIterator<'a>
110        = IterMut<'a, K, V>
111    where
112        K: 'a,
113        V: 'a,
114        CM: 'a,
115        H: 'a;
116
117    type ValueMutIterator<'a>
118        = ValuesMut<'a, K, V>
119    where
120        K: 'a,
121        V: 'a,
122        CM: 'a,
123        H: 'a;
124
125    map_iteration_trait_funcs!();
126}
127
128impl<K, V, const SZ: usize, const NHS: usize, CM, H> Len for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
129where
130    CM: CollectionMagnitude,
131{
132    len_trait_funcs!();
133}
134
135impl<Q, K, V, const SZ: usize, const NHS: usize, CM, H> Index<&Q> for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
136where
137    CM: CollectionMagnitude,
138    Q: ?Sized + Equivalent<K>,
139    H: Hasher<Q>,
140{
141    index_trait_funcs!();
142}
143
144impl<K, V, const SZ: usize, const NHS: usize, CM, H> IntoIterator for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
145where
146    CM: CollectionMagnitude,
147{
148    into_iterator_trait_funcs!();
149}
150
151impl<'a, K, V, const SZ: usize, const NHS: usize, CM, H> IntoIterator for &'a InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
152where
153    CM: CollectionMagnitude,
154{
155    into_iterator_trait_ref_funcs!();
156}
157
158impl<'a, K, V, const SZ: usize, const NHS: usize, CM, H> IntoIterator for &'a mut InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
159where
160    CM: CollectionMagnitude,
161{
162    into_iterator_trait_mut_ref_funcs!();
163}
164
165impl<K, V, MT, const SZ: usize, const NHS: usize, CM, H> PartialEq<MT> for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
166where
167    K: PartialEq,
168    V: PartialEq,
169    CM: CollectionMagnitude,
170    MT: MapQuery<K, V>,
171    H: Hasher<K>,
172{
173    partial_eq_trait_funcs!();
174}
175
176impl<K, V, const SZ: usize, const NHS: usize, CM, H> Eq for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
177where
178    K: Eq,
179    CM: CollectionMagnitude,
180    V: Eq,
181    H: Hasher<K>,
182{
183}
184
185impl<K, V, const SZ: usize, const NHS: usize, CM, H> Debug for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
186where
187    K: Debug,
188    V: Debug,
189    CM: CollectionMagnitude,
190{
191    debug_trait_funcs!();
192}
193
194#[cfg(feature = "serde")]
195impl<K, V, const SZ: usize, const NHS: usize, CM, H> Serialize for InlineHashMapNoCollisions<K, V, SZ, NHS, CM, H>
196where
197    K: Serialize,
198    V: Serialize,
199    CM: CollectionMagnitude,
200{
201    serialize_trait_funcs!();
202}