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}