#cast #clamp #conversion #saturating #clip #min-max #unsigned-integer

no-std saturating_cast

Library for saturating casts between integer primitives

1 unstable release

0.1.0 Oct 13, 2023

#905 in Math

Download history 1238/week @ 2024-07-19 812/week @ 2024-07-26 1063/week @ 2024-08-02 1189/week @ 2024-08-09 1094/week @ 2024-08-16 1036/week @ 2024-08-23 580/week @ 2024-08-30 1142/week @ 2024-09-06 746/week @ 2024-09-13 820/week @ 2024-09-20 700/week @ 2024-09-27 1037/week @ 2024-10-04 1311/week @ 2024-10-11 1511/week @ 2024-10-18 1085/week @ 2024-10-25 1427/week @ 2024-11-01

5,637 downloads per month

MIT/Apache

19KB
267 lines

saturating_cast

Build Status Crates.io Docs.rs

Library for saturating casts between integer primitives.

Features

  • no_std by default
  • Saturating casts implemented between all of the following:
    • u8, u16, u32, u64, u128, usize
    • i8, i16, i32, i64, i128, isize
  • Saturating traits can be implemented for user types

Description

A saturating cast is a combined clamp and cast from one type to another, conceptually value.clamp(T::MIN, T::MAX) as T.

Example

In the following code, the i32 value is clamped to 255 since u8 has a range of 0..=255 and 1024 is larger than the maximum value that u8 can represent.

In the second snippet, an i8 with negative sign is saturated to 0 when cast to u16 because unsigned integers cannot be negative.

use saturating_cast::SaturatingCast;

let x: i32 = 1024;
let y: u8 = 10;
let z = x.saturating_cast::<u8>() - y;
assert_eq!(245, z);

let a = -128_i8;
let b: u16 = a.saturating_cast();
assert_eq!(0, b);

Saturation does not preserve the original value if the source type value is out of range for the target type: the resulting value will be the minimum or maximum of the target type.

This crate only casts and returns primitive integers. Saturating arithmetic is still required to avoid wraparound in release and panicking in debug mode (or with overflow checks on in release).

License

This crate is licensed under either

at your option.

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.

No runtime deps