util: Added pointer comparison struct

util::Pointer should be suitable for storing key states in bags like pressed_keys
This commit is contained in:
Dorota Czaplejewicz
2019-10-17 13:59:01 +00:00
parent 29231f7e31
commit 3b6c19401c

View File

@ -1,6 +1,8 @@
/*! Assorted helpers */
use std::collections::HashMap;
use std::rc::Rc;
use std::hash::{ Hash, Hasher };
use std::iter::FromIterator;
pub mod c {
@ -129,3 +131,36 @@ pub fn hash_map_map<K, V, F, K1, V1>(map: HashMap<K, V>, mut f: F)
map.into_iter().map(|(key, value)| f(key, value))
)
}
/// Compares pointers but not internal values of Rc
pub struct Pointer<T>(Rc<T>);
impl<T> Hash for Pointer<T> {
fn hash<H: Hasher>(&self, state: &mut H) {
(&*self.0 as *const T).hash(state);
}
}
impl<T> PartialEq for Pointer<T> {
fn eq(&self, other: &Pointer<T>) -> bool {
Rc::ptr_eq(&self.0, &other.0)
}
}
impl<T> Eq for Pointer<T> {}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashSet;
#[test]
fn check_set() {
let mut s = HashSet::new();
let first = Rc::new(1u32);
s.insert(Pointer(first.clone()));
assert_eq!(s.insert(Pointer(Rc::new(2u32))), true);
assert_eq!(s.remove(&Pointer(first)), true);
}
}