@@ -287,18 +287,18 @@ impl TryFrom<i8> for Exception {
287287#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
288288#[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
289289#[ cfg_attr( feature = "std" , derive( PartialOrd , Hash ) ) ]
290- pub enum Vector {
290+ pub enum Vector < INT = u16 > {
291291 /// Thread mode
292292 ThreadMode ,
293293
294294 /// Processor core exception (internal interrupts)
295295 Exception ( Exception ) ,
296296
297297 /// Device specific exception (external interrupts)
298- Interrupt {
298+ Interrupt (
299299 /// Interrupt number. This number is always in range `[0, 495]` (9-bit integer - 16)
300- irqn : u16 ,
301- } ,
300+ INT ,
301+ ) ,
302302}
303303
304304impl Vector {
@@ -311,10 +311,20 @@ impl Vector {
311311 match isrn {
312312 0 => Self :: ThreadMode ,
313313 2 ..=15 => Self :: Exception ( Exception :: new_unchecked ( isrn as i8 - 16 ) ) ,
314- 16 ..=511 => Self :: Interrupt { irqn : isrn - 16 } ,
314+ 16 ..=511 => Self :: Interrupt ( isrn - 16 ) ,
315315 _ => core:: hint:: unreachable_unchecked ( ) ,
316316 }
317317 }
318+
319+ /// Map the interrupt number to a different type.
320+ #[ inline]
321+ pub fn map_interrupt < INT > ( & self , f : impl FnOnce ( u16 ) -> INT ) -> Vector < INT > {
322+ match self {
323+ Self :: ThreadMode => Vector :: ThreadMode ,
324+ Self :: Exception ( ex) => Vector :: Exception ( * ex) ,
325+ Self :: Interrupt ( irqn) => Vector :: Interrupt ( f ( * irqn) ) ,
326+ }
327+ }
318328}
319329
320330impl TryFrom < u16 > for Vector {
@@ -326,7 +336,7 @@ impl TryFrom<u16> for Vector {
326336 Ok ( match isrn {
327337 0 => Self :: ThreadMode ,
328338 2 ..=15 => Self :: Exception ( Exception :: try_from ( isrn as i8 - 16 ) . or ( Err ( isrn) ) ?) ,
329- 16 ..=511 => Self :: Interrupt { irqn : isrn - 16 } ,
339+ 16 ..=511 => Self :: Interrupt ( isrn - 16 ) ,
330340 _ => return Err ( isrn) ,
331341 } )
332342 }
0 commit comments