gfxmath_vec2/impls/hash/
hash.rs1
2use core::hash::Hash;
3use crate::Vec2;
4
5const HASH_PRIME: u32 = 31;
6
7impl Hash for Vec2<f32> {
9 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
10 let xu = unsafe { *(&self.x as *const _ as *const u32) };
11 let yu = unsafe { *(&self.y as *const _ as *const u32) };
12
13 xu.hash(state);
14 HASH_PRIME.hash(state);
15 yu.hash(state);
16 HASH_PRIME.hash(state);
17 }
18}
19
20impl Hash for Vec2<f64> {
21 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
22 let xu = unsafe { *(&self.x as *const _ as *const u64) };
23 let yu = unsafe { *(&self.y as *const _ as *const u64) };
24
25 xu.hash(state);
26 HASH_PRIME.hash(state);
27 yu.hash(state);
28 HASH_PRIME.hash(state);
29 }
30}
31impl Hash for Vec2<i32> {
36 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
37 self.x.hash(state);
38 HASH_PRIME.hash(state);
39 self.y.hash(state);
40 HASH_PRIME.hash(state);
41 }
42}
43
44impl Hash for Vec2<i64> {
45 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
46 self.x.hash(state);
47 HASH_PRIME.hash(state);
48 self.y.hash(state);
49 HASH_PRIME.hash(state);
50 }
51}
52impl Hash for Vec2<u32> {
59 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
60 self.x.hash(state);
61 HASH_PRIME.hash(state);
62 self.y.hash(state);
63 HASH_PRIME.hash(state);
64 }
65}
66
67impl Hash for Vec2<u64> {
68 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
69 self.x.hash(state);
70 HASH_PRIME.hash(state);
71 self.y.hash(state);
72 HASH_PRIME.hash(state);
73 }
74}
75#[cfg(test)]
79mod tests {
80 use std::collections::{HashSet};
81
82 use crate::Vec2;
83
84 #[test]
85 fn test_hashset() {
86 let mut set = HashSet::new();
87 let v = Vec2::<f32>::new(2.0, 4.0);
88 set.insert(v.clone());
89 assert!(set.contains(&v));
90
91 let mut set = HashSet::new();
92 let v = Vec2::<f64>::new(2.0, 4.0);
93 set.insert(v.clone());
94 assert!(set.contains(&v));
95 }
96
97 #[test]
98 fn test_hashset_integers() {
99 let mut set = HashSet::new();
100 let v = Vec2::<i32>::new(2, 4);
101 set.insert(v.clone());
102 assert!(set.contains(&v));
103
104 let mut set = HashSet::new();
105 let v = Vec2::<i64>::new(2, 4);
106 set.insert(v.clone());
107 assert!(set.contains(&v));
108 }
109}