Skip to main content

freya_core/
diff_key.rs

1use std::{
2    hash::Hash,
3    rc::Rc,
4};
5#[derive(PartialEq, Hash, Eq, Clone, Debug, Default)]
6pub enum DiffKey {
7    Root,
8    U64(u64),
9    DefaultU64(u64),
10    #[default]
11    None,
12}
13
14impl DiffKey {
15    pub fn or(self, other: DiffKey) -> Self {
16        match self {
17            Self::None => other,
18            _ => self,
19        }
20    }
21
22    pub fn new_rc<T: ?Sized>(rc: &Rc<T>) -> Self {
23        use std::hash::Hasher;
24        let mut hasher = std::hash::DefaultHasher::default();
25        Rc::as_ptr(rc).hash(&mut hasher);
26        DiffKey::U64(hasher.finish())
27    }
28}
29
30impl<T: std::hash::Hash> From<&T> for DiffKey {
31    fn from(value: &T) -> Self {
32        use std::hash::Hasher;
33        let mut hasher = std::hash::DefaultHasher::default();
34        value.hash(&mut hasher);
35        DiffKey::U64(hasher.finish())
36    }
37}
38
39impl<A, R> From<fn(&A) -> R> for DiffKey {
40    fn from(value: fn(&A) -> R) -> Self {
41        Self::DefaultU64(value as *const () as u64)
42    }
43}
44
45#[allow(coherence_leak_check)]
46impl<A, R> From<fn(A) -> R> for DiffKey {
47    fn from(value: fn(A) -> R) -> Self {
48        Self::DefaultU64(value as *const () as u64)
49    }
50}
51
52impl<R> From<fn() -> R> for DiffKey {
53    fn from(value: fn() -> R) -> Self {
54        Self::DefaultU64(value as *const () as u64)
55    }
56}