Guest User

Untitled

a guest
Feb 17th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.85 KB | None | 0 0
  1. #![feature(maybe_uninit)]
  2.  
  3. use std::marker::PhantomData;
  4. use std::mem::MaybeUninit;
  5.  
  6. struct Invariant<'a>(PhantomData<&'a mut &'a mut ()>);
  7.  
  8. struct MustInit<'a, T> {
  9. marker: Invariant<'a>,
  10. maybe_uninit: &'a mut MaybeUninit<T>,
  11. }
  12.  
  13. struct DidInit<'a, T> {
  14. marker: Invariant<'a>,
  15. value: &'a mut T,
  16. }
  17.  
  18. impl<'a, T> MustInit<'a, T> {
  19. fn set(self, val: T) -> DidInit<'a, T> {
  20. DidInit {
  21. marker: Invariant(PhantomData),
  22. value: self.maybe_uninit.set(val),
  23. }
  24. }
  25. }
  26.  
  27. fn require_init<T>(
  28. f: impl for<'a> FnOnce(MustInit<'a, T>) -> DidInit<'a, T>,
  29. ) {
  30. let mut value = MaybeUninit::uninitialized();
  31. let _ = f(MustInit { marker: Invariant(PhantomData), maybe_uninit: &mut value });
  32. }
  33.  
  34. fn main() {
  35. require_init(|x| {
  36. require_init(|y| {
  37. y.set(5u32)
  38. });
  39. x.set(5u32)
  40. });
  41. }
Add Comment
Please, Sign In to add comment