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, aka B1.

Asserts that two types are the same.

cmpDeprecated

A 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 variant core::cmp::Ordering::Equal.

A potential output from Cmp, this is the type equivalent to the enum variant core::cmp::Ordering::Greater.

A potential output from Cmp, this is the type equivalent to the enum variant core::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 to UInt, 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, 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.

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 and Rhs. It provides a similar functionality to the function core::cmp::Ord::cmp but for types.

A type operator that computes the greatest common divisor of Self and Rhs.

The marker trait for compile time signed integers.

A type operator that returns True if Self == Rhs, otherwise returns False.

A type operator that returns True if Self > Rhs, otherwise returns False.

A type operator that returns True if Self >= Rhs, otherwise returns False.

A type operator that returns True if Self < Rhs, otherwise returns False.

A type operator that returns True if Self <= Rhs, otherwise returns False.

A type operator that returns True if Self != Rhs, otherwise returns False.

A type operator that gives the length of an Array or the number of bits in a UInt.

A type operator for taking the integer binary logarithm of Self.

A type operator that returns the maximum of Self and Rhs.

A type operator that returns the minimum of Self and Rhs.

A marker trait to designate that a type is not zero. All number types in this crate implement NonZero except B0, U0, and Z0.

A Marker trait for the types Greater, Equal, and Less.

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 as Self, 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, and Z0 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