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}