Crate ux2

source ·
Expand description

uX2: A better uX

Crates.io docs codecov

Non-standard integer types like u7, u9, u10, u63, i7, i9 etc.

When non-standard-width integers are required in an application, the norm is to use a larger container and make sure the value is within range after manipulation. uX2 aims to take care of this once and for all by providing u1-u127 and i1-i127 types (depending on the enabled features) that offer safe arithmetic operations.

<core::primitive::i32 as core::ops::Add<core::primitive::i32>>::add can panic in Debug or overflow in Release, <ux2::i32 as core::ops::Add<ux2::i32>>::add cannot panic or overflow in Debug or Release, this is because it returns ux2::i33. This is applied for all operations and combinations of types in ux2. This allows for more thorough compile time type checking.

use rand::Rng;
let a = ux2::i4::try_from(3i8).unwrap();
let b = ux2::i8::from(rand::thread_rng().gen::<core::primitive::i8>());
let c: ux2::i9 = a + b;
let d: ux2::i4 = c % a;
let e: core::primitive::i8 = core::primitive::i8::from(d);

uX2 types take up as much space as the smallest integer type that can contain them.

Why does this exist? Why use this over ux?

I noticed uX doesn’t seem to be actively maintained and the current code could use some big changes.

So I did what any reasonable developer does and completely re-invented the wheel.

Behold uX2, slightly better in almost every way.

  • More functionality, with optional support for serde.
  • Better documentation.
  • Better CI (e.g. automated changelog)

I’ve already implemented some of the open issues from uX in this library e.g.

Why didn’t I just post a PR on uX?

  1. Review: The current PRs don’t seem to be getting reviewed, I wasn’t really confident a PR which completely changes the entire library would be merged. 2. Control: If the maintainer/s of uX are inactive there is nothing I can do, I cannot get PRs merged or fix issue, if I have control I can do this.

Features

The 8, 16, 32, 64 and 128 features enable support up to the types of i8/u8, i16/u16, i32/u32, i64/u64 and i128/u128 respectively.

The compile times increase exponentially, 3s, 7s, 30s, 3m and 46m respectively.

Structs

  • A mimic of std::num::ParseIntError that can be constructed on stable.
  • A mimic of std::num::TryFromIntError that can be constructed on stable.
  • The 1-bit signed integer type.
  • The 2-bit signed integer type.
  • The 3-bit signed integer type.
  • The 4-bit signed integer type.
  • The 5-bit signed integer type.
  • The 6-bit signed integer type.
  • The 7-bit signed integer type.
  • The 8-bit signed integer type.
  • The 1-bit unsigned integer type.
  • The 2-bit unsigned integer type.
  • The 3-bit unsigned integer type.
  • The 4-bit unsigned integer type.
  • The 5-bit unsigned integer type.
  • The 6-bit unsigned integer type.
  • The 7-bit unsigned integer type.
  • The 8-bit unsigned integer type.