1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#![allow(dead_code)] use std::cell::UnsafeCell; #[derive(Debug)] pub(crate) struct CausalCell<T>(UnsafeCell<T>); #[derive(Default)] pub(crate) struct CausalCheck(()); impl<T> CausalCell<T> { pub(crate) fn new(data: T) -> CausalCell<T> { CausalCell(UnsafeCell::new(data)) } pub(crate) fn with<F, R>(&self, f: F) -> R where F: FnOnce(*const T) -> R, { f(self.0.get()) } pub(crate) fn with_unchecked<F, R>(&self, f: F) -> R where F: FnOnce(*const T) -> R, { f(self.0.get()) } pub(crate) fn check(&self) {} pub(crate) fn with_deferred<F, R>(&self, f: F) -> (R, CausalCheck) where F: FnOnce(*const T) -> R, { (f(self.0.get()), CausalCheck::default()) } pub(crate) fn with_mut<F, R>(&self, f: F) -> R where F: FnOnce(*mut T) -> R, { f(self.0.get()) } } impl CausalCheck { pub(crate) fn check(self) {} pub(crate) fn join(&mut self, _other: CausalCheck) {} }