@@ -229,6 +229,33 @@ macro_rules! impl_num {
229229impl_num ! ( unsigned u8 , u16 , u32 , u64 , u128 ) ;
230230impl_num ! ( signed i8 , i16 , i32 , i64 , i128 ) ;
231231
232+ macro_rules! impl_nonzero {
233+ ( $( ( $nzero: ty => $base: ty) ) * ) => {
234+ $(
235+ impl Decode <DagCbor > for $nzero {
236+ fn decode<R : Read + Seek >( c: DagCbor , r: & mut R ) -> Result <Self > {
237+ let base = <$base>:: decode( c, r) ?;
238+ let nzero = <$nzero>:: try_from( base) ?;
239+ Ok ( nzero)
240+ }
241+ }
242+ ) *
243+ } ;
244+ }
245+
246+ impl_nonzero ! (
247+ ( std:: num:: NonZeroU8 => u8 )
248+ ( std:: num:: NonZeroU16 => u16 )
249+ ( std:: num:: NonZeroU32 => u32 )
250+ ( std:: num:: NonZeroU64 => u64 )
251+ ( std:: num:: NonZeroU128 => u128 )
252+ ( std:: num:: NonZeroI8 => i8 )
253+ ( std:: num:: NonZeroI16 => i16 )
254+ ( std:: num:: NonZeroI32 => i32 )
255+ ( std:: num:: NonZeroI64 => i64 )
256+ ( std:: num:: NonZeroI128 => i128 )
257+ ) ;
258+
232259impl Decode < DagCbor > for f32 {
233260 fn decode < R : Read + Seek > ( _: DagCbor , r : & mut R ) -> Result < Self > {
234261 // TODO: We don't accept f16
@@ -571,6 +598,10 @@ mod tests {
571598 use super :: * ;
572599 use crate :: { error:: UnexpectedEof , DagCborCodec } ;
573600 use libipld_core:: codec:: Codec ;
601+ use std:: num:: {
602+ NonZeroI128 , NonZeroI16 , NonZeroI32 , NonZeroI64 , NonZeroI8 , NonZeroU128 , NonZeroU16 ,
603+ NonZeroU32 , NonZeroU64 , NonZeroU8 ,
604+ } ;
574605
575606 #[ test]
576607 fn il_map ( ) {
@@ -632,4 +663,54 @@ mod tests {
632663
633664 Ok ( ( ) )
634665 }
666+
667+ #[ test]
668+ fn nonzero_int ( ) -> Result < ( ) > {
669+ let bytes = DagCborCodec . encode ( & 42i128 ) ?;
670+ let n: NonZeroI8 = DagCborCodec . decode ( & bytes) ?;
671+ assert_eq ! ( n. get( ) , 42 ) ;
672+
673+ let bytes = DagCborCodec . encode ( & -43i64 ) ?;
674+ let n: NonZeroI16 = DagCborCodec . decode ( & bytes) ?;
675+ assert_eq ! ( n. get( ) , -43 ) ;
676+
677+ let bytes = DagCborCodec . encode ( & 44i32 ) ?;
678+ let n: NonZeroI32 = DagCborCodec . decode ( & bytes) ?;
679+ assert_eq ! ( n. get( ) , 44 ) ;
680+
681+ let bytes = DagCborCodec . encode ( & -45i16 ) ?;
682+ let n: NonZeroI64 = DagCborCodec . decode ( & bytes) ?;
683+ assert_eq ! ( n. get( ) , -45 ) ;
684+
685+ let bytes = DagCborCodec . encode ( & 46i8 ) ?;
686+ let n: NonZeroI128 = DagCborCodec . decode ( & bytes) ?;
687+ assert_eq ! ( n. get( ) , 46 ) ;
688+
689+ Ok ( ( ) )
690+ }
691+
692+ #[ test]
693+ fn nonzero_uint ( ) -> Result < ( ) > {
694+ let bytes = DagCborCodec . encode ( & 42i128 ) ?;
695+ let n: NonZeroU8 = DagCborCodec . decode ( & bytes) ?;
696+ assert_eq ! ( n. get( ) , 42 ) ;
697+
698+ let bytes = DagCborCodec . encode ( & 43u64 ) ?;
699+ let n: NonZeroU16 = DagCborCodec . decode ( & bytes) ?;
700+ assert_eq ! ( n. get( ) , 43 ) ;
701+
702+ let bytes = DagCborCodec . encode ( & 44u32 ) ?;
703+ let n: NonZeroU32 = DagCborCodec . decode ( & bytes) ?;
704+ assert_eq ! ( n. get( ) , 44 ) ;
705+
706+ let bytes = DagCborCodec . encode ( & 45u16 ) ?;
707+ let n: NonZeroU64 = DagCborCodec . decode ( & bytes) ?;
708+ assert_eq ! ( n. get( ) , 45 ) ;
709+
710+ let bytes = DagCborCodec . encode ( & 46u8 ) ?;
711+ let n: NonZeroU128 = DagCborCodec . decode ( & bytes) ?;
712+ assert_eq ! ( n. get( ) , 46 ) ;
713+
714+ Ok ( ( ) )
715+ }
635716}
0 commit comments