uint
crate using const-genericsImplements [Uint<BITS, LIMBS>
], the ring of numbers modulo $2^{\mathtt{BITS}}$. It requires two
generic arguments: the number of bits and the number of 64-bit 'limbs' required to store those bits.
```rust
let answer: Uint<256, 4> = Uint::from(42); ```
You can compute LIMBS
yourself using $\mathtt{LIMBS} = \ceil{\mathtt{BITS} / 64}$,
i.e.LIMBS
equals BITS
divided by $64$ rounded up. [Uint
] will panic!
if you try to
construct it with incorrect arguments. Ideally this would be a compile time error, but
that is blocked by Rust issue #60551.
A more convenient method on stable is to use the [uint!
] macro, which constructs the right
[Uint
] for you.
```rust
let answer = uint!(42_U256); ```
You can also use one of the pre-computed type [aliases
]:
```rust
use ruint::aliases::*;
let answer: U256 = Uint::from(42); ```
You can of course also create your own type alias if you need a funny size:
```rust
type U1337 = Uint<1337, 21>;
let answer: U1337 = Uint::from(42); ```
If you are on nightly, you can use [Uint<BITS>
][nightly::Uint] which will
compute the number of limbs for you. Unfortunately this can not be made stable
without generic_const_exprs
support (Rust issue #76560).
```rust
use ruint::nightly::Uint;
let answer: Uint<256> = Uint::<256>::from(42);
```
Even on nightly, the ergonomics of Rust are limited. In the example above Rust
requires explicit type annotation for [Uint::from
], where it did not require
it in the stable version. There are a few more subtle issues that make this
less ideal than it appears. It also looks like it may take some time before
these nightly features are stabilized.
```rust use ruint::{Uint, OverflowingAdd};
let a: Uint<256, 4> = Uint::from(0xf00fu64); let b: Uint<256, 4> = Uint::from(42u64); let (c, carry) = a.overflowingadd(b); asserteq!(c, Uint::from(0xf039u64)); ```
There is a convenient macro [uint!
] to create constants for you. It allows
for arbitrary length constants using standard Rust integer syntax. The size of
the [Uint
] is specified with a U
suffix followed by the number of bits.
The standard Rust syntax of decimal, hexadecimal and even binary and octal is
supported using their prefixes 0x
, 0b
and 0o
. Literals can have
underscores _
added for readability.
```rust
let cow = uint!(0xc85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4_U256); ```
In fact, this macro recurses down the parse tree, so you can apply it to entire source files:
```rust
uint!{
let a = 42U256; let b = 0xf00f1337c0d3U256; let (c, carry) = a.overflowingadd(b); asserteq!(c, 263947537596669U256);
} ```
There is support for a number of crates. These are enabled by setting the identically named feature flag.
rand
: Implements sampling from the Standard
distribution, i.e. rng.gen()
.arbitrary
: Implements the Arbitrary
trait, allowing [Uint
]s to be generated for fuzz testing. quickcheck
: Implements the Arbitrary
trait, allowing [Uint
]s to be generated for property based testing.proptest
: Implements the Arbitrary
trait, allowing [Uint
]s to be generated for property based testing. Proptest is used for the uint
s own test suite.serde
: Implements the Seralize
and Deserialize
traits for [Uint
] using big-endian hex in human readable formats and big-endian byte strings in machine readable formats.rlp
: Implements the Encodable
and Decodable
traits for [Uint
] to allow serialization to/from RLP.fastrlp
: Implements the Encodable
and Decodable
traits for [Uint
] to allow serialization to/from RLP.primitive-types
: Implements the [From<_>
] conversions between corresponding types.Format, lint, build and test everything (I recommend creating a shell alias for this):
sh
cargo fmt &&\
cargo clippy --all-features --all-targets &&\
cargo test --workspace --all-features --doc -- --nocapture &&\
cargo test --workspace --all-features --all-targets -- --nocapture &&\
cargo doc --workspace --all-features --no-deps
Run benchmarks with the provided .cargo/config.toml
alias
sh
cargo criterion
Check documentation coverage
sh
RUSTDOCFLAGS="-Z unstable-options --show-coverage" cargo doc --workspace --all-features --no-deps
Goals:
u64
, etc types. See Rust's integer methods.no-std
and wasm
.Maybe: