]>
Commit | Line | Data |
---|---|---|
f20569fa XL |
1 | use std::ops::Deref; |
2 | use std::{hash, ptr}; | |
3 | ||
4 | /// A wrapper around reference that compares and hashes like a pointer. | |
5 | /// Can be used as a key in sets/maps indexed by pointers to avoid `unsafe`. | |
6 | #[derive(Debug)] | |
7 | pub struct PtrKey<'a, T>(pub &'a T); | |
8 | ||
9 | impl<'a, T> Clone for PtrKey<'a, T> { | |
10 | fn clone(&self) -> Self { | |
11 | *self | |
12 | } | |
13 | } | |
14 | ||
15 | impl<'a, T> Copy for PtrKey<'a, T> {} | |
16 | ||
17 | impl<'a, T> PartialEq for PtrKey<'a, T> { | |
18 | fn eq(&self, rhs: &Self) -> bool { | |
19 | ptr::eq(self.0, rhs.0) | |
20 | } | |
21 | } | |
22 | ||
23 | impl<'a, T> Eq for PtrKey<'a, T> {} | |
24 | ||
25 | impl<'a, T> hash::Hash for PtrKey<'a, T> { | |
26 | fn hash<H: hash::Hasher>(&self, hasher: &mut H) { | |
27 | (self.0 as *const T).hash(hasher) | |
28 | } | |
29 | } | |
30 | ||
31 | impl<'a, T> Deref for PtrKey<'a, T> { | |
32 | type Target = T; | |
33 | ||
34 | fn deref(&self) -> &Self::Target { | |
35 | self.0 | |
36 | } | |
37 | } |