checked_num 0.1.1

Overflow-checked numbers for safety without sacrificing ergonomics.
Documentation
# CheckedNum

Overflow-checked numbers for safety without sacrificing ergonomics.

---

## Usage

With `checked_num`

```rust
use checked_num::CheckedU16;

assert_eq!((CheckedU16::new(123) + 210) * 2, 666)
```

Without `checked_num`

```rust
assert!(
    a.checked_add(210)
        .and_then(|num| num.checked_mul(2))
        .and_then(|num| Some(num == 666))
        .is_some_and(|r| r)
);
```

## Features

- `#![no_std]` enabled per default.

- Supports `NonZero<_>` types for zero memory overhead.

- Only depends on `num-traits`.

- Supports checked versions of `Add`, `Sub`, `Mul`, `Div`, `Rem`, `Shl`, `Shr` and `Neg` 

- Wraps `BitAnd`, `BitOr`, `BitXor` and `Inv` for convenience.

## Contributing

Areas for improvement:

- Implement the `?` operator.

- Implement checked casts.

- Introduce a macro that ensures all arithmetic operations are checked,
  preventing unintended unchecked operations due to precedence issues.

- Implement `num_traits::CheckedEuclid` and `num_traits::MulAdd`.

- Add `_Assign` variants for supported operations.

- Expand documentation.

- Add more tests.

## Limitations

Due to the orphan rule, `CheckedNum` types must appear on the left-hand side of mixed-type operations:

```rust
use checked_num::CheckedU16; 
let a = CheckedU16::new(123);
let b = 210; 
assert_eq!(a + b, 333) // correct
```

```compile_fail
use checked_num::CheckedU16;

let a = CheckedU16::new(123);
let b = 210;

assert_eq!(b + a, 333) // fails to compile
```