[−][src]Crate nonminmax
Integers types which cannot be their minimum/maximum value.
The standard library contains a collection of std::num::NonZeroX
types: integer types which
cannot be zero. This crate extends this idea further by providing NonMinX
/NonMaxX
: integer
types which cannot be their minimum/maximum value.
// Create a regular NonMinU32 let x = 123 as i32; let y = NonMinI32::new(x).unwrap(); assert_eq!(y.get(), 123); // -2147483648 is the minimum value for a 32-bit integer. let z = NonMinI32::new(-2147483648); assert_eq!(z, None);
Memory optimization
Simlarity to NonZeroX
types from, these NonMinX
/NonMaxX
types allow for the niche filling
optimization. This means that types such as Option<NonMinX>
/Option<NonMaxX>
takes up the
same amount of space as X
, while a regular Option<X>
takes up twice the size of X
due to
the need of storing the variant tag.
use std::mem::size_of; // Option<u32> is larger than a regular u32 assert!(size_of::<Option<u32>>() == 2 * size_of::<u32>()); // Option<NonMinU32>/Option<NonMaxU32> is the same size as a regular u32. assert!(size_of::<Option<NonMinU32>>() == size_of::<u32>()); assert!(size_of::<Option<NonMaxU32>>() == size_of::<u32>());
While this may seem like a micro-optimization, it becomes important when frequently passing an
Option<X>
around or when creating a large array of Option<X>
.
// 1000 x u32 takes up 4000 bytes assert!(size_of::<[u32; 1000]>() == 4000); // 1000 x Option<u32> takes up 8000 bytes, ouch assert!(size_of::<[Option<u32>; 1000]>() == 8000); // 1000 x Option<NonMaxU32> takes up only 4000 bytes assert!(size_of::<[Option<NonMaxU32>; 1000]>() == 4000);
Internal details
Internally, these types work by wrapping the existing NonZeroX
types and xor-ing with a mask when
accessing the inner value. This means that there is the cost of a single xor
instruction each
time get
is called.
Supported types
The following types are supported
i8
/u8
i16
/u16
i32
/u32
i64
/u64
i128
/u128
isize
/usize
Structs
NonMaxI8 | An integer of type |
NonMaxI16 | An integer of type |
NonMaxI32 | An integer of type |
NonMaxI64 | An integer of type |
NonMaxI128 | An integer of type |
NonMaxIsize | An integer of type |
NonMaxU8 | An integer of type |
NonMaxU16 | An integer of type |
NonMaxU32 | An integer of type |
NonMaxU64 | An integer of type |
NonMaxU128 | An integer of type |
NonMaxUsize | An integer of type |
NonMinI8 | An integer of type |
NonMinI16 | An integer of type |
NonMinI32 | An integer of type |
NonMinI64 | An integer of type |
NonMinI128 | An integer of type |
NonMinIsize | An integer of type |
NonMinU8 | An integer of type |
NonMinU16 | An integer of type |
NonMinU32 | An integer of type |
NonMinU64 | An integer of type |
NonMinU128 | An integer of type |
NonMinUsize | An integer of type |