Skip to main content

leak_playground_std/
mem.rs

1//! Possible [`core::mem`] additions and replacements.
2
3use core::mem;
4
5use crate::marker::Forget;
6
7pub fn forget<T: Forget>(x: T) {
8    mem::forget(x)
9}
10
11pub unsafe fn forget_unchecked<T>(x: T) {
12    mem::forget(x)
13}
14
15#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16#[repr(transparent)]
17pub struct ManuallyDrop<T: ?Sized> {
18    inner: mem::ManuallyDrop<T>,
19}
20
21unsafe impl<T: ?Sized> Forget for ManuallyDrop<T> {}
22
23impl<T> ManuallyDrop<T> {
24    pub const fn new(value: T) -> Self
25    where
26        T: Forget,
27    {
28        Self {
29            inner: mem::ManuallyDrop::new(value),
30        }
31    }
32
33    pub const unsafe fn new_unchecked(value: T) -> Self {
34        Self {
35            inner: mem::ManuallyDrop::new(value),
36        }
37    }
38
39    pub unsafe fn take(slot: &mut ManuallyDrop<T>) -> T {
40        mem::ManuallyDrop::take(&mut slot.inner)
41    }
42
43    pub const fn into_inner(slot: ManuallyDrop<T>) -> T {
44        mem::ManuallyDrop::into_inner(slot.inner)
45    }
46}
47
48impl<T: ?Sized> std::ops::DerefMut for ManuallyDrop<T> {
49    fn deref_mut(&mut self) -> &mut Self::Target {
50        &mut self.inner
51    }
52}
53
54impl<T: ?Sized> std::ops::Deref for ManuallyDrop<T> {
55    type Target = T;
56
57    fn deref(&self) -> &Self::Target {
58        &self.inner
59    }
60}
61
62#[repr(transparent)]
63pub struct MaybeUninit<T> {
64    inner: mem::MaybeUninit<T>,
65}
66
67unsafe impl<T> Forget for MaybeUninit<T> {}
68
69impl<T> MaybeUninit<T> {
70    pub const fn new(val: T) -> Self
71    where
72        T: Forget,
73    {
74        MaybeUninit {
75            inner: mem::MaybeUninit::new(val),
76        }
77    }
78
79    pub const unsafe fn new_unchecked(val: T) -> Self {
80        MaybeUninit {
81            inner: mem::MaybeUninit::new(val),
82        }
83    }
84
85    pub const fn uninit() -> Self {
86        MaybeUninit {
87            inner: mem::MaybeUninit::uninit(),
88        }
89    }
90
91    pub const fn zeroed() -> Self {
92        MaybeUninit {
93            inner: mem::MaybeUninit::uninit(),
94        }
95    }
96
97    pub fn write(&mut self, val: T) -> &mut T
98    where
99        T: Forget,
100    {
101        self.inner.write(val)
102    }
103
104    pub unsafe fn write_unchecked(&mut self, val: T) -> &mut T {
105        self.inner.write(val)
106    }
107
108    pub const fn as_ptr(&self) -> *const T {
109        self.inner.as_ptr()
110    }
111
112    pub fn as_mut_ptr(&mut self) -> *mut T {
113        self.inner.as_mut_ptr()
114    }
115
116    pub const unsafe fn assume_init(self) -> T {
117        self.inner.assume_init()
118    }
119
120    pub const unsafe fn assume_init_read(&self) -> T {
121        self.inner.assume_init_read()
122    }
123
124    pub unsafe fn assume_init_drop(&mut self) {
125        self.inner.assume_init_drop()
126    }
127
128    pub const unsafe fn assume_init_ref(&self) -> &T {
129        self.inner.assume_init_ref()
130    }
131
132    pub unsafe fn assume_init_mut(&mut self) -> &mut T {
133        self.inner.assume_init_mut()
134    }
135}
136
137impl<T: Copy> Copy for MaybeUninit<T> {}
138
139impl<T: Copy> Clone for MaybeUninit<T> {
140    fn clone(&self) -> Self {
141        *self
142    }
143}
144
145impl<T> std::fmt::Debug for MaybeUninit<T> {
146    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
147        self.inner.fmt(f)
148    }
149}