1#![no_std]
6use core::ops::{Deref, DerefMut};
7
8#[repr(transparent)]
10pub struct Send<T>(T);
11
12impl<T> Send<T> {
13 pub unsafe fn new(t: T) -> Self {
18 Send(t)
19 }
20
21 pub fn unwrap(self) -> T {
23 self.0
24 }
25}
26
27unsafe impl<T> core::marker::Send for Send<T> {}
28
29impl<T> Deref for Send<T> {
30 type Target = T;
31
32 fn deref(&self) -> &Self::Target {
33 &self.0
34 }
35}
36
37impl<T> DerefMut for Send<T> {
38 fn deref_mut(&mut self) -> &mut Self::Target {
39 &mut self.0
40 }
41}
42
43#[repr(transparent)]
45pub struct Sync<T>(T);
46
47impl<T> Sync<T> {
48 pub unsafe fn new(t: T) -> Self {
53 Sync(t)
54 }
55
56 pub fn unwrap(self) -> T {
58 self.0
59 }
60}
61
62unsafe impl<T> core::marker::Sync for Sync<T> {}
63
64impl<T> Deref for Sync<T> {
65 type Target = T;
66
67 fn deref(&self) -> &Self::Target {
68 &self.0
69 }
70}
71
72impl<T> DerefMut for Sync<T> {
73 fn deref_mut(&mut self) -> &mut Self::Target {
74 &mut self.0
75 }
76}
77
78#[repr(transparent)]
80pub struct SendSync<T>(T);
81
82impl<T> SendSync<T> {
83 pub unsafe fn new(t: T) -> Self {
88 SendSync(t)
89 }
90
91 pub fn unwrap(self) -> T {
93 self.0
94 }
95}
96
97unsafe impl<T> core::marker::Send for SendSync<T> {}
98unsafe impl<T> core::marker::Sync for SendSync<T> {}
99
100impl<T> Deref for SendSync<T> {
101 type Target = T;
102
103 fn deref(&self) -> &Self::Target {
104 &self.0
105 }
106}
107
108impl<T> DerefMut for SendSync<T> {
109 fn deref_mut(&mut self) -> &mut Self::Target {
110 &mut self.0
111 }
112}