1pub struct Uninit {
2 __private: ()
3}
4
5pub struct Init<T = (), M = ()>
6where
7 T: ?Sized,
8 M: ?Sized + Marker
9{
10 __marker_t: PhantomDataInvariant<T>,
11 __marker_m: PhantomDataInvariant<M>,
12}
13
14pub trait Marker {}
15
16impl Marker for () {}
17
18pub unsafe trait InitStatus {
23 const IS_INIT: bool;
24 const IS_UNINIT: bool = !Self::IS_INIT;
25}
26
27unsafe impl InitStatus for Uninit {
29 const IS_INIT: bool = false;
30}
31
32unsafe impl<T, M> InitStatus for Init<T, M>
34where
35 T: ?Sized,
36 M: ?Sized + Marker
37{
38 const IS_INIT: bool = true;
39}
40
41pub unsafe trait IsUninit: InitStatus {}
45
46unsafe impl IsUninit for Uninit {}
48
49pub unsafe trait IsInit: InitStatus {}
53
54unsafe impl<T, M> IsInit for Init<T, M>
56where
57 T: ?Sized,
58 M: ?Sized + Marker
59{}
60
61type PhantomDataInvariant<T> = core::marker::PhantomData<fn(T) -> T>;