@@ -227,6 +227,18 @@ macro_rules! from_numbers {
227227 }
228228}
229229
230+ macro_rules! from_primitive_numbers {
231+ ( $( $from: ident => $to: ident) ,* ) => {
232+ $(
233+ impl From <$from> for $to {
234+ fn from( value: $from) -> Self {
235+ Self :: new( value. into( ) ) . unwrap( )
236+ }
237+ }
238+ ) *
239+ }
240+ }
241+
230242impl_numbers ! {
231243 U15 => u16 , i16 , SmallInt ,
232244 U31 => u32 , i32 , Integer ,
@@ -239,6 +251,15 @@ from_numbers! {
239251 U31 => U63
240252}
241253
254+ from_primitive_numbers ! {
255+ u8 => U15 ,
256+ u8 => U31 ,
257+ u8 => U63 ,
258+ u16 => U31 ,
259+ u16 => U63 ,
260+ u32 => U63
261+ }
262+
242263#[ cfg( test) ]
243264mod tests {
244265 use super :: { U15 , U31 , U63 } ;
@@ -381,6 +402,18 @@ mod tests {
381402 assert ! ( U15 :: try_from( -1i16 ) . is_err( ) ) ;
382403 }
383404
405+ #[ test]
406+ fn test_from_primitive_numbers ( ) {
407+ assert_eq ! ( U15 :: new( u8 :: MAX . into( ) ) . unwrap( ) , u8 :: MAX . into( ) ) ;
408+
409+ assert_eq ! ( U31 :: new( u8 :: MAX . into( ) ) . unwrap( ) , u8 :: MAX . into( ) ) ;
410+ assert_eq ! ( U31 :: new( u16 :: MAX . into( ) ) . unwrap( ) , u16 :: MAX . into( ) ) ;
411+
412+ assert_eq ! ( U63 :: new( u8 :: MAX . into( ) ) . unwrap( ) , u8 :: MAX . into( ) ) ;
413+ assert_eq ! ( U63 :: new( u16 :: MAX . into( ) ) . unwrap( ) , u16 :: MAX . into( ) ) ;
414+ assert_eq ! ( U63 :: new( u32 :: MAX . into( ) ) . unwrap( ) , u32 :: MAX . into( ) ) ;
415+ }
416+
384417 #[ test]
385418 fn test_ordering ( ) {
386419 let a = U15 :: new ( 100 ) . unwrap ( ) ;
0 commit comments