1use std::ops::{Deref, DerefMut};
2
3
4pub struct UnsafeSend<T>(pub T);
6unsafe impl<T> Send for UnsafeSend<T> {}
7
8impl<T> UnsafeSend<T> {
9 pub fn new(internal: T) -> Self { Self(internal) }
10
11 pub fn unwrap(self) -> T { self.0 }
12}
13
14impl<T> AsMut<T> for UnsafeSend<T> {
15 fn as_mut(&mut self) -> &mut T { &mut self.0 }
16}
17
18impl<T> AsRef<T> for UnsafeSend<T> {
19 fn as_ref(&self) -> &T { &self.0 }
20}
21
22impl<T> Clone for UnsafeSend<T>
23where
24 T: Clone,
25{
26 fn clone(&self) -> Self { Self(self.0.clone()) }
27}
28
29impl<T> Default for UnsafeSend<T>
30where
31 T: Default,
32{
33 fn default() -> Self { Self(T::default()) }
34}
35
36impl<T> Deref for UnsafeSend<T> {
37 type Target = T;
38
39 fn deref(&self) -> &Self::Target { &self.0 }
40}
41
42impl<T> DerefMut for UnsafeSend<T> {
43 fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
44}
45
46impl<T> From<T> for UnsafeSend<T> {
47 fn from(other: T) -> Self { Self(other) }
48}
49
50
51pub struct UnsafeSync<T>(pub T);
53unsafe impl<T> Sync for UnsafeSync<T> {}
54
55impl<T> UnsafeSync<T> {
56 pub fn new(internal: T) -> Self { Self(internal) }
57
58 pub fn unwrap(self) -> T { self.0 }
59}
60
61impl<T> AsMut<T> for UnsafeSync<T> {
62 fn as_mut(&mut self) -> &mut T { &mut self.0 }
63}
64
65impl<T> AsRef<T> for UnsafeSync<T> {
66 fn as_ref(&self) -> &T { &self.0 }
67}
68
69impl<T> Clone for UnsafeSync<T>
70where
71 T: Clone,
72{
73 fn clone(&self) -> Self { Self::new(self.0.clone()) }
74}
75
76
77impl<T> Default for UnsafeSync<T>
78where
79 T: Default,
80{
81 fn default() -> Self { Self(T::default()) }
82}
83
84impl<T> Deref for UnsafeSync<T> {
85 type Target = T;
86
87 fn deref(&self) -> &Self::Target { &self.0 }
88}
89
90impl<T> DerefMut for UnsafeSync<T> {
91 fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
92}
93
94impl<T> From<T> for UnsafeSync<T> {
95 fn from(other: T) -> Self { Self(other) }
96}
97
98
99pub struct UnsafeSendSync<T>(pub T);
101unsafe impl<T> Send for UnsafeSendSync<T> {}
102unsafe impl<T> Sync for UnsafeSendSync<T> {}
103
104impl<T> UnsafeSendSync<T> {
105 pub fn new(internal: T) -> Self { Self(internal) }
106
107 pub fn unwrap(self) -> T { self.0 }
108}
109
110impl<T> AsMut<T> for UnsafeSendSync<T> {
111 fn as_mut(&mut self) -> &mut T { &mut self.0 }
112}
113
114impl<T> AsRef<T> for UnsafeSendSync<T> {
115 fn as_ref(&self) -> &T { &self.0 }
116}
117
118impl<T> Default for UnsafeSendSync<T>
119where
120 T: Default,
121{
122 fn default() -> Self { Self(T::default()) }
123}
124
125impl<T> Deref for UnsafeSendSync<T> {
126 type Target = T;
127
128 fn deref(&self) -> &Self::Target { &self.0 }
129}
130
131impl<T> DerefMut for UnsafeSendSync<T> {
132 fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
133}
134
135impl<T> Clone for UnsafeSendSync<T>
136where
137 T: Clone,
138{
139 fn clone(&self) -> Self { Self::new(self.0.clone()) }
140}
141
142impl<T> From<T> for UnsafeSendSync<T> {
143 fn from(other: T) -> Self { Self(other) }
144}