Crate oberon::inner_types::elliptic_curve::bigint::generic_array::typenum
source · Expand description
This crate provides type-level numbers evaluated at compile time. It depends only on libcore.
The traits defined or used in this crate are used in a typical manner. They can be divided into two categories: marker traits and type operators.
Many of the marker traits have functions defined, but they all do essentially the same thing: convert a type into its runtime counterpart, and are really just there for debugging. For example,
use typenum::{Integer, N4};
assert_eq!(N4::to_i32(), -4);
Type operators are traits that behave as functions at the type level. These are the meat of this library. Where possible, traits defined in libcore have been used, but their attached functions have not been implemented.
For example, the Add
trait is implemented for both unsigned and signed integers, but the
add
function is not. As there are never any objects of the types defined here, it wouldn’t
make sense to implement it. What is important is its associated type Output
, which is where
the addition happens.
use std::ops::Add;
use typenum::{Integer, P3, P4};
type X = <P3 as Add<P4>>::Output;
assert_eq!(<X as Integer>::to_i32(), 7);
In addition, helper aliases are defined for type operators. For example, the above snippet could be replaced with
use typenum::{Integer, Sum, P3, P4};
type X = Sum<P3, P4>;
assert_eq!(<X as Integer>::to_i32(), 7);
Documented in each module is the full list of type operators implemented.
Modules
- A type-level array of type-level numbers.
- Type-level bits.
- Type aliases for many constants.
- Type-level signed integers.
- All of the marker traits used in typenum.
- Aliases for the type operators used in this crate. Their purpose is to increase the ergonomics of performing operations on the types defined here. For even more ergonomics, consider using the
op!
macro instead. - Useful type operators that are not defined in
core::ops
. - Type-level unsigned integers.
Macros
- Asserts that a type is
True
, akaB1
. - Asserts that two types are the same.
- cmpDeprecatedA convenience macro for comparing type numbers. Use
op!
instead. - Convenient type operations.
- Create a new type-level arrray. Only usable on Rust 1.13.0 or newer.
Structs
- The terminating type for type arrays.
- The type-level bit 0.
- The type-level bit 1.
- A potential output from
Cmp
, this is the type equivalent to the enum variantcore::cmp::Ordering::Equal
. - A potential output from
Cmp
, this is the type equivalent to the enum variantcore::cmp::Ordering::Greater
. - A potential output from
Cmp
, this is the type equivalent to the enum variantcore::cmp::Ordering::Less
. - Type-level signed integers with negative sign.
- Type-level signed integers with positive sign.
TArr
is a type that acts as an array of types. It is defined similarly toUInt
, only its values can be more than bits, and it is designed to act as an array. So you can only add two if they have the same number of elements, for example.UInt
is defined recursively, whereB
is the least significant bit andU
is the rest of the number. Conceptually,U
should be bound by the traitUnsigned
andB
should be bound by the traitBit
, 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 toU0
. - The type-level signed integer 0.
Traits
- A type operator that returns the absolute value.
- The marker trait for compile time bits.
- A type operator for comparing
Self
andRhs
. It provides a similar functionality to the functioncore::cmp::Ord::cmp
but for types. - The marker trait for compile time signed integers.
- A type operator that returns
True
ifSelf == Rhs
, otherwise returnsFalse
. - A type operator that returns
True
ifSelf > Rhs
, otherwise returnsFalse
. - A type operator that returns
True
ifSelf >= Rhs
, otherwise returnsFalse
. - A type operator that returns
True
ifSelf < Rhs
, otherwise returnsFalse
. - A type operator that returns
True
ifSelf <= Rhs
, otherwise returnsFalse
. - A type operator that returns
True
ifSelf != Rhs
, otherwise returnsFalse
. - A type operator that gives the length of an
Array
or the number of bits in aUInt
. - A type operator for taking the integer binary logarithm of
Self
. - A type operator that returns the maximum of
Self
andRhs
. - A type operator that returns the minimum of
Self
andRhs
. - A marker trait to designate that a type is not zero. All number types in this crate implement
NonZero
exceptB0
,U0
, andZ0
. - A Marker trait for the types
Greater
,Equal
, andLess
. - Division as a partial function. This type operator performs division just as
Div
, but is only defined when the result is an integer (i.e. there is no remainder). - A type operator that provides exponentiation by repeated squaring.
- The marker trait for type-level numbers which are a power of two.
- A type operator that ensures that
Rhs
is the same asSelf
, it is mainly useful for writing macros that can take arbitrary binary or unary operators. - A type operator for taking the integer square root of
Self
. - A type operator for taking a concrete integer value from a type.
- The marker trait for type-level arrays of type-level numbers.
- The marker trait for compile time unsigned integers.
- A marker trait to designate that a type is zero. Only
B0
,U0
, andZ0
implement this trait.
Type Definitions
- Alias for the associated type of
Abs
:AbsVal<A> = <A as Abs>::Output
- Alias to make it easy to add 1:
Add1<A> = <A as Add<B1>>::Output
- Alias for the associated type of
BitAnd
:And<A, B> = <A as BitAnd<B>>::Output
- Alias for the associated type of
Cmp
:Compare<A, B> = <A as Cmp<B>>::Output
- Alias to make it easy to cube.
Cube<A> = <Square<A> as Mul<A>>::Output
- Alias for the associated type of
Sub
:Diff<A, B> = <A as Sub<B>>::Output
- Alias to make it easy to multiply by 2.
Double<A> = Shleft<A, B1>
- Alias for the associated type of
IsEqual
:Eq<A, B> = <A as IsEqual<B>>::Output
- Alias for the associated type of
Pow
:Exp<A, B> = <A as Pow<B>>::Output
- Alias for the associated type of
Gcd
:Gcf<A, B> = <A as Gcd<B>>::Output>
- Alias for the associated type of
IsGreater
:Gr<A, B> = <A as IsGreater<B>>::Output
- Alias for the associated type of
IsGreaterOrEqual
:GrEq<A, B> = <A as IsGreaterOrEqual<B>>::Output
- Alias for the associated type of
IsLess
:Le<A, B> = <A as IsLess<B>>::Output
- Alias for the associated type of
IsLessOrEqual
:LeEq<A, B> = <A as IsLessOrEqual<B>>::Output
- Alias for the associated type of
Len
:Length<A> = <A as Len>::Output
- Alias for the associated type of
Logarithm2
:Log2<A> = <A as Logarithm2>::Output
- Alias for the associated type of
Max
:Maximum<A, B> = <A as Max<B>>::Output
- Alias for the associated type of
Min
:Minimum<A, B> = <A as Min<B>>::Output
- Alias for the associated type of
Rem
:Mod<A, B> = <A as Rem<B>>::Output
- Alias for the associated type of
Neg
:Negate<A> = <A as Neg>::Output
- Alias for the associated type of
IsNotEqual
:NotEq<A, B> = <A as IsNotEqual<B>>::Output
- Alias for the associated type of
BitOr
:Or<A, B> = <A as BitOr<B>>::Output
- Alias for the associated type of
PartialDiv
:PartialQuot<A, B> = <A as PartialDiv<B>>::Output
- Alias for the associated type of
Mul
:Prod<A, B> = <A as Mul<B>>::Output
- Alias for the associated type of
Div
:Quot<A, B> = <A as Div<B>>::Output
- Alias for the associated type of
Shl
:Shleft<A, B> = <A as Shl<B>>::Output
- Alias for the associated type of
Shr
:Shright<A, B> = <A as Shr<B>>::Output
- Alias for the associated type of
SquareRoot
:Sqrt<A> = <A as SquareRoot>::Output
- Alias to make it easy to square.
Square<A> = <A as Mul<A>>::Output
- Alias to make it easy to subtract 1:
Sub1<A> = <A as Sub<B1>>::Output
- Alias for the associated type of
Add
:Sum<A, B> = <A as Add<B>>::Output
- Alias for the associated type of
BitXor
:Xor<A, B> = <A as BitXor<B>>::Output