Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::ptr;
- use std::marker::PhantomData;
- use std::cell::Cell;
- struct MyCell<T> {
- value: T,
- _marker: PhantomData<Cell<T>>,
- }
- impl<T: Copy> MyCell<T> {
- fn new(value: T) -> Self {
- MyCell {
- value,
- _marker: PhantomData
- }
- }
- fn get(&self) -> T {
- self.value
- }
- fn set(&self, new_value: T) {
- // pub unsafe fn write<T>(dst: *mut T, src: T)
- // Overwrites a memory location with the given value without reading or dropping the old value
- unsafe { ptr::write(&self.value as *const T as *mut T, new_value); }
- }
- }
- fn foo(rcell: &MyCell<&i32>) {
- let val: i32 = 13;
- rcell.set(&val);
- println!("foo set value: {}", rcell.value);
- }
- fn main() {
- static X: i32 = 10;
- let cell = MyCell::new(&X);
- foo(&cell);
- println!("end value: {}", cell.value);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement