free_wrap/
wrap.rs

1#[macro_export]
2macro_rules! Wrap {
3
4    // Simple struct
5    ($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    // Have generic with constraints
39    ($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    // Have lifetime with constraints
76    ($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    // Have generic and lifetime with constraints
110    ($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}