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