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);
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
The marker trait for type-level numbers which are a power of two.
A type operator that, when implemented for unsigned integer N
, sets the bit at position
I
to B
.
The marker trait for compile time unsigned integers.