pub struct UInt<U, B> { /* fields omitted */ }
Expand description
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.
In order to keep numbers unique, leading zeros are not allowed, so UInt<UTerm, B0>
is
forbidden.
use typenum::{UInt, UTerm, B0, B1};
type U6 = UInt<UInt<UInt<UTerm, B1>, B1>, B0>;
Instantiates a singleton representing this unsigned integer.
The resulting type after applying the +
operator.
fn add(self, _: B0) -> Self::Output
UInt<U, B0> + B1 = UInt<U + B1>
The resulting type after applying the +
operator.
fn add(self, _: B1) -> Self::Output
UInt<U, B1> + B1 = UInt<U + B1, B0>
The resulting type after applying the +
operator.
fn add(self, _: B1) -> Self::Output
UInt<Ul, B0> + UInt<Ur, B0> = UInt<Ul + Ur, B0>
The resulting type after applying the +
operator.
fn add(self, rhs: UInt<Ur, B0>) -> Self::Output
UInt<Ul, B1> + UInt<Ur, B0> = UInt<Ul + Ur, B1>
The resulting type after applying the +
operator.
fn add(self, rhs: UInt<Ur, B0>) -> Self::Output
UInt<Ul, B0> + UInt<Ur, B1> = UInt<Ul + Ur, B1>
The resulting type after applying the +
operator.
fn add(self, rhs: UInt<Ur, B1>) -> Self::Output
UInt<Ul, B1> + UInt<Ur, B1> = UInt<(Ul + Ur) + B1, B0>
The resulting type after applying the +
operator.
fn add(self, rhs: UInt<Ur, B1>) -> Self::Output
UInt<U, B> + UTerm = UInt<U, B>
The resulting type after applying the +
operator.
Anding unsigned integers.
We use our PrivateAnd
operator and then Trim
the output.
type Output = TrimOut<PrivateAndOut<UInt<Ul, Bl>, Ur>>
The resulting type after applying the &
operator.
fn bitand(self, rhs: Ur) -> Self::Output
UInt<Ul, B0> | UInt<Ur, B0> = UInt<Ul | Ur, B0>
The resulting type after applying the |
operator.
UInt<Ul, B1> | UInt<Ur, B0> = UInt<Ul | Ur, B1>
The resulting type after applying the |
operator.
UInt<Ul, B0> | UInt<Ur, B1> = UInt<Ul | Ur, B1>
The resulting type after applying the |
operator.
UInt<Ul, B1> | UInt<Ur, B1> = UInt<Ul | Ur, B1>
The resulting type after applying the |
operator.
The resulting type after applying the |
operator.
Xoring unsigned integers.
We use our PrivateXor
operator and then Trim
the output.
type Output = TrimOut<PrivateXorOut<UInt<Ul, Bl>, Ur>>
The resulting type after applying the ^
operator.
fn bitxor(self, rhs: Ur) -> Self::Output
impl<U: Clone, B: Clone> Clone for UInt<U, B>
Performs copy-assignment from source
. Read more
The result of the comparison. It should only ever be one of Greater
, Less
, or Equal
.
UInt<Ul, B0>
cmp with UInt<Ur, B0>
: SoFar
is Equal
The result of the comparison. It should only ever be one of Greater
, Less
, or Equal
.
UInt<Ul, B1>
cmp with UInt<Ur, B0>
: SoFar
is Greater
The result of the comparison. It should only ever be one of Greater
, Less
, or Equal
.
UInt<Ul, B1>
cmp with UInt<Ur, B1>
: SoFar
is Equal
The result of the comparison. It should only ever be one of Greater
, Less
, or Equal
.
UInt<Ul, B0>
cmp with UInt<Ur, B1>
: SoFar
is Less
The result of the comparison. It should only ever be one of Greater
, Less
, or Equal
.
The result of the comparison. It should only ever be one of Greater
, Less
, or Equal
.
impl<U: Debug, B: Debug> Debug for UInt<U, B>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
Formats the value using the given formatter. Read more
impl<U: Default, B: Default> Default for UInt<U, B>
Returns the “default value” for a type. Read more
The resulting type after applying the /
operator.
fn div(self, _: UInt<Ur, Br>) -> Self::Output
impl<Ul: Unsigned, Bl: Bit, Ur: Unsigned, Br: Bit> Div<UInt<Ur, Br>> for UInt<Ul, Bl> where
UInt<Ul, Bl>: Len,
Length<UInt<Ul, Bl>>: Sub<B1>,
(): PrivateDiv<UInt<Ul, Bl>, UInt<Ur, Br>, U0, U0, Sub1<Length<UInt<Ul, Bl>>>>,
The resulting type after applying the /
operator.
fn div(self, rhs: UInt<Ur, Br>) -> Self::Output
gcd(x, y) = 2*gcd(x/2, y/2) if both x and y even
The greatest common divisor.
gcd(x, y) = gcd(x, y/2) if x odd and y even
The greatest common divisor.
gcd(x, y) = gcd(x/2, y) if x even and y odd
The greatest common divisor.
impl<Xp, Yp> Gcd<UInt<Yp, B1>> for UInt<Xp, B1> where
UInt<Xp, B1>: Max<UInt<Yp, B1>> + Min<UInt<Yp, B1>>,
UInt<Yp, B1>: Max<UInt<Xp, B1>> + Min<UInt<Xp, B1>>,
Maximum<UInt<Xp, B1>, UInt<Yp, B1>>: Sub<Minimum<UInt<Xp, B1>, UInt<Yp, B1>>>,
Diff<Maximum<UInt<Xp, B1>, UInt<Yp, B1>>, Minimum<UInt<Xp, B1>, UInt<Yp, B1>>>: Gcd<Minimum<UInt<Xp, B1>, UInt<Yp, B1>>>,
gcd(x, y) = gcd([max(x, y) - min(x, y)], min(x, y)) if both x and y odd
This will immediately invoke the case for x even and y odd because the difference of two odd
numbers is an even number.
type Output = Gcf<Diff<Maximum<UInt<Xp, B1>, UInt<Yp, B1>>, Minimum<UInt<Xp, B1>, UInt<Yp, B1>>>, Minimum<UInt<Xp, B1>, UInt<Yp, B1>>>
The greatest common divisor.
impl<U: Hash, B: Hash> Hash for UInt<U, B>
fn hash<__H: Hasher>(&self, state: &mut __H)
Feeds this value into the given [Hasher
]. Read more
1.3.0
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher,
Feeds a slice of this type into the given [Hasher
]. Read more
The length as a type-level unsigned integer.
This function isn’t used in this crate, but may be useful for others.
impl<U, B, Ur> Max<Ur> for UInt<U, B> where
U: Unsigned,
B: Bit,
Ur: Unsigned,
UInt<U, B>: Cmp<Ur> + PrivateMax<Ur, Compare<UInt<U, B>, Ur>>,
The type of the maximum of Self
and Rhs
Method returning the maximum
impl<U, B, Ur> Min<Ur> for UInt<U, B> where
U: Unsigned,
B: Bit,
Ur: Unsigned,
UInt<U, B>: Cmp<Ur> + PrivateMin<Ur, Compare<UInt<U, B>, Ur>>,
The type of the minimum of Self
and Rhs
Method returning the minimum
The resulting type after applying the *
operator.
fn mul(self, _: B0) -> Self::Output
The resulting type after applying the *
operator.
fn mul(self, _: B1) -> Self::Output
UInt<Ul, B0> * UInt<Ur, B> = UInt<(Ul * UInt<Ur, B>), B0>
The resulting type after applying the *
operator.
fn mul(self, rhs: UInt<Ur, B>) -> Self::Output
impl<Ul: Unsigned, B: Bit, Ur: Unsigned> Mul<UInt<Ur, B>> for UInt<Ul, B1> where
Ul: Mul<UInt<Ur, B>>,
UInt<Prod<Ul, UInt<Ur, B>>, B0>: Add<UInt<Ur, B>>,
UInt<Ul, B1> * UInt<Ur, B> = UInt<(Ul * UInt<Ur, B>), B0> + UInt<Ur, B>
The resulting type after applying the *
operator.
fn mul(self, rhs: UInt<Ur, B>) -> Self::Output
UInt<U, B> * UTerm = UTerm
The resulting type after applying the *
operator.
impl<U: Ord, B: Ord> Ord for UInt<U, B>
fn cmp(&self, other: &UInt<U, B>) -> Ordering
This method returns an [Ordering
] between self
and other
. Read more
1.21.0
fn max(self, other: Self) -> Self
Compares and returns the maximum of two values. Read more
1.21.0
fn min(self, other: Self) -> Self
Compares and returns the minimum of two values. Read more
1.50.0
fn clamp(self, min: Self, max: Self) -> Self
Restrict a value to a certain interval. Read more
The type of the result of the division
Method for performing the division
impl<Ul: Unsigned, Bl: Bit, Ur: Unsigned, Br: Bit> PartialDiv<UInt<Ur, Br>> for UInt<Ul, Bl> where
UInt<Ul, Bl>: Div<UInt<Ur, Br>> + Rem<UInt<Ur, Br>, Output = U0>,
The type of the result of the division
Method for performing the division
impl<U: PartialEq, B: PartialEq> PartialEq<UInt<U, B>> for UInt<U, B>
fn eq(&self, other: &UInt<U, B>) -> bool
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
fn ne(&self, other: &UInt<U, B>) -> bool
This method tests for !=
.
impl<U: PartialOrd, B: PartialOrd> PartialOrd<UInt<U, B>> for UInt<U, B>
This method returns an ordering between self
and other
values if one exists. Read more
1.0.0
fn lt(&self, other: &Rhs) -> bool
This method tests less than (for self
and other
) and is used by the <
operator. Read more
1.0.0
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
1.0.0
fn gt(&self, other: &Rhs) -> bool
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
1.0.0
fn ge(&self, other: &Rhs) -> bool
This method tests greater than or equal to (for self
and other
) and is used by the >=
operator. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
The resulting type after applying the %
operator.
fn rem(self, _: UInt<Ur, Br>) -> Self::Output
impl<Ul: Unsigned, Bl: Bit, Ur: Unsigned, Br: Bit> Rem<UInt<Ur, Br>> for UInt<Ul, Bl> where
UInt<Ul, Bl>: Len,
Length<UInt<Ul, Bl>>: Sub<B1>,
(): PrivateDiv<UInt<Ul, Bl>, UInt<Ur, Br>, U0, U0, Sub1<Length<UInt<Ul, Bl>>>>,
The resulting type after applying the %
operator.
fn rem(self, rhs: UInt<Ur, Br>) -> Self::Output
Shifting left any unsigned by a zero bit: U << B0 = U
The resulting type after applying the <<
operator.
fn shl(self, _: B0) -> Self::Output
Shifting left a UInt
by a one bit: UInt<U, B> << B1 = UInt<UInt<U, B>, B0>
The resulting type after applying the <<
operator.
fn shl(self, _: B1) -> Self::Output
impl<U: Unsigned, B: Bit, Ur: Unsigned, Br: Bit> Shl<UInt<Ur, Br>> for UInt<U, B> where
UInt<Ur, Br>: Sub<B1>,
UInt<UInt<U, B>, B0>: Shl<Sub1<UInt<Ur, Br>>>,
Shifting left UInt
by UInt
: X << Y
= UInt(X, B0) << (Y - 1)
The resulting type after applying the <<
operator.
fn shl(self, rhs: UInt<Ur, Br>) -> Self::Output
Shifting left UInt
by UTerm
: UInt<U, B> << UTerm = UInt<U, B>
The resulting type after applying the <<
operator.
Shifting right any unsigned by a zero bit: U >> B0 = U
The resulting type after applying the >>
operator.
fn shr(self, _: B0) -> Self::Output
Shifting right a UInt
by a 1 bit: UInt<U, B> >> B1 = U
The resulting type after applying the >>
operator.
fn shr(self, _: B1) -> Self::Output
Shifting right UInt
by UInt
: UInt(U, B) >> Y
= U >> (Y - 1)
The resulting type after applying the >>
operator.
fn shr(self, rhs: UInt<Ur, Br>) -> Self::Output
Shifting right UInt
by UTerm
: UInt<U, B> >> UTerm = UInt<U, B>
The resulting type after applying the >>
operator.
The resulting type after applying the -
operator.
fn sub(self, _: B0) -> Self::Output
UInt<U, B1> - B1 = UInt<U, B0>
The resulting type after applying the -
operator.
fn sub(self, _: B1) -> Self::Output
UInt<UTerm, B1> - B1 = UTerm
The resulting type after applying the -
operator.
fn sub(self, _: B1) -> Self::Output
UInt<U, B0> - B1 = UInt<U - B1, B1>
The resulting type after applying the -
operator.
fn sub(self, _: B1) -> Self::Output
Subtracting unsigned integers. We just do our PrivateSub
and then Trim
the output.
type Output = TrimOut<PrivateSubOut<UInt<Ul, Bl>, Ur>>
The resulting type after applying the -
operator.
fn sub(self, rhs: Ur) -> Self::Output
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
Method returning the concrete value for the type.
impl<U: Copy, B: Copy> Copy for UInt<U, B>
impl<U: Eq, B: Eq> Eq for UInt<U, B>
impl<U, B> StructuralEq for UInt<U, B>
impl<U, B> StructuralPartialEq for UInt<U, B>
impl<U, B> Send for UInt<U, B> where
B: Send,
U: Send,
impl<U, B> Sync for UInt<U, B> where
B: Sync,
U: Sync,
impl<U, B> Unpin for UInt<U, B> where
B: Unpin,
U: Unpin,
impl<T> Any for T where
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
Immutably borrows from an owned value. Read more
impl<T> BorrowMut<T> for T where
T: ?Sized,
Mutably borrows from an owned value. Read more
The greatest common divisor.
impl<T, U> Into<U> for T where
U: From<T>,
impl<N> Logarithm2 for N where
N: PrivateLogarithm2,
type Output = <N as PrivateLogarithm2>::Output
The result of the integer binary logarithm.
The result of the exponentiation.
This function isn’t used in this crate, but may be useful for others.
It is implemented for primitives. Read more
impl<N, I, B> SetBit<I, B> for N where
N: PrivateSetBit<I, B>,
<N as PrivateSetBit<I, B>>::Output: Trim,
type Output = <<N as PrivateSetBit<I, B>>::Output as Trim>::Output
impl<N> SquareRoot for N where
N: PrivateSquareRoot,
type Output = <N as PrivateSquareRoot>::Output
The result of the integer square root.
impl<T, U> TryFrom<U> for T where
U: Into<T>,
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>