Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![feature(maybe_uninit)]
- use std::marker::PhantomData;
- use std::mem::MaybeUninit;
- struct Invariant<'a>(PhantomData<&'a mut &'a mut ()>);
- struct MustInit<'a, T> {
- marker: Invariant<'a>,
- maybe_uninit: &'a mut MaybeUninit<T>,
- }
- struct DidInit<'a, T> {
- marker: Invariant<'a>,
- value: &'a mut T,
- }
- impl<'a, T> MustInit<'a, T> {
- fn set(self, val: T) -> DidInit<'a, T> {
- DidInit {
- marker: Invariant(PhantomData),
- value: self.maybe_uninit.set(val),
- }
- }
- }
- fn require_init<T>(
- f: impl for<'a> FnOnce(MustInit<'a, T>) -> DidInit<'a, T>,
- ) {
- let mut value = MaybeUninit::uninitialized();
- let _ = f(MustInit { marker: Invariant(PhantomData), maybe_uninit: &mut value });
- }
- fn main() {
- require_init(|x| {
- require_init(|y| {
- y.set(5u32)
- });
- x.set(5u32)
- });
- }
Add Comment
Please, Sign In to add comment