1#[cfg(all(not(feature = "enhanced-determinism"), feature = "serde-serialize"))]
5use hashbrown::hash_map::HashMap as StdHashMap;
6#[cfg(all(feature = "enhanced-determinism", feature = "serde-serialize"))]
7use indexmap::IndexMap as StdHashMap;
8
9#[cfg(feature = "serde-serialize")]
11pub fn serialize_hashmap_capacity<S: serde::Serializer, K, V, H: core::hash::BuildHasher>(
12 map: &StdHashMap<K, V, H>,
13 s: S,
14) -> Result<S::Ok, S::Error> {
15 s.serialize_u64(map.capacity() as u64)
16}
17
18#[cfg(feature = "serde-serialize")]
20pub fn deserialize_hashmap_capacity<
21 'de,
22 D: serde::Deserializer<'de>,
23 K,
24 V,
25 H: core::hash::BuildHasher + Default,
26>(
27 d: D,
28) -> Result<StdHashMap<K, V, H>, D::Error> {
29 struct CapacityVisitor;
30 impl serde::de::Visitor<'_> for CapacityVisitor {
31 type Value = u64;
32
33 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
34 write!(formatter, "an integer between 0 and 2^64")
35 }
36
37 fn visit_u64<E: serde::de::Error>(self, val: u64) -> Result<Self::Value, E> {
38 Ok(val)
39 }
40 }
41
42 let capacity = d.deserialize_u64(CapacityVisitor)? as usize;
43 Ok(StdHashMap::with_capacity_and_hasher(
44 capacity,
45 Default::default(),
46 ))
47}
48
49#[cfg(feature = "enhanced-determinism")]
54pub type FxHashMap32<K, V> =
55 indexmap::IndexMap<K, V, core::hash::BuildHasherDefault<super::fx_hasher::FxHasher32>>;
56#[cfg(feature = "enhanced-determinism")]
57pub use {self::FxHashMap32 as HashMap, indexmap::map::Entry};
58
59#[cfg(not(feature = "enhanced-determinism"))]
60pub use hashbrown::hash_map::Entry;
61#[cfg(not(feature = "enhanced-determinism"))]
63pub type HashMap<K, V> = hashbrown::hash_map::HashMap<K, V, hashbrown::DefaultHashBuilder>;