Enable cloning EntityHashMap and PreHashMap (#11178)

# Objective

- `EntityHashMap`, `EntityHashSet` and `PreHashMap` are currently not
Cloneable because of a missing trivial `Clone` bound for `EntityHash`
and `PreHash`. This PR makes them Cloneable.

(the parent struct `hashbrown::HashMap` requires the `HashBuilder` to be
`Clone` for the `HashMap` to be `Clone`, see:
https://github.com/rust-lang/hashbrown/blob/master/src/map.rs#L195)


## Solution

- Add a `Clone` bound to `PreHash` and `EntityHash`

---------

Co-authored-by: Charles Bournhonesque <cbournhonesque@snapchat.com>
This commit is contained in:
Charles Bournhonesque 2024-01-02 13:11:47 -05:00 committed by GitHub
parent 536a7bd810
commit ab10e85558
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -189,7 +189,7 @@ impl<V: Clone, H> Clone for Hashed<V, H> {
impl<V: Eq, H> Eq for Hashed<V, H> {}
/// A [`BuildHasher`] that results in a [`PassHasher`].
#[derive(Default)]
#[derive(Default, Clone)]
pub struct PassHash;
impl BuildHasher for PassHash {
@ -251,7 +251,7 @@ impl<K: Hash + Eq + PartialEq + Clone, V> PreHashMapExt<K, V> for PreHashMap<K,
}
/// A [`BuildHasher`] that results in a [`EntityHasher`].
#[derive(Default)]
#[derive(Default, Clone)]
pub struct EntityHash;
impl BuildHasher for EntityHash {
@ -415,3 +415,22 @@ macro_rules! detailed_trace {
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_clone_entity_hash_map() {
let map = EntityHashMap::<u64, usize>::default();
// This should compile
let _ = map.clone();
}
#[test]
fn test_clone_pre_hash_map() {
let map = PreHashMap::<u64, usize>::default();
// This should compile
let _ = map.clone();
}
}