unsafe_send_sync/
lib.rs

1use std::ops::{Deref, DerefMut};
2
3
4/// A wrapper type that is always `Send`.
5pub 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
51/// A wrapper type that is always `Sync`.
52pub 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
99/// A wrapper type that is always `Send` and `Sync`.
100pub 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}