Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.85 KB | None | 0 0
  1. use std::ptr;
  2. use std::marker::PhantomData;
  3. use std::cell::Cell;
  4.  
  5. struct MyCell<T> {
  6. value: T,
  7. _marker: PhantomData<Cell<T>>,
  8. }
  9.  
  10. impl<T: Copy> MyCell<T> {
  11. fn new(value: T) -> Self {
  12. MyCell {
  13. value,
  14. _marker: PhantomData
  15. }
  16. }
  17.  
  18. fn get(&self) -> T {
  19. self.value
  20. }
  21.  
  22. fn set(&self, new_value: T) {
  23. // pub unsafe fn write<T>(dst: *mut T, src: T)
  24. // Overwrites a memory location with the given value without reading or dropping the old value
  25. unsafe { ptr::write(&self.value as *const T as *mut T, new_value); }
  26. }
  27. }
  28.  
  29. fn foo(rcell: &MyCell<&i32>) {
  30. let val: i32 = 13;
  31. rcell.set(&val);
  32. println!("foo set value: {}", rcell.value);
  33. }
  34.  
  35. fn main() {
  36. static X: i32 = 10;
  37. let cell = MyCell::new(&X);
  38. foo(&cell);
  39. println!("end value: {}", cell.value);
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement