padded_number/
resize.rs

1use crate::*;
2
3/// Resize a `PaddedNumber` into a smaller one or one of the same size.
4///
5/// Type system ensures that the new minimum length >= previous minimum length,
6/// and that the new maximum length <= previous maximum length.
7///
8/// ```rust
9/// #![feature(generic_const_exprs)]
10///
11/// # use padded_number_macros::*;
12/// # use crate::padded_number::ResizePaddedNumber;
13/// let a = bound_padded_number!(2, 3, "123");
14/// let b = bound_padded_number!(1, 5, "123").resize();
15/// assert_eq!(a, b)
16/// ```
17///
18/// It being marked at trait makes it possible to define functions which allow
19/// the passing of any padded number which fits into the desired size.
20///
21/// ```rust
22/// # #![feature(generic_const_exprs)]
23/// # use padded_number_macros::*;
24/// # use crate::padded_number::ResizePaddedNumber;
25/// let a = bound_padded_number!(1, 5, "123");
26/// foo_dyn(&a);
27/// foo_impl(a);
28///
29/// let b = bound_padded_number!(2, 4, "123");
30/// foo_dyn(&b);
31/// foo_impl(b);
32///
33/// fn foo_dyn(padded_number: &dyn ResizePaddedNumber<2, 3>) {
34///     let _padded_number = padded_number.resize();
35/// }
36///
37/// fn foo_impl(padded_number: impl ResizePaddedNumber<2, 3>) {
38///     let _padded_number = padded_number.resize();
39/// }
40/// ```
41#[allow(private_bounds)]
42pub trait ResizePaddedNumber<const A_1: u8, const B_1: u8>: private::SealedResize {
43    /// Resize a padded number
44    ///
45    /// Check out the trait-level documentation for more
46    fn resize(&self) -> PaddedNumber<A_1, B_1>;
47}
48
49impl<const A_0: u8, const B_0: u8, const A_1: u8, const B_1: u8> ResizePaddedNumber<A_1, B_1> for PaddedNumber<A_0, B_0>
50where
51    [(); (A_1 - A_0) as usize]:,
52    [(); (B_0 - B_1) as usize]:,
53{
54    fn resize(&self) -> PaddedNumber<A_1, B_1> {
55        let PaddedNumber { leading_zeros, number } = *self;
56        PaddedNumber { leading_zeros, number }
57    }
58}
59
60mod private {
61    use super::*;
62
63    pub(super) trait SealedResize {}
64
65    impl<const A: u8, const B: u8> SealedResize for PaddedNumber<A, B> {}
66}