Advertisement
Guest User

Untitled

a guest
Jul 24th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. trait Trait {}
  2.  
  3. struct Thing {}
  4. impl Trait for Thing {}
  5.  
  6. struct Item {}
  7. impl Trait for Item {}
  8.  
  9. use std::marker::PhantomData;
  10.  
  11. // Wrapper around reference with lifetime attached by adding PhantomData
  12. // Storing just an address is bad, this wrapper should not outlive
  13. // original reference
  14. // Implement Eq and Hash to be able to use it in HashSets/HashMaps
  15. #[derive(PartialEq, Eq, Hash)]
  16. struct HashEqPtr<'a>(usize, PhantomData<&'a ()>);
  17.  
  18. impl<'a> HashEqPtr<'a> {
  19. // Accept Ts which don't have known compile time size.
  20. fn new<T: ?Sized>(t: &'a T) -> Self {
  21. // Cast to raw pointer, cast to thin pointer, then to address
  22. let fat_ptr = t as *const T;
  23. let thin_ptr = fat_ptr as *const ();
  24. let addr = thin_ptr as usize;
  25. println!("new: {:p} fat: {:p} thin: {:p} addr: {:x}", t, fat_ptr, thin_ptr, addr);
  26. HashEqPtr(addr, PhantomData)
  27. }
  28. }
  29.  
  30. fn main() {
  31. let t = Thing {};
  32. let i = Item {};
  33.  
  34. println!("&t: {:p}", &t);
  35. println!("&i: {:p}", &i);
  36.  
  37. let xs: Vec<&Trait> = vec![&t, &i];
  38.  
  39. println!("xs[0]: {:p}", xs[0]);
  40. println!("xs[1]: {:p}", xs[1]);
  41.  
  42. use std::collections::HashSet;
  43. let mut hm: HashSet<HashEqPtr> = HashSet::new();
  44. for x in &xs {
  45. println!("x: {:p}", x);
  46. hm.insert(HashEqPtr::new(x));
  47. }
  48.  
  49. assert_eq!(hm.len(), 2);
  50.  
  51. for x in &xs {
  52. println!("x: {:p}", x);
  53. assert_eq!(hm.contains(&HashEqPtr::new(x)), true);
  54. }
  55.  
  56. // WHAT??
  57. //assert_eq!(hm.contains(&HashEqPtr::new(&t)), true);
  58. //assert_eq!(hm.contains(&HashEqPtr::new(&i)), true);
  59.  
  60. let t2 = Thing {};
  61. assert_eq!(hm.contains(&HashEqPtr::new(&t2)), false);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement