@@ -4,9 +4,6 @@ pub mod result;
44
55use  result:: Result ; 
66
7- #[ cfg( feature = "riscv-pac-macros" ) ]  
8- pub  use  riscv_pac_macros:: * ; 
9- 
107/// Trait for enums of target-specific exception numbers. 
118/// 
129/// This trait should be implemented by a peripheral access crate (PAC) on its enum of available 
@@ -136,75 +133,69 @@ pub unsafe trait HartIdNumber: Copy {
136133#[ cfg( test) ]  
137134mod  test { 
138135    use  super :: * ; 
136+     use  crate :: result:: Error ; 
139137
140-     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ,  ExceptionNumber ) ]  
141-     #[ repr( u16 ) ]  
138+     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ) ]  
142139    enum  Exception  { 
143140        E1  = 1 , 
144141        E3  = 3 , 
145142    } 
146143
147-     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ,  InterruptNumber ) ]  
148-     #[ repr( u16 ) ]  
144+     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ) ]  
149145    enum  Interrupt  { 
150146        I1  = 1 , 
151147        I2  = 2 , 
152148        I4  = 4 , 
153149    } 
154150
155-     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ,  PriorityNumber ) ]  
156-     #[ repr( u8 ) ]  
151+     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ) ]  
157152    enum  Priority  { 
158153        P0  = 0 , 
159154        P1  = 1 , 
160155        P2  = 2 , 
161156        P3  = 3 , 
162157    } 
163158
164-     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ,  HartIdNumber ) ]  
165-     #[ repr( u16 ) ]  
166-     enum  Context  { 
167-         C0  = 0 , 
168-         C1  = 1 , 
169-         C2  = 2 , 
159+     #[ derive( Clone ,  Copy ,  Debug ,  Eq ,  PartialEq ) ]  
160+     enum  HartId  { 
161+         H0  = 0 , 
162+         H1  = 1 , 
163+         H2  = 2 , 
170164    } 
171165
172166    unsafe  impl  ExceptionNumber  for  Exception  { 
173-         const  MAX_EXCEPTION_NUMBER :  u16  = Self :: E3  as  u16 ; 
167+         const  MAX_EXCEPTION_NUMBER :  usize  = Self :: E3  as  usize ; 
174168
175169        #[ inline]  
176-         fn  number ( self )  -> u16  { 
170+         fn  number ( self )  -> usize  { 
177171            self  as  _ 
178172        } 
179173
180174        #[ inline]  
181-         fn  from_number ( number :  u16 )  -> Result < Self >  { 
182-             if  number > Self :: MAX_EXCEPTION_NUMBER  || number == 0  { 
183-                 Err ( number) 
184-             }  else  if  number == 1  || number == 3  { 
185-                 // SAFETY: valid exception number 
186-                 Ok ( unsafe  {  core:: mem:: transmute ( number)  } ) 
187-             }  else  { 
188-                 Err ( number) 
175+         fn  from_number ( number :  usize )  -> Result < Self >  { 
176+             match  number { 
177+                 1  => Ok ( Exception :: E1 ) , 
178+                 3  => Ok ( Exception :: E3 ) , 
179+                 _ => Err ( Error :: InvalidVariant ( number) ) , 
189180            } 
190181        } 
191182    } 
192183
193184    unsafe  impl  InterruptNumber  for  Interrupt  { 
194-         const  MAX_INTERRUPT_NUMBER :  u16  = Self :: I4  as  u16 ; 
185+         const  MAX_INTERRUPT_NUMBER :  usize  = Self :: I4  as  usize ; 
195186
196187        #[ inline]  
197-         fn  number ( self )  -> u16  { 
188+         fn  number ( self )  -> usize  { 
198189            self  as  _ 
199190        } 
200191
201192        #[ inline]  
202-         fn  from_number ( number :  u16 )  -> Result < Self >  { 
203-             if  number >  Self :: MAX_INTERRUPT_NUMBER  || number ==  0  { 
204-                 Err ( number ) 
205-             }   else   { 
206-                 // SAFETY: valid interrupt number 
207-                 Ok ( unsafe   {  core :: mem :: transmute ( number)   } ) 
193+         fn  from_number ( number :  usize )  -> Result < Self >  { 
194+             match  number { 
195+                 1  =>  Ok ( Interrupt :: I1 ) , 
196+                  2  =>  Ok ( Interrupt :: I2 ) , 
197+                 4  =>  Ok ( Interrupt :: I4 ) , 
198+                 _ =>  Err ( Error :: InvalidVariant ( number) ) , 
208199            } 
209200        } 
210201    } 
@@ -218,31 +209,32 @@ mod test {
218209        } 
219210
220211        #[ inline]  
221-         fn  from_number ( number :  u8 )  -> Result < Self ,  u8 >  { 
222-             if  number > Self :: MAX_PRIORITY_NUMBER  { 
223-                 Err ( number) 
224-             }  else  { 
225-                 // SAFETY: valid priority number 
226-                 Ok ( unsafe  {  core:: mem:: transmute ( number)  } ) 
212+         fn  from_number ( number :  u8 )  -> Result < Self >  { 
213+             match  number { 
214+                 0  => Ok ( Priority :: P0 ) , 
215+                 1  => Ok ( Priority :: P1 ) , 
216+                 2  => Ok ( Priority :: P2 ) , 
217+                 3  => Ok ( Priority :: P3 ) , 
218+                 _ => Err ( Error :: InvalidVariant ( number as  _ ) ) , 
227219            } 
228220        } 
229221    } 
230222
231-     unsafe  impl  HartIdNumber  for  Context  { 
232-         const  MAX_HART_ID_NUMBER :  u16  = Self :: C2  as  u16 ; 
223+     unsafe  impl  HartIdNumber  for  HartId  { 
224+         const  MAX_HART_ID_NUMBER :  u16  = Self :: H2  as  u16 ; 
233225
234226        #[ inline]  
235227        fn  number ( self )  -> u16  { 
236228            self  as  _ 
237229        } 
238230
239231        #[ inline]  
240-         fn  from_number ( number :  u16 )  -> Result < Self ,   u16 >  { 
241-             if  number >  Self :: MAX_HART_ID_NUMBER  { 
242-                 Err ( number ) 
243-             }   else   { 
244-                 // SAFETY: valid context number 
245-                 Ok ( unsafe   {  core :: mem :: transmute ( number)   } ) 
232+         fn  from_number ( number :  u16 )  -> Result < Self >  { 
233+             match  number { 
234+                 0  =>  Ok ( HartId :: H0 ) , 
235+                  1  =>  Ok ( HartId :: H1 ) , 
236+                 2  =>  Ok ( HartId :: H2 ) , 
237+                 _ =>  Err ( Error :: InvalidVariant ( number  as   _ ) ) , 
246238            } 
247239        } 
248240    } 
@@ -252,11 +244,11 @@ mod test {
252244        assert_eq ! ( Exception :: E1 . number( ) ,  1 ) ; 
253245        assert_eq ! ( Exception :: E3 . number( ) ,  3 ) ; 
254246
255-         assert_eq ! ( Exception :: from_number( 0 ) ,  Err ( 0 ) ) ; 
247+         assert_eq ! ( Exception :: from_number( 0 ) ,  Err ( Error :: InvalidVariant ( 0 ) ) ) ; 
256248        assert_eq ! ( Exception :: from_number( 1 ) ,  Ok ( Exception :: E1 ) ) ; 
257-         assert_eq ! ( Exception :: from_number( 2 ) ,  Err ( 2 ) ) ; 
249+         assert_eq ! ( Exception :: from_number( 2 ) ,  Err ( Error :: InvalidVariant ( 2 ) ) ) ; 
258250        assert_eq ! ( Exception :: from_number( 3 ) ,  Ok ( Exception :: E3 ) ) ; 
259-         assert_eq ! ( Exception :: from_number( 4 ) ,  Err ( 4 ) ) ; 
251+         assert_eq ! ( Exception :: from_number( 4 ) ,  Err ( Error :: InvalidVariant ( 4 ) ) ) ; 
260252    } 
261253
262254    #[ test]  
@@ -265,12 +257,12 @@ mod test {
265257        assert_eq ! ( Interrupt :: I2 . number( ) ,  2 ) ; 
266258        assert_eq ! ( Interrupt :: I4 . number( ) ,  4 ) ; 
267259
268-         assert_eq ! ( Interrupt :: from_number( 0 ) ,  Err ( 0 ) ) ; 
260+         assert_eq ! ( Interrupt :: from_number( 0 ) ,  Err ( Error :: InvalidVariant ( 0 ) ) ) ; 
269261        assert_eq ! ( Interrupt :: from_number( 1 ) ,  Ok ( Interrupt :: I1 ) ) ; 
270262        assert_eq ! ( Interrupt :: from_number( 2 ) ,  Ok ( Interrupt :: I2 ) ) ; 
271-         assert_eq ! ( Interrupt :: from_number( 3 ) ,  Err ( 3 ) ) ; 
263+         assert_eq ! ( Interrupt :: from_number( 3 ) ,  Err ( Error :: InvalidVariant ( 3 ) ) ) ; 
272264        assert_eq ! ( Interrupt :: from_number( 4 ) ,  Ok ( Interrupt :: I4 ) ) ; 
273-         assert_eq ! ( Interrupt :: from_number( 5 ) ,  Err ( 5 ) ) ; 
265+         assert_eq ! ( Interrupt :: from_number( 5 ) ,  Err ( Error :: InvalidVariant ( 5 ) ) ) ; 
274266    } 
275267
276268    #[ test]  
@@ -284,7 +276,7 @@ mod test {
284276        assert_eq ! ( Priority :: from_number( 1 ) ,  Ok ( Priority :: P1 ) ) ; 
285277        assert_eq ! ( Priority :: from_number( 2 ) ,  Ok ( Priority :: P2 ) ) ; 
286278        assert_eq ! ( Priority :: from_number( 3 ) ,  Ok ( Priority :: P3 ) ) ; 
287-         assert_eq ! ( Priority :: from_number( 4 ) ,  Err ( 4 ) ) ; 
279+         assert_eq ! ( Priority :: from_number( 4 ) ,  Err ( Error :: InvalidVariant ( 4 ) ) ) ; 
288280    } 
289281
290282    #[ test]  
@@ -296,6 +288,6 @@ mod test {
296288        assert_eq ! ( HartId :: from_number( 0 ) ,  Ok ( HartId :: H0 ) ) ; 
297289        assert_eq ! ( HartId :: from_number( 1 ) ,  Ok ( HartId :: H1 ) ) ; 
298290        assert_eq ! ( HartId :: from_number( 2 ) ,  Ok ( HartId :: H2 ) ) ; 
299-         assert_eq ! ( HartId :: from_number( 3 ) ,  Err ( 3 ) ) ; 
291+         assert_eq ! ( HartId :: from_number( 3 ) ,  Err ( Error :: InvalidVariant ( 3 ) ) ) ; 
300292    } 
301293} 
0 commit comments