Implement Hash for Dynamic.
This commit is contained in:
parent
41c815f355
commit
8e5a53bc0d
@ -836,6 +836,7 @@ pub struct FloatWrapper(pub FLOAT);
|
|||||||
impl Hash for FloatWrapper {
|
impl Hash for FloatWrapper {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
TypeId::of::<FLOAT>().hash(state);
|
||||||
state.write(&self.0.to_le_bytes());
|
state.write(&self.0.to_le_bytes());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ use crate::stdlib::{
|
|||||||
any::{type_name, Any, TypeId},
|
any::{type_name, Any, TypeId},
|
||||||
boxed::Box,
|
boxed::Box,
|
||||||
fmt,
|
fmt,
|
||||||
|
hash::{Hash, Hasher},
|
||||||
ops::{Deref, DerefMut},
|
ops::{Deref, DerefMut},
|
||||||
string::{String, ToString},
|
string::{String, ToString},
|
||||||
};
|
};
|
||||||
@ -361,6 +362,39 @@ impl Dynamic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Hash for Dynamic {
|
||||||
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||||
|
match &self.0 {
|
||||||
|
Union::Unit(_) => ().hash(state),
|
||||||
|
Union::Bool(value) => value.hash(state),
|
||||||
|
Union::Str(s) => s.hash(state),
|
||||||
|
Union::Char(ch) => ch.hash(state),
|
||||||
|
Union::Int(i) => i.hash(state),
|
||||||
|
#[cfg(not(feature = "no_float"))]
|
||||||
|
Union::Float(f) => {
|
||||||
|
TypeId::of::<FLOAT>().hash(state);
|
||||||
|
state.write(&f.to_le_bytes());
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "no_index"))]
|
||||||
|
Union::Array(a) => a.hash(state),
|
||||||
|
#[cfg(not(feature = "no_object"))]
|
||||||
|
Union::Map(m) => m.iter().for_each(|(key, item)| {
|
||||||
|
key.hash(state);
|
||||||
|
item.hash(state);
|
||||||
|
}),
|
||||||
|
|
||||||
|
#[cfg(not(feature = "no_closure"))]
|
||||||
|
#[cfg(not(feature = "sync"))]
|
||||||
|
Union::Shared(cell) => (*cell.borrow()).hash(state),
|
||||||
|
#[cfg(not(feature = "no_closure"))]
|
||||||
|
#[cfg(feature = "sync")]
|
||||||
|
Union::Shared(cell) => (*cell.read().unwrap()).hash(hasher),
|
||||||
|
|
||||||
|
_ => unimplemented!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Map the name of a standard type into a friendly form.
|
/// Map the name of a standard type into a friendly form.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn map_std_type_name(name: &str) -> &str {
|
pub(crate) fn map_std_type_name(name: &str) -> &str {
|
||||||
|
Loading…
Reference in New Issue
Block a user