Integers that are constrained within inclusive ranges

License Documentation Crate CI codecov Safety No std Maintenance

Constrained types are represented simply as primitive integers, but their values will always be contained by inclusive range bounds. The range is defined at compile time, by assigning values to appropriate const generic parameters. Constrained types provide fallible APIs for construction and value assignment, they also implement wrapping, saturating, overflowing and checked arithmetics for the range boundaries. See each desired type documentation for more information.

The constrained_int crate relies on the [constguards] crate to define compile time constraints, which itself uses the incomplete [genericconst_exprs] feature. Therefore, this crate can only be compile with nightly, and, more importantly, must be considered as an experimental crate only.

This crate is no_std by default. See features section for more information.

Import

```toml // Cargo.toml

[dependencies] constrained_int = "0.1" ```

Example

```rust use constrained_int::i8::{ConstrainedI8, ConstrainedI8Error};

// Lower bound = -5, upper bound = 10, default = -1. type Constrained = ConstrainedI8<-5, 10, -1>; type ConstrainedError = ConstrainedI8Error<-5, 10>;

fn main() -> Result<(), ConstrainedError> { // Gets the default value. let mut constrained = Constrained::default(); assert_eq!(constrained.get(), -1);

// Sets within inclusive range, succeeds.
constrained.set(-5)?;
assert_eq!(constrained.get(), -5);

// Below lower bound, fails.
assert_eq!(constrained.checked_sub(1), None);
assert_eq!(constrained.get(), -5);

// Saturates at the upper bound.
constrained = constrained.saturating_add(100);
assert_eq!(constrained.get(), 10);

// Sets out of boundary, fails.
assert!(constrained.set(11).is_err());

// Wraps around the upper bound.
constrained = constrained.wrapping_add(1);
assert_eq!(constrained.get(), -5);

Ok(())

} ```

Documentation

This project documentation is hosted at docs.rs.

Feature flags

This crate does not link against the standard library by default, so it is suitable for no_std environments. It does provide a std feature though, that enables the standard library as a dependency. By enabling this crate's std feature, these additional features are provided:

If users already are importing the standard library on their crate, enabling std feature comes at no additional cost.

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Code review

It is recommended to always use [cargo-crev] to verify the trustworthiness of each of your dependencies, including this one.