Skip to main content

fastnum/bint/uint/
checked.rs

1use crate::bint::{
2    checked::checked_impl,
3    doc,
4    intrinsics::ExpType,
5    uint::{math, powers},
6    utils::tuple_to_option,
7    Int, UInt,
8};
9
10checked_impl!(UInt, U);
11
12impl<const N: usize> UInt<N> {
13    #[doc = doc::checked::checked_add_signed!(U 256)]
14    #[must_use = doc::must_use_op!()]
15    #[inline(always)]
16    pub const fn checked_add_signed(self, rhs: Int<N>) -> Option<Self> {
17        tuple_to_option(self.overflowing_add_signed(rhs))
18    }
19
20    #[doc = doc::checked::checked_mul!(U 256)]
21    #[must_use = doc::must_use_op!()]
22    #[inline(always)]
23    pub const fn checked_mul(self, rhs: Self) -> Option<Self> {
24        tuple_to_option(self.overflowing_mul(rhs))
25    }
26
27    #[doc = doc::checked::checked_ilog2!(U 256)]
28    #[must_use = doc::must_use_op!()]
29    #[inline(always)]
30    pub const fn checked_ilog2(self) -> Option<ExpType> {
31        self.0.checked_ilog2()
32    }
33
34    #[doc = doc::checked::checked_ilog10!(U 256)]
35    #[must_use = doc::must_use_op!()]
36    #[inline(always)]
37    pub const fn checked_ilog10(self) -> Option<ExpType> {
38        if self.is_zero() {
39            return None;
40        }
41
42        Some(math::ilog::ilog10(self))
43    }
44
45    #[doc = doc::checked::checked_ilog!(U 256)]
46    #[must_use = doc::must_use_op!()]
47    #[inline(always)]
48    pub const fn checked_ilog(self, base: Self) -> Option<ExpType> {
49        self.0.checked_ilog(base.0)
50    }
51
52    #[doc = doc::checked::checked_next_power_of_two!(U 256)]
53    #[must_use = doc::must_use_op!()]
54    #[inline(always)]
55    pub const fn checked_next_power_of_two(self) -> Option<Self> {
56        match self.0.checked_next_power_of_two() {
57            Some(value) => Some(Self(value)),
58            None => None,
59        }
60    }
61
62    #[doc = doc::checked::checked_power_of_ten!(U 256)]
63    #[must_use = doc::must_use_op!()]
64    #[inline(always)]
65    pub const fn checked_power_of_ten(power: ExpType) -> Option<Self> {
66        powers::checked_power_of_ten(power)
67    }
68
69    #[doc = doc::checked::checked_power_of_five!(U 256)]
70    #[must_use = doc::must_use_op!()]
71    #[inline(always)]
72    pub const fn checked_power_of_five(power: ExpType) -> Option<Self> {
73        powers::checked_power_of_five(power)
74    }
75
76    #[doc = doc::checked::checked_mul_digit!(U 256)]
77    #[must_use = doc::must_use_op!()]
78    #[inline(always)]
79    pub const fn checked_mul_digit(self, digit: u64) -> Option<Self> {
80        tuple_to_option(self.overflowing_mul_digit(digit))
81    }
82
83    #[doc = doc::checked::checked_add!(U 256)]
84    #[must_use = doc::must_use_op!()]
85    #[inline(always)]
86    pub const fn checked_add_digit(self, digit: u64) -> Option<Self> {
87        tuple_to_option(self.overflowing_add_digit(digit))
88    }
89}