Guest User

Untitled

a guest
May 24th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.89 KB | None | 0 0
  1. use std::collections::HashMap;
  2. use std::sync::{Arc, Weak};
  3. use std::cell::UnsafeCell;
  4. use std::mem;
  5.  
  6. struct ARaw<T> {
  7. map: T,
  8. }
  9.  
  10. type AConstruct = ARaw<UnsafeCell<HashMap<u32, Vec<B>>>>;
  11. type A = ARaw<HashMap<u32, Vec<B>>>;
  12.  
  13. struct B {
  14. weak: Weak<A>, v:u32
  15. }
  16.  
  17.  
  18. impl A {
  19. fn new() -> Arc<AConstruct> {
  20. Arc::new(ARaw { map: UnsafeCell::new(HashMap::new()) })
  21. }
  22. }
  23.  
  24. fn init_a(a: Arc<AConstruct>) -> Arc<A> {
  25. let weak_a: Weak<A> = unsafe { mem::transmute(Arc::downgrade(&a)) };
  26. let b1 = B { weak: weak_a.clone(), v: 1 };
  27. let b2 = B { weak: weak_a.clone(), v: 2 };
  28. {
  29. let mut map = unsafe { &mut *a.map.get() };
  30. let vec = map.entry(0).or_insert(Vec::new());
  31. vec.push(b1);
  32. vec.push(b2);
  33. }
  34. unsafe { mem::transmute(a) }
  35. }
  36.  
  37. fn main() {
  38. let a = A::new();
  39. let a = init_a(a);
  40.  
  41. println!("a = {:?}", a.map.get(&0).unwrap()[1].v);
  42. }
Add Comment
Please, Sign In to add comment