1#[macro_export]
2macro_rules! Wrap {
3
4 ($origin:ident, $wrapper:ident
6 $(, derive = { $($derive:path),* })?)=>{
7 #[doc = concat!("A NewType Wrapper around `", stringify!($origin), "`")]
8 $(#[derive($($derive),*)])?
9 struct $wrapper($origin);
10
11 impl From<$origin> for $wrapper {
12 fn from(v: $origin) -> Self {
13 Self(v)
14 }
15 }
16
17 impl From<$wrapper> for $origin {
18 fn from(v: $wrapper) -> Self {
19 v.0
20 }
21 }
22
23 impl core::ops::Deref for $wrapper {
24 type Target = $origin;
25
26 fn deref(&self) -> &Self::Target {
27 &self.0
28 }
29 }
30
31 impl core::ops::DerefMut for $wrapper {
32 fn deref_mut(&mut self) -> &mut Self::Target {
33 &mut self.0
34 }
35 }
36 };
37
38 ($origin:ident<
40 $($generic:ident $($(:)?$(+)?$gconstraints: path)*),*
41 >, $wrapper:ident
42 $(, derive = { $($derive:path),* })?)=>{
43 #[doc = concat!("A NewType Wrapper around `", stringify!($origin), "`")]
44 $(#[derive($($derive),*)])?
45 struct $wrapper<$($generic),*>( $origin<$($generic),*> )
46 where $($generic:$($gconstraints +)*),*;
47
48 impl<$($generic: $($gconstraints +)*),*> From<$origin<$($generic),*>> for $wrapper<$($generic),*> {
49 fn from(v: $origin<$($generic),*>) -> Self {
50 Self(v)
51 }
52 }
53
54 impl<$($generic: $($gconstraints +)*),*> From<$wrapper<$($generic),*>> for $origin<$($generic),*> {
55 fn from(v: $wrapper<$($generic),*>) -> Self {
56 v.0
57 }
58 }
59
60 impl<$($generic: $($gconstraints +)*),*> core::ops::Deref for $wrapper<$($generic),*> {
61 type Target = $origin<$($generic),*>;
62
63 fn deref(&self) -> &Self::Target {
64 &self.0
65 }
66 }
67
68 impl<$($generic: $($gconstraints +)*),*> core::ops::DerefMut for $wrapper<$($generic),*> {
69 fn deref_mut(&mut self) -> &mut Self::Target {
70 &mut self.0
71 }
72 }
73 };
74
75 ($origin:ident<
77 $($lifetime:lifetime $($(:)?$(+)?$lconstraints: lifetime)*),*>, $wrapper:ident
78 $(, derive = { $($derive:path),* })?)=>{
79 #[doc = concat!("A NewType Wrapper around `", stringify!($origin), "`")]
80 struct $wrapper<$($lifetime: $($lconstraints +)*),*>( $origin<$($lifetime),*> );
81
82 impl<$($lifetime: $($lconstraints +)*),*> From<$origin<$($lifetime),*>> for $wrapper<$($lifetime),*> {
83 fn from(v: $origin<$($lifetime),*>) -> Self {
84 Self(v)
85 }
86 }
87
88 impl<$($lifetime: $($lconstraints +)*),*> From<$wrapper<$($lifetime),*>> for $origin<$($lifetime),*> {
89 fn from(v: $wrapper<$($lifetime),*>) -> Self {
90 v.0
91 }
92 }
93
94 impl<$($lifetime: $($lconstraints +)*),*> core::ops::Deref for $wrapper<$($lifetime),*> {
95 type Target = $origin<$($lifetime),*>;
96
97 fn deref(&self) -> &Self::Target {
98 &self.0
99 }
100 }
101
102 impl<$($lifetime: $($lconstraints +)*),*> core::ops::DerefMut for $wrapper<$($lifetime),*> {
103 fn deref_mut(&mut self) -> &mut Self::Target {
104 &mut self.0
105 }
106 }
107 };
108
109 ($origin:ident<
111 $($lifetime:lifetime $($(:)?$(+)?$lconstraints: lifetime)*),*,
112 $($generic:ident $($(:)?$(+)?$gconstraints: path)*),*
113 >, $wrapper:ident
114 $(, derive = { $($derive:path),* })?)=>{
115 #[doc = concat!("A NewType Wrapper around `", stringify!($origin), "`")]
116 $(#[derive($($derive),*)])?
117 struct $wrapper<$($lifetime: $($lconstraints +)*),*, $($generic),*>( $origin<$($lifetime),*, $($generic),*> )
118 where $($generic:$($gconstraints +)*),*;
119
120 impl<$($lifetime: $($lconstraints +)*,)* $($generic: $($gconstraints +)*),*> From<$origin<$($lifetime),*, $($generic),*>> for $wrapper<$($lifetime),*, $($generic),*> {
121 fn from(v: $origin<$($lifetime),*, $($generic),*>) -> Self {
122 Self(v)
123 }
124 }
125
126 impl<$($lifetime: $($lconstraints +)*,)* $($generic: $($gconstraints +)*),*> From<$wrapper<$($lifetime),*, $($generic),*>> for $origin<$($lifetime),*, $($generic),*> {
127 fn from(v: $wrapper<$($lifetime),*, $($generic),*>) -> Self {
128 v.0
129 }
130 }
131
132 impl<$($lifetime: $($lconstraints +)*,)* $($generic: $($gconstraints +)*),*> core::ops::Deref for $wrapper<$($lifetime),*, $($generic),*> {
133 type Target = $origin<$($lifetime),*, $($generic),*>;
134
135 fn deref(&self) -> &Self::Target {
136 &self.0
137 }
138 }
139
140 impl<$($lifetime: $($lconstraints +)*,)* $($generic: $($gconstraints +)*),*> core::ops::DerefMut for $wrapper<$($lifetime),*, $($generic),*> {
141 fn deref_mut(&mut self) -> &mut Self::Target {
142 &mut self.0
143 }
144 }
145 };
146
147}