leak_playground_std/
mem.rs1use 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}