1- use std:: { collections:: HashMap , mem} ;
2-
31use proc_macro2:: Span ;
42use quote:: quote;
3+ use std:: collections:: HashMap ;
54use syn:: {
65 parse:: Parse , parse_quote, token:: Comma , Attribute , DataEnum , Error , GenericArgument ,
76 GenericParam , Generics , Ident , Lifetime , LifetimeParam , Path , PathArguments , Token , Type ,
@@ -108,20 +107,36 @@ pub(super) fn derive_enum_into(
108107 . collect :: < proc_macro2:: TokenStream > ( )
109108}
110109
111- #[ repr( u8 ) ]
112- #[ derive( Copy , Clone ) ]
113- #[ allow( dead_code) ]
114- enum ReferenceConfig {
115- Owned = 0b0001 ,
116- Shared = 0b0010 ,
117- SharedMut = 0b0100 ,
118- None = 0b0000 ,
119- All = 0b0111 ,
110+ #[ derive( Copy , Clone , PartialEq , Eq ) ]
111+ struct ReferenceConfig ( pub u8 ) ;
112+
113+ impl ReferenceConfig {
114+ const OWNED : Self = Self ( 0b0001 ) ;
115+ const SHARED : Self = Self ( 0b0010 ) ;
116+ const SHARED_MUT : Self = Self ( 0b0100 ) ;
117+ const NONE : Self = Self ( 0b0000 ) ;
118+ // const ALL: Self = Self(0b0111);
119+ }
120+
121+ impl std:: ops:: BitOr for ReferenceConfig {
122+ type Output = Self ;
123+
124+ fn bitor ( self , rhs : Self ) -> Self :: Output {
125+ Self ( self . 0 | rhs. 0 )
126+ }
127+ }
128+
129+ impl std:: ops:: BitAnd for ReferenceConfig {
130+ type Output = Self ;
131+
132+ fn bitand ( self , rhs : Self ) -> Self :: Output {
133+ Self ( self . 0 & rhs. 0 )
134+ }
120135}
121136
122137impl Default for ReferenceConfig {
123138 fn default ( ) -> Self {
124- Self :: Owned
139+ Self :: OWNED
125140 }
126141}
127142
@@ -134,24 +149,23 @@ impl Parse for ReferenceConfig {
134149 input. parse :: < proc_macro2:: TokenTree > ( ) . unwrap ( ) ;
135150 if input. peek ( Token ! [ mut ] ) {
136151 input. parse :: < Token ! [ mut ] > ( ) . unwrap ( ) ;
137- Ok ( ReferenceConfig :: SharedMut )
152+ Ok ( ReferenceConfig :: SHARED_MUT )
138153 } else {
139- Ok ( ReferenceConfig :: Shared )
154+ Ok ( ReferenceConfig :: SHARED )
140155 }
141156 } else if input. peek ( Ident ) && input. parse :: < Ident > ( ) . unwrap ( ) == "owned" {
142- Ok ( ReferenceConfig :: Owned )
157+ Ok ( ReferenceConfig :: OWNED )
143158 } else {
144159 Err ( Error :: new ( input. span ( ) , "expected 'ref', '&' or 'owned'" ) )
145160 }
146161 } ,
147162 Token ! [ , ] ,
148163 ) ?
149164 . into_iter ( )
150- . map ( |member| member as u8 )
151165 . reduce ( std:: ops:: BitOr :: bitor)
152166 . unwrap_or_default ( ) ;
153167
154- Ok ( unsafe { mem :: transmute ( flags) } )
168+ Ok ( flags)
155169 }
156170}
157171
@@ -164,16 +178,16 @@ impl ReferenceConfig {
164178 ( 0 ..3 )
165179 . map ( |bit_offset| 0b0001_u8 << bit_offset)
166180 . filter_map ( move |power_of_two| {
167- let flag = self as u8 & power_of_two;
168- match unsafe { mem :: transmute ( flag) } {
169- ReferenceConfig :: Owned => Some ( ReferenceDecorator :: Owned ) ,
170- ReferenceConfig :: Shared => {
181+ let flag = self & ReferenceConfig ( power_of_two) ;
182+ match flag {
183+ ReferenceConfig :: OWNED => Some ( ReferenceDecorator :: Owned ) ,
184+ ReferenceConfig :: SHARED => {
171185 Some ( ReferenceDecorator :: Shared ( lifetime_name. clone ( ) ) )
172186 }
173- ReferenceConfig :: SharedMut => {
187+ ReferenceConfig :: SHARED_MUT => {
174188 Some ( ReferenceDecorator :: SharedMut ( lifetime_name. clone ( ) ) )
175189 }
176- ReferenceConfig :: None => None ,
190+ ReferenceConfig :: NONE => None ,
177191 _ => unreachable ! ( ) ,
178192 }
179193 } )
0 commit comments