13 releases (7 breaking)
0.8.5 | Nov 7, 2023 |
---|---|
0.8.3 | Aug 30, 2023 |
0.8.2 | Jul 3, 2023 |
#626 in Rust patterns
21KB
175 lines
uX2: A better uX
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.
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.
Click here for me details
```bash
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo clean
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo build --no-default-features --features 8
Compiling proc-macro2 v1.0.56
Compiling unicode-ident v1.0.8
Compiling quote v1.0.26
Compiling ux2-macros v0.7.0 (/home/jonathan/Projects/ux2/ux2-macros)
Compiling ux2 v0.7.0 (/home/jonathan/Projects/ux2/ux2)
Finished dev [unoptimized + debuginfo] target(s) in 3.00s
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo clean
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo build --no-default-features --features 16
Compiling proc-macro2 v1.0.56
Compiling quote v1.0.26
Compiling unicode-ident v1.0.8
Compiling ux2-macros v0.7.0 (/home/jonathan/Projects/ux2/ux2-macros)
Compiling ux2 v0.7.0 (/home/jonathan/Projects/ux2/ux2)
Finished dev [unoptimized + debuginfo] target(s) in 7.36s
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo clean
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo build --no-default-features --features 32
Compiling proc-macro2 v1.0.56
Compiling unicode-ident v1.0.8
Compiling quote v1.0.26
Compiling ux2-macros v0.7.0 (/home/jonathan/Projects/ux2/ux2-macros)
Compiling ux2 v0.7.0 (/home/jonathan/Projects/ux2/ux2)
Finished dev [unoptimized + debuginfo] target(s) in 29.96s
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo clean
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo build --no-default-features --features 64
Compiling proc-macro2 v1.0.56
Compiling unicode-ident v1.0.8
Compiling quote v1.0.26
Compiling ux2-macros v0.7.0 (/home/jonathan/Projects/ux2/ux2-macros)
Compiling ux2 v0.7.0 (/home/jonathan/Projects/ux2/ux2)
Finished dev [unoptimized + debuginfo] target(s) in 3m 26s
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo clean
jonathan@jonathan-System-Product-Name:~/Projects/ux2/ux2$ cargo build --no-default-features --features 128
Compiling proc-macro2 v1.0.56
Compiling unicode-ident v1.0.8
Compiling quote v1.0.26
Compiling ux2-macros v0.7.0 (/home/jonathan/Projects/ux2/ux2-macros)
Compiling ux2 v0.7.0 (/home/jonathan/Projects/ux2/ux2)
Finished dev [unoptimized + debuginfo] target(s) in 46m 22s
```
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.
- https://github.com/rust-ux/uX/issues/55
- https://github.com/rust-ux/uX/issues/54
- https://github.com/rust-ux/uX/issues/53
- https://github.com/rust-ux/uX/issues/17
Why didn't I just post a PR on uX?
- 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.
- 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.
Dependencies
~230KB