Expand description
Type-level unsigned integers.
Type operators implemented:
From ::core::ops
: BitAnd
, BitOr
, BitXor
, Shl
, Shr
, Add
, Sub
,
Mul
, Div
, and Rem
.
From typenum
: Same
, Cmp
, and Pow
.
Rather than directly using the structs defined in this module, it is recommended that you import and use the relevant aliases from the consts module.
Example
use std::ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Rem, Shl, Shr, Sub};
use typenum::{Unsigned, U1, U2, U3, U4};
assert_eq!(<U3 as BitAnd<U2>>::Output::to_u32(), 2);
assert_eq!(<U3 as BitOr<U4>>::Output::to_u32(), 7);
assert_eq!(<U3 as BitXor<U2>>::Output::to_u32(), 1);
assert_eq!(<U3 as Shl<U1>>::Output::to_u32(), 6);
assert_eq!(<U3 as Shr<U1>>::Output::to_u32(), 1);
assert_eq!(<U3 as Add<U2>>::Output::to_u32(), 5);
assert_eq!(<U3 as Sub<U2>>::Output::to_u32(), 1);
assert_eq!(<U3 as Mul<U2>>::Output::to_u32(), 6);
assert_eq!(<U3 as Div<U2>>::Output::to_u32(), 1);
assert_eq!(<U3 as Rem<U2>>::Output::to_u32(), 1);
Re-exports
pub use crate::marker_traits::PowerOfTwo;
pub use crate::marker_traits::Unsigned;
Structs
UInt
is defined recursively, where B
is the least significant bit and U
is the rest
of the number. Conceptually, U
should be bound by the trait Unsigned
and B
should
be bound by the trait Bit
, but enforcing these bounds causes linear instead of
logrithmic scaling in some places, so they are left off for now. They may be enforced in
future.The terminating type for
UInt
; it always comes after the most significant
bit. UTerm
by itself represents zero, which is aliased to U0
.Traits
A type operator that, when implemented for unsigned integer
N
, sets the bit at position
I
to B
.