@@ -413,9 +413,13 @@ uniform_simd_int_impl! { (u8, i8), (u16, i16), (u32, i32), (u64, i64) }
413413 derive( Deserialize )
414414) ]
415415pub struct UniformUsize {
416+ /// The lowest possible value.
416417 low : usize ,
418+ /// The number of possible values. `0` has a special meaning: all.
417419 range : usize ,
420+ /// Threshold used when sampling to obtain a uniform distribution.
418421 thresh : usize ,
422+ /// Whether the largest possible value is greater than `u32::MAX`.
419423 #[ cfg( target_pointer_width = "64" ) ]
420424 // Handle missing field when deserializing on 64-bit an object serialized
421425 // on 32-bit. Can be removed when switching to a custom deserializer.
@@ -806,4 +810,57 @@ mod tests {
806810 ) ;
807811 }
808812 }
813+
814+ #[ test]
815+ fn test_uniform_usize_empty_range ( ) {
816+ assert_eq ! ( UniformUsize :: new( 10 , 10 ) , Err ( Error :: EmptyRange ) ) ;
817+ assert ! ( UniformUsize :: new( 10 , 11 ) . is_ok( ) ) ;
818+
819+ assert_eq ! ( UniformUsize :: new_inclusive( 10 , 9 ) , Err ( Error :: EmptyRange ) ) ;
820+ assert ! ( UniformUsize :: new_inclusive( 10 , 10 ) . is_ok( ) ) ;
821+ }
822+
823+ #[ test]
824+ fn test_uniform_usize_constructors ( ) {
825+ assert_eq ! (
826+ UniformUsize :: new_inclusive( u32 :: MAX as usize , u32 :: MAX as usize ) ,
827+ Ok ( UniformUsize {
828+ low: u32 :: MAX as usize ,
829+ range: 1 ,
830+ thresh: 0 ,
831+ #[ cfg( target_pointer_width = "64" ) ]
832+ mode64: false
833+ } )
834+ ) ;
835+ assert_eq ! (
836+ UniformUsize :: new_inclusive( 0 , u32 :: MAX as usize ) ,
837+ Ok ( UniformUsize {
838+ low: 0 ,
839+ range: 0 ,
840+ thresh: 0 ,
841+ #[ cfg( target_pointer_width = "64" ) ]
842+ mode64: false
843+ } )
844+ ) ;
845+ #[ cfg( target_pointer_width = "64" ) ]
846+ assert_eq ! (
847+ UniformUsize :: new_inclusive( 0 , u32 :: MAX as usize + 1 ) ,
848+ Ok ( UniformUsize {
849+ low: 0 ,
850+ range: u32 :: MAX as usize + 2 ,
851+ thresh: 1 ,
852+ mode64: true
853+ } )
854+ ) ;
855+ #[ cfg( target_pointer_width = "64" ) ]
856+ assert_eq ! (
857+ UniformUsize :: new_inclusive( u32 :: MAX as usize , u64 :: MAX as usize ) ,
858+ Ok ( UniformUsize {
859+ low: u32 :: MAX as usize ,
860+ range: u64 :: MAX as usize - u32 :: MAX as usize + 1 ,
861+ thresh: u32 :: MAX as usize ,
862+ mode64: true
863+ } )
864+ ) ;
865+ }
809866}
0 commit comments