Coverage Report

Created: 2026-03-23 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bnum-0.12.1/src/buint/mod.rs
Line
Count
Source
1
use crate::errors::{self, option_expect};
2
3
use crate::digit;
4
use crate::doc;
5
use crate::ExpType;
6
// use core::mem::MaybeUninit;
7
8
#[cfg(feature = "serde")]
9
use ::{
10
    serde::{Deserialize, Serialize},
11
    serde_big_array::BigArray,
12
};
13
14
#[cfg(feature = "borsh")]
15
use ::{
16
    alloc::string::ToString,
17
    borsh::{BorshDeserialize, BorshSchema, BorshSerialize},
18
};
19
20
use core::default::Default;
21
22
use core::iter::{Iterator, Product, Sum};
23
24
macro_rules! mod_impl {
25
    ($BUint: ident, $BInt: ident, $Digit: ident) => {
26
        /// Unsigned integer type composed of
27
        #[doc = concat!("`", stringify!($Digit), "`")]
28
        /// digits, of arbitrary fixed size which must be known at compile time.
29
        ///
30
        /// Digits are stored in little endian (least significant digit first). This integer type aims to exactly replicate the behaviours of Rust's built-in unsigned integer types: `u8`, `u16`, `u32`, `u64`, `u128` and `usize`. The const generic parameter `N` is the number of
31
        #[doc = concat!("`", stringify!($Digit), "`")]
32
        /// digits that are stored.
33
        ///
34
        #[doc = doc::arithmetic_doc!($BUint)]
35
36
        #[derive(Clone, Copy, Hash, PartialEq, Eq)]
37
        #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
38
        #[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize, BorshSchema))]
39
        #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
40
        #[cfg_attr(feature = "valuable", derive(valuable::Valuable))]
41
        #[repr(transparent)]
42
        pub struct $BUint<const N: usize> {
43
            #[cfg_attr(feature = "serde", serde(with = "BigArray"))]
44
            pub(crate) digits: [$Digit; N],
45
        }
46
47
        #[cfg(feature = "zeroize")]
48
        impl<const N: usize> zeroize::DefaultIsZeroes for $BUint<N> {}
49
50
        impl<const N: usize> $BUint<N> {
51
            #[doc = doc::count_ones!(U 1024)]
52
            #[must_use = doc::must_use_op!()]
53
            #[inline]
54
0
            pub const fn count_ones(self) -> ExpType {
55
0
                let mut ones = 0;
56
0
                let mut i = 0;
57
0
                while i < N {
58
0
                    ones += self.digits[i].count_ones() as ExpType;
59
0
                    i += 1;
60
0
                }
61
0
                ones
62
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::count_ones
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::count_ones
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::count_ones
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::count_ones
63
64
            #[doc = doc::count_zeros!(U 1024)]
65
            #[must_use = doc::must_use_op!()]
66
            #[inline]
67
0
            pub const fn count_zeros(self) -> ExpType {
68
0
                let mut zeros = 0;
69
0
                let mut i = 0;
70
0
                while i < N {
71
0
                    zeros += self.digits[i].count_zeros() as ExpType;
72
0
                    i += 1;
73
0
                }
74
0
                zeros
75
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::count_zeros
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::count_zeros
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::count_zeros
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::count_zeros
76
77
            #[doc = doc::leading_zeros!(U 1024)]
78
            #[must_use = doc::must_use_op!()]
79
            #[inline]
80
0
            pub const fn leading_zeros(self) -> ExpType {
81
0
                let mut zeros = 0;
82
0
                let mut i = N;
83
0
                while i > 0 {
84
0
                    i -= 1;
85
0
                    let digit = self.digits[i];
86
0
                    zeros += digit.leading_zeros() as ExpType;
87
0
                    if digit != $Digit::MIN {
88
0
                        break;
89
0
                    }
90
                }
91
0
                zeros
92
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<17>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<1>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<2>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<3>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<4>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<5>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<6>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<7>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<8>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<9>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<10>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<11>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<12>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<13>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<14>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<15>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUint<_>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::leading_zeros
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::leading_zeros
93
94
            #[doc = doc::trailing_zeros!(U 1024)]
95
            #[must_use = doc::must_use_op!()]
96
            #[inline]
97
0
            pub const fn trailing_zeros(self) -> ExpType {
98
0
                let mut zeros = 0;
99
0
                let mut i = 0;
100
0
                while i < N {
101
0
                    let digit = self.digits[i];
102
0
                    zeros += digit.trailing_zeros() as ExpType;
103
0
                    if digit != $Digit::MIN {
104
0
                        break;
105
0
                    }
106
0
                    i += 1;
107
                }
108
0
                zeros
109
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::trailing_zeros
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::trailing_zeros
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::trailing_zeros
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::trailing_zeros
110
111
            #[doc = doc::leading_ones!(U 1024, MAX)]
112
            #[must_use = doc::must_use_op!()]
113
            #[inline]
114
0
            pub const fn leading_ones(self) -> ExpType {
115
0
                let mut ones = 0;
116
0
                let mut i = N;
117
0
                while i > 0 {
118
0
                    i -= 1;
119
0
                    let digit = self.digits[i];
120
0
                    ones += digit.leading_ones() as ExpType;
121
0
                    if digit != $Digit::MAX {
122
0
                        break;
123
0
                    }
124
                }
125
0
                ones
126
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::leading_ones
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::leading_ones
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::leading_ones
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::leading_ones
127
128
            #[doc = doc::trailing_ones!(U 1024)]
129
            #[must_use = doc::must_use_op!()]
130
            #[inline]
131
0
            pub const fn trailing_ones(self) -> ExpType {
132
0
                let mut ones = 0;
133
0
                let mut i = 0;
134
0
                while i < N {
135
0
                    let digit = self.digits[i];
136
0
                    ones += digit.trailing_ones() as ExpType;
137
0
                    if digit != $Digit::MAX {
138
0
                        break;
139
0
                    }
140
0
                    i += 1;
141
                }
142
0
                ones
143
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::trailing_ones
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::trailing_ones
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::trailing_ones
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::trailing_ones
144
145
            #[doc = doc::cast_signed!(U)]
146
            #[must_use = doc::must_use_op!()]
147
            #[inline]
148
0
            pub const fn cast_signed(self) -> $BInt<N> {
149
0
                $BInt::<N>::from_bits(self)
150
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::cast_signed
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::cast_signed
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::cast_signed
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::cast_signed
151
152
            #[inline]
153
0
            const unsafe fn rotate_digits_left(self, n: usize) -> Self {
154
0
                let mut out = Self::ZERO;
155
0
                let mut i = n;
156
0
                while i < N {
157
0
                    out.digits[i] = self.digits[i - n];
158
0
                    i += 1;
159
0
                }
160
0
                let init_index = N - n;
161
0
                let mut i = init_index;
162
0
                while i < N {
163
0
                    out.digits[i - init_index] = self.digits[i];
164
0
                    i += 1;
165
0
                }
166
167
0
                out
168
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::rotate_digits_left
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::rotate_digits_left
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::rotate_digits_left
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::rotate_digits_left
169
170
            #[inline]
171
0
            const unsafe fn unchecked_rotate_left(self, rhs: ExpType) -> Self {
172
0
                let digit_shift = (rhs >> digit::$Digit::BIT_SHIFT) as usize;
173
0
                let bit_shift = rhs & digit::$Digit::BITS_MINUS_1;
174
175
0
                let mut out = self.rotate_digits_left(digit_shift);
176
177
0
                if bit_shift != 0 {
178
0
                    let carry_shift = digit::$Digit::BITS - bit_shift;
179
0
                    let mut carry = 0;
180
181
0
                    let mut i = 0;
182
0
                    while i < N {
183
0
                        let current_digit = out.digits[i];
184
0
                        out.digits[i] = (current_digit << bit_shift) | carry;
185
0
                        carry = current_digit >> carry_shift;
186
0
                        i += 1;
187
0
                    }
188
0
                    out.digits[0] |= carry;
189
0
                }
190
191
0
                out
192
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::unchecked_rotate_left
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::unchecked_rotate_left
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::unchecked_rotate_left
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::unchecked_rotate_left
193
194
            const BITS_MINUS_1: ExpType = (Self::BITS - 1) as ExpType;
195
196
            #[doc = doc::rotate_left!(U 256, "u")]
197
            #[must_use = doc::must_use_op!()]
198
            #[inline]
199
0
            pub const fn rotate_left(self, n: ExpType) -> Self {
200
                unsafe {
201
0
                    self.unchecked_rotate_left(n & Self::BITS_MINUS_1)
202
                }
203
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::rotate_left
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::rotate_left
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::rotate_left
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::rotate_left
204
205
            #[doc = doc::rotate_right!(U 256, "u")]
206
            #[must_use = doc::must_use_op!()]
207
            #[inline]
208
0
            pub const fn rotate_right(self, n: ExpType) -> Self {
209
0
                let n = n & Self::BITS_MINUS_1;
210
                unsafe {
211
0
                    self.unchecked_rotate_left(Self::BITS as ExpType - n)
212
                }
213
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::rotate_right
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::rotate_right
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::rotate_right
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::rotate_right
214
215
            const N_MINUS_1: usize = N - 1;
216
217
            #[doc = doc::swap_bytes!(U 256, "u")]
218
            #[must_use = doc::must_use_op!()]
219
            #[inline]
220
0
            pub const fn swap_bytes(self) -> Self {
221
0
                let mut uint = Self::ZERO;
222
0
                let mut i = 0;
223
0
                while i < N {
224
0
                    uint.digits[i] = self.digits[Self::N_MINUS_1 - i].swap_bytes();
225
0
                    i += 1;
226
0
                }
227
0
                uint
228
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::swap_bytes
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::swap_bytes
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::swap_bytes
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::swap_bytes
229
230
            #[doc = doc::reverse_bits!(U 256, "u")]
231
            #[must_use = doc::must_use_op!()]
232
            #[inline]
233
0
            pub const fn reverse_bits(self) -> Self {
234
0
                let mut uint = Self::ZERO;
235
0
                let mut i = 0;
236
0
                while i < N {
237
0
                    uint.digits[i] = self.digits[Self::N_MINUS_1 - i].reverse_bits();
238
0
                    i += 1;
239
0
                }
240
0
                uint
241
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::reverse_bits
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::reverse_bits
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::reverse_bits
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::reverse_bits
242
243
            #[doc = doc::pow!(U 256)]
244
            #[must_use = doc::must_use_op!()]
245
            #[inline]
246
0
            pub const fn pow(self, exp: ExpType) -> Self {
247
                #[cfg(debug_assertions)]
248
                return self.strict_pow(exp);
249
250
                #[cfg(not(debug_assertions))]
251
0
                self.wrapping_pow(exp)
252
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::pow
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::pow
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::pow
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::pow
253
254
            #[doc = doc::div_euclid!(U)]
255
            #[must_use = doc::must_use_op!()]
256
            #[inline]
257
0
            pub const fn div_euclid(self, rhs: Self) -> Self {
258
0
                self.wrapping_div_euclid(rhs)
259
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::div_euclid
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::div_euclid
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::div_euclid
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::div_euclid
260
261
262
            #[doc = doc::rem_euclid!(U)]
263
            #[must_use = doc::must_use_op!()]
264
            #[inline]
265
0
            pub const fn rem_euclid(self, rhs: Self) -> Self {
266
0
                self.wrapping_rem_euclid(rhs)
267
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::rem_euclid
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::rem_euclid
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::rem_euclid
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::rem_euclid
268
269
            #[doc = doc::doc_comment! {
270
                U 256,
271
                "Returns `true` if and only if `self == 2^k` for some integer `k`.",
272
273
                "let n = " stringify!(U256) "::from(1u16 << 14);\n"
274
                "assert!(n.is_power_of_two());\n"
275
                "let m = " stringify!(U256) "::from(100u8);\n"
276
                "assert!(!m.is_power_of_two());"
277
            }]
278
            #[must_use]
279
            #[inline]
280
0
            pub const fn is_power_of_two(self) -> bool {
281
0
                let mut i = 0;
282
0
                let mut ones = 0;
283
0
                while i < N {
284
0
                    ones += (&self.digits)[i].count_ones();
285
0
                    if ones > 1 {
286
0
                        return false;
287
0
                    }
288
0
                    i += 1;
289
                }
290
0
                ones == 1
291
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::is_power_of_two
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::is_power_of_two
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::is_power_of_two
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::is_power_of_two
292
293
            #[doc = doc::next_power_of_two!(U 256, "0", "ZERO")]
294
            #[must_use = doc::must_use_op!()]
295
            #[inline]
296
0
            pub const fn next_power_of_two(self) -> Self {
297
                #[cfg(debug_assertions)]
298
                return option_expect!(
299
                    self.checked_next_power_of_two(),
300
                    errors::err_msg!("attempt to calculate next power of two with overflow")
301
                );
302
                #[cfg(not(debug_assertions))]
303
0
                self.wrapping_next_power_of_two()
304
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::next_power_of_two
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::next_power_of_two
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::next_power_of_two
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::next_power_of_two
305
306
            #[doc = doc::midpoint!(U)]
307
            #[must_use = doc::must_use_op!()]
308
            #[inline]
309
0
            pub const fn midpoint(self, rhs: Self) -> Self {
310
                // see section 2.5: Average of Two Integers in Hacker's Delight
311
0
                self.bitand(rhs).add(self.bitxor(rhs).shr(1))
312
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::midpoint
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::midpoint
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::midpoint
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::midpoint
313
314
            #[doc = doc::ilog2!(U)]
315
            #[must_use = doc::must_use_op!()]
316
            #[inline]
317
0
            pub const fn ilog2(self) -> ExpType {
318
0
                option_expect!(
319
0
                    self.checked_ilog2(),
320
                    errors::err_msg!(errors::non_positive_log_message!())
321
                )
322
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<17>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<3>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<4>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<5>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<6>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<7>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<8>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<9>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<10>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<11>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<12>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<13>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<14>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<15>>::ilog2
Unexecuted instantiation: <bnum::buint::BUint<_>>::ilog2
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::ilog2
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::ilog2
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::ilog2
323
324
            #[doc = doc::ilog10!(U)]
325
            #[must_use = doc::must_use_op!()]
326
            #[inline]
327
0
            pub const fn ilog10(self) -> ExpType {
328
0
                option_expect!(
329
0
                    self.checked_ilog10(),
330
                    errors::err_msg!(errors::non_positive_log_message!())
331
                )
332
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::ilog10
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::ilog10
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::ilog10
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::ilog10
333
334
            #[doc = doc::ilog!(U)]
335
            #[must_use = doc::must_use_op!()]
336
            #[inline]
337
0
            pub const fn ilog(self, base: Self) -> ExpType {
338
0
                if base.le(&Self::ONE) {
339
0
                    panic!("{}", errors::err_msg!(errors::invalid_log_base!()));
340
0
                }
341
0
                option_expect!(
342
0
                    self.checked_ilog(base), errors::err_msg!(errors::non_positive_log_message!())
343
                )
344
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::ilog
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::ilog
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::ilog
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::ilog
345
346
            #[doc = doc::abs_diff!(U)]
347
            #[must_use = doc::must_use_op!()]
348
            #[inline]
349
0
            pub const fn abs_diff(self, other: Self) -> Self {
350
0
                if self.lt(&other) {
351
0
                    other.wrapping_sub(self)
352
                } else {
353
0
                    self.wrapping_sub(other)
354
                }
355
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::abs_diff
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::abs_diff
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::abs_diff
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::abs_diff
356
357
            #[doc = doc::next_multiple_of!(U)]
358
            #[must_use = doc::must_use_op!()]
359
            #[inline]
360
0
            pub const fn next_multiple_of(self, rhs: Self) -> Self {
361
0
                let rem = self.wrapping_rem(rhs);
362
0
                if rem.is_zero() {
363
0
                    self
364
                } else {
365
0
                    self.add(rhs.sub(rem))
366
                }
367
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::next_multiple_of
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::next_multiple_of
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::next_multiple_of
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::next_multiple_of
368
369
            #[doc = doc::div_floor!(U)]
370
            #[must_use = doc::must_use_op!()]
371
            #[inline]
372
0
            pub const fn div_floor(self, rhs: Self) -> Self {
373
0
                self.wrapping_div(rhs)
374
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::div_floor
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::div_floor
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::div_floor
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::div_floor
375
376
            #[doc = doc::div_ceil!(U)]
377
            #[must_use = doc::must_use_op!()]
378
            #[inline]
379
0
            pub const fn div_ceil(self, rhs: Self) -> Self {
380
0
                let (div, rem) = self.div_rem(rhs);
381
0
                if rem.is_zero() {
382
0
                    div
383
                } else {
384
0
                    div.add(Self::ONE)
385
                }
386
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_>>::div_ceil
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::div_ceil
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::div_ceil
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::div_ceil
387
        }
388
389
        impl<const N: usize> $BUint<N> {
390
            #[inline]
391
0
            pub(crate) const unsafe fn unchecked_shl_internal(self, rhs: ExpType) -> Self {
392
0
                let mut out = $BUint::ZERO;
393
0
                let digit_shift = (rhs >> digit::$Digit::BIT_SHIFT) as usize;
394
0
                let bit_shift = rhs & digit::$Digit::BITS_MINUS_1;
395
396
                // let num_copies = N.saturating_sub(digit_shift); // TODO: use unchecked_ methods from primitives when these are stablised and constified
397
398
0
                if bit_shift != 0 {
399
0
                    let carry_shift = digit::$Digit::BITS - bit_shift;
400
0
                    let mut carry = 0;
401
402
0
                    let mut i = digit_shift;
403
0
                    while i < N {
404
0
                        let current_digit = self.digits[i - digit_shift];
405
0
                        out.digits[i] = (current_digit << bit_shift) | carry;
406
0
                        carry = current_digit >> carry_shift;
407
0
                        i += 1;
408
0
                    }
409
                } else {
410
0
                    let mut i = digit_shift;
411
0
                    while i < N { // we start i at digit_shift, not 0, since the compiler can elide bounds checks when i < N
412
0
                        out.digits[i] = self.digits[i - digit_shift];
413
0
                        i += 1;
414
0
                    }
415
                }
416
417
0
                out
418
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<17>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<2>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<3>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<4>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<5>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<6>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<7>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<8>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<9>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<10>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<11>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<12>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<13>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<14>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<15>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUint<_>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::unchecked_shl_internal
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::unchecked_shl_internal
419
420
            #[inline]
421
0
            pub(crate) const unsafe fn unchecked_shr_pad_internal<const NEG: bool>(self, rhs: ExpType) -> Self {
422
0
                let mut out = if NEG {
423
0
                    $BUint::MAX
424
                } else {
425
0
                    $BUint::ZERO
426
                };
427
0
                let digit_shift = (rhs >> digit::$Digit::BIT_SHIFT) as usize;
428
0
                let bit_shift = rhs & digit::$Digit::BITS_MINUS_1;
429
430
0
                let num_copies = N.saturating_sub(digit_shift); // TODO: use unchecked_ methods from primitives when these are stablised and constified
431
432
0
                if bit_shift != 0 {
433
0
                    let carry_shift = digit::$Digit::BITS - bit_shift;
434
0
                    let mut carry = 0;
435
436
0
                    let mut i = digit_shift;
437
0
                    while i < N { // we use an increment while loop because the compiler can elide the array bounds check, which results in big performance gains
438
0
                        let index = N - 1 - i;
439
0
                        let current_digit = self.digits[index + digit_shift];
440
0
                        out.digits[index] = (current_digit >> bit_shift) | carry;
441
0
                        carry = current_digit << carry_shift;
442
0
                        i += 1;
443
0
                    }
444
445
0
                    if NEG {
446
0
                        out.digits[num_copies - 1] |= $Digit::MAX << carry_shift;
447
0
                    }
448
                } else {
449
0
                    let mut i = digit_shift;
450
0
                    while i < N { // we start i at digit_shift, not 0, since the compiler can elide bounds checks when i < N
451
0
                        out.digits[i - digit_shift] = self.digits[i];
452
0
                        i += 1;
453
0
                    }
454
                }
455
456
0
                out
457
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<17>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<2>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<3>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<4>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<5>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<6>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<7>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<8>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<9>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<10>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<11>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<12>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<13>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<14>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUint<15>>::unchecked_shr_pad_internal::<false>
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::unchecked_shr_pad_internal::<_>
Unexecuted instantiation: <bnum::buint::BUint<_>>::unchecked_shr_pad_internal::<_>
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::unchecked_shr_pad_internal::<_>
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::unchecked_shr_pad_internal::<_>
458
459
0
            pub(crate) const unsafe fn unchecked_shr_internal(u: $BUint<N>, rhs: ExpType) -> $BUint<N> {
460
0
                Self::unchecked_shr_pad_internal::<false>(u, rhs)
461
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<17>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<2>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<3>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<4>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<5>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<6>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<7>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<8>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<9>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<10>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<11>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<12>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<13>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<14>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<15>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUint<_>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::unchecked_shr_internal
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::unchecked_shr_internal
462
463
            #[doc = doc::bits!(U 256)]
464
            #[must_use]
465
            #[inline]
466
0
            pub const fn bits(&self) -> ExpType {
467
0
                Self::BITS as ExpType - self.leading_zeros()
468
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::bits
Unexecuted instantiation: <bnum::buint::BUint<17>>::bits
Unexecuted instantiation: <bnum::buint::BUint<1>>::bits
Unexecuted instantiation: <bnum::buint::BUint<2>>::bits
Unexecuted instantiation: <bnum::buint::BUint<3>>::bits
Unexecuted instantiation: <bnum::buint::BUint<4>>::bits
Unexecuted instantiation: <bnum::buint::BUint<5>>::bits
Unexecuted instantiation: <bnum::buint::BUint<6>>::bits
Unexecuted instantiation: <bnum::buint::BUint<7>>::bits
Unexecuted instantiation: <bnum::buint::BUint<8>>::bits
Unexecuted instantiation: <bnum::buint::BUint<9>>::bits
Unexecuted instantiation: <bnum::buint::BUint<10>>::bits
Unexecuted instantiation: <bnum::buint::BUint<11>>::bits
Unexecuted instantiation: <bnum::buint::BUint<12>>::bits
Unexecuted instantiation: <bnum::buint::BUint<13>>::bits
Unexecuted instantiation: <bnum::buint::BUint<14>>::bits
Unexecuted instantiation: <bnum::buint::BUint<15>>::bits
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::bits
Unexecuted instantiation: <bnum::buint::BUint<_>>::bits
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::bits
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::bits
469
470
            #[doc = doc::bit!(U 256)]
471
            #[must_use]
472
            #[inline]
473
0
            pub const fn bit(&self, index: ExpType) -> bool {
474
0
                let digit = self.digits[index as usize >> digit::$Digit::BIT_SHIFT];
475
0
                digit & (1 << (index & digit::$Digit::BITS_MINUS_1)) != 0
476
0
            }
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::bit
Unexecuted instantiation: <bnum::buint::BUint<_>>::bit
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::bit
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::bit
477
478
            #[doc = doc::set_bit!(U 256)]
479
            #[inline]
480
0
            pub fn set_bit(&mut self, index: ExpType, value: bool) {
481
0
                let digit = &mut self.digits[index as usize >> digit::$Digit::BIT_SHIFT];
482
0
                let shift = index & digit::$Digit::BITS_MINUS_1;
483
0
                if value {
484
0
                    *digit |= (1 << shift);
485
0
                } else {
486
0
                    *digit &= !(1 << shift);
487
0
                }
488
0
            }
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::set_bit
Unexecuted instantiation: <bnum::buint::BUint<_>>::set_bit
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::set_bit
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::set_bit
489
490
            /// Returns an integer whose value is `2^power`. This is faster than using a shift left on `Self::ONE`.
491
            ///
492
            /// # Panics
493
            ///
494
            /// This function will panic if `power` is greater than or equal to `Self::BITS`.
495
            ///
496
            /// # Examples
497
            ///
498
            /// ```
499
            /// use bnum::types::U256;
500
            ///
501
            /// let power = 11;
502
            /// assert_eq!(U256::power_of_two(11), (1u128 << 11).into());
503
            /// ```
504
            #[must_use]
505
            #[inline]
506
0
            pub const fn power_of_two(power: ExpType) -> Self {
507
0
                let mut out = Self::ZERO;
508
0
                out.digits[power as usize >> digit::$Digit::BIT_SHIFT] = 1 << (power & (digit::$Digit::BITS - 1));
509
0
                out
510
0
            }
Unexecuted instantiation: <bnum::buint::BUint<1>>::power_of_two
Unexecuted instantiation: <bnum::buint::BUint<2>>::power_of_two
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::power_of_two
Unexecuted instantiation: <bnum::buint::BUint<_>>::power_of_two
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::power_of_two
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::power_of_two
511
512
            // #[inline(always)]
513
            // pub(crate) const fn digit(&self, index: usize) -> $Digit {
514
            //     self.digits[index]
515
            // }
516
517
            /// Returns the digits stored in `self` as an array. Digits are little endian (least significant digit first).
518
            #[must_use]
519
            #[inline(always)]
520
0
            pub const fn digits(&self) -> &[$Digit; N] {
521
0
                &self.digits
522
0
            }
Unexecuted instantiation: <bnum::buint::BUint<2>>::digits
Unexecuted instantiation: <bnum::buint::BUint<16>>::digits
Unexecuted instantiation: <bnum::buint::BUint<17>>::digits
Unexecuted instantiation: <bnum::buint::BUint<3>>::digits
Unexecuted instantiation: <bnum::buint::BUint<4>>::digits
Unexecuted instantiation: <bnum::buint::BUint<5>>::digits
Unexecuted instantiation: <bnum::buint::BUint<6>>::digits
Unexecuted instantiation: <bnum::buint::BUint<7>>::digits
Unexecuted instantiation: <bnum::buint::BUint<8>>::digits
Unexecuted instantiation: <bnum::buint::BUint<9>>::digits
Unexecuted instantiation: <bnum::buint::BUint<10>>::digits
Unexecuted instantiation: <bnum::buint::BUint<11>>::digits
Unexecuted instantiation: <bnum::buint::BUint<12>>::digits
Unexecuted instantiation: <bnum::buint::BUint<13>>::digits
Unexecuted instantiation: <bnum::buint::BUint<14>>::digits
Unexecuted instantiation: <bnum::buint::BUint<15>>::digits
Unexecuted instantiation: <bnum::buint::BUint<1>>::digits
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::digits
Unexecuted instantiation: <bnum::buint::BUint<_>>::digits
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::digits
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::digits
523
524
            /// Returns the digits stored in `self` as a mutable array. Digits are little endian (least significant digit first).
525
            #[must_use]
526
            #[inline(always)]
527
0
            pub fn digits_mut(&mut self) -> &mut [$Digit; N] {
528
0
                &mut self.digits
529
0
            }
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::digits_mut
Unexecuted instantiation: <bnum::buint::BUint<_>>::digits_mut
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::digits_mut
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::digits_mut
530
531
            /// Creates a new unsigned integer from the given array of digits. Digits are stored as little endian (least significant digit first).
532
            #[must_use]
533
            #[inline(always)]
534
0
            pub const fn from_digits(digits: [$Digit; N]) -> Self {
535
0
                Self { digits }
536
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<17>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<1>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<2>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<3>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<4>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<5>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<6>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<7>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<8>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<9>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<10>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<11>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<12>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<13>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<14>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<15>>::from_digits
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::from_digits
Unexecuted instantiation: <bnum::buint::BUint<_>>::from_digits
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::from_digits
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::from_digits
537
538
            /// Creates a new unsigned integer from the given digit. The given digit is stored as the least significant digit.
539
            #[must_use]
540
            #[inline(always)]
541
0
            pub const fn from_digit(digit: $Digit) -> Self {
542
0
                let mut out = Self::ZERO;
543
0
                out.digits[0] = digit;
544
0
                out
545
0
            }
Unexecuted instantiation: <bnum::buint::BUint<2>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<16>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<17>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<3>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<4>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<5>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<6>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<7>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<8>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<9>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<10>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<11>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<12>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<13>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<14>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<15>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<1>>::from_digit
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::from_digit
Unexecuted instantiation: <bnum::buint::BUint<_>>::from_digit
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::from_digit
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::from_digit
546
547
            #[doc = doc::is_zero!(U 256)]
548
            #[must_use]
549
            #[inline]
550
0
            pub const fn is_zero(&self) -> bool {
551
0
                let mut i = 0;
552
0
                while i < N {
553
0
                    if (&self.digits)[i] != 0 {
554
0
                        return false;
555
0
                    }
556
0
                    i += 1;
557
                }
558
0
                true
559
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<17>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<1>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<2>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<3>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<4>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<5>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<6>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<7>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<8>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<9>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<10>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<11>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<12>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<13>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<14>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<15>>::is_zero
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::is_zero
Unexecuted instantiation: <bnum::buint::BUint<_>>::is_zero
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::is_zero
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::is_zero
560
561
            #[doc = doc::is_one!(U 256)]
562
            #[must_use]
563
            #[inline]
564
0
            pub const fn is_one(&self) -> bool {
565
0
                if N == 0 || self.digits[0] != 1 {
566
0
                    return false;
567
0
                }
568
0
                let mut i = 1;
569
0
                while i < N {
570
0
                    if (&self.digits)[i] != 0 {
571
0
                        return false;
572
0
                    }
573
0
                    i += 1;
574
                }
575
0
                true
576
0
            }
Unexecuted instantiation: <bnum::buint::BUint<2>>::is_one
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::is_one
Unexecuted instantiation: <bnum::buint::BUint<_>>::is_one
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::is_one
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::is_one
577
578
            #[inline]
579
0
            pub(crate) const fn last_digit_index(&self) -> usize {
580
0
                let mut index = 0;
581
0
                let mut i = 1;
582
0
                while i < N {
583
0
                    if (&self.digits)[i] != 0 {
584
0
                        index = i;
585
0
                    }
586
0
                    i += 1;
587
                }
588
0
                index
589
0
            }
Unexecuted instantiation: <bnum::buint::BUint<16>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<17>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<2>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<3>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<4>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<5>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<6>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<7>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<8>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<9>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<10>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<11>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<12>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<13>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<14>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<15>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUint<_>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::last_digit_index
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::last_digit_index
590
591
            #[allow(unused)]
592
            #[inline]
593
0
            fn square(self) -> Self {
594
                // TODO: optimise this method, this will make exponentiation by squaring faster
595
0
                self * self
596
0
            }
Unexecuted instantiation: <bnum::buint::BUintD8<_>>::square
Unexecuted instantiation: <bnum::buint::BUint<_>>::square
Unexecuted instantiation: <bnum::buint::BUintD32<_>>::square
Unexecuted instantiation: <bnum::buint::BUintD16<_>>::square
597
        }
598
599
        impl<const N: usize> Default for $BUint<N> {
600
            #[doc = doc::default!()]
601
            #[inline]
602
0
            fn default() -> Self {
603
0
                Self::ZERO
604
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_> as core::default::Default>::default
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::default::Default>::default
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::default::Default>::default
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::default::Default>::default
605
        }
606
607
        impl<const N: usize> Product<Self> for $BUint<N> {
608
            #[inline]
609
0
            fn product<I: Iterator<Item = Self>>(iter: I) -> Self {
610
0
                iter.fold(Self::ONE, |a, b| a * b)
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Product>::product::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Product>::product::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Product>::product::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Product>::product::<_>::{closure#0}
611
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Product>::product::<_>
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Product>::product::<_>
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Product>::product::<_>
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Product>::product::<_>
612
        }
613
614
        impl<'a, const N: usize> Product<&'a Self> for $BUint<N> {
615
            #[inline]
616
0
            fn product<I: Iterator<Item = &'a Self>>(iter: I) -> Self {
617
0
                iter.fold(Self::ONE, |a, b| a * b)
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Product<&bnum::buint::BUint<_>>>::product::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Product<&bnum::buint::BUintD8<_>>>::product::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Product<&bnum::buint::BUintD32<_>>>::product::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Product<&bnum::buint::BUintD16<_>>>::product::<_>::{closure#0}
618
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Product<&bnum::buint::BUint<_>>>::product::<_>
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Product<&bnum::buint::BUintD8<_>>>::product::<_>
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Product<&bnum::buint::BUintD32<_>>>::product::<_>
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Product<&bnum::buint::BUintD16<_>>>::product::<_>
619
        }
620
621
        impl<const N: usize> Sum<Self> for $BUint<N> {
622
            #[inline]
623
0
            fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
624
0
                iter.fold(Self::ZERO, |a, b| a + b)
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Sum>::sum::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Sum>::sum::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Sum>::sum::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Sum>::sum::<_>::{closure#0}
625
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Sum>::sum::<_>
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Sum>::sum::<_>
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Sum>::sum::<_>
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Sum>::sum::<_>
626
        }
627
628
        impl<'a, const N: usize> Sum<&'a Self> for $BUint<N> {
629
            #[inline]
630
0
            fn sum<I: Iterator<Item = &'a Self>>(iter: I) -> Self {
631
0
                iter.fold(Self::ZERO, |a, b| a + b)
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Sum<&bnum::buint::BUint<_>>>::sum::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Sum<&bnum::buint::BUintD8<_>>>::sum::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Sum<&bnum::buint::BUintD32<_>>>::sum::<_>::{closure#0}
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Sum<&bnum::buint::BUintD16<_>>>::sum::<_>::{closure#0}
632
0
            }
Unexecuted instantiation: <bnum::buint::BUint<_> as core::iter::traits::accum::Sum<&bnum::buint::BUint<_>>>::sum::<_>
Unexecuted instantiation: <bnum::buint::BUintD8<_> as core::iter::traits::accum::Sum<&bnum::buint::BUintD8<_>>>::sum::<_>
Unexecuted instantiation: <bnum::buint::BUintD32<_> as core::iter::traits::accum::Sum<&bnum::buint::BUintD32<_>>>::sum::<_>
Unexecuted instantiation: <bnum::buint::BUintD16<_> as core::iter::traits::accum::Sum<&bnum::buint::BUintD16<_>>>::sum::<_>
633
        }
634
635
        #[cfg(any(test, feature = "quickcheck"))]
636
        impl<const N: usize> quickcheck::Arbitrary for $BUint<N> {
637
            fn arbitrary(g: &mut quickcheck::Gen) -> Self {
638
                let mut out = Self::ZERO;
639
                for digit in out.digits.iter_mut() {
640
                    *digit = <$Digit as quickcheck::Arbitrary>::arbitrary(g);
641
                }
642
                out
643
            }
644
        }
645
    };
646
}
647
648
#[cfg(test)]
649
crate::test::all_digit_tests! {
650
    use crate::test::{debug_skip, test_bignum, types::utest};
651
652
    crate::int::tests!(utest);
653
654
    test_bignum! {
655
        function: <utest>::next_power_of_two(a: utest),
656
        skip: debug_skip!(a.checked_next_power_of_two().is_none())
657
    }
658
    test_bignum! {
659
        function: <utest>::is_power_of_two(a: utest)
660
    }
661
    test_bignum! {
662
        function: <utest>::cast_signed(a: utest)
663
    }
664
665
    #[test]
666
    fn digits() {
667
        let a = UTEST::MAX;
668
        let digits = *a.digits();
669
        assert_eq!(a, UTEST::from_digits(digits));
670
    }
671
672
    #[test]
673
    fn bit() {
674
        let u = UTEST::from(0b001010100101010101u64);
675
        assert!(u.bit(0));
676
        assert!(!u.bit(1));
677
        // assert!(!u.bit(17));
678
        // assert!(!u.bit(16));
679
        assert!(u.bit(15));
680
    }
681
682
    #[test]
683
    fn is_zero() {
684
        assert!(UTEST::MIN.is_zero());
685
        assert!(!UTEST::MAX.is_zero());
686
        assert!(!UTEST::ONE.is_zero());
687
    }
688
689
    #[test]
690
    fn is_one() {
691
        assert!(UTEST::ONE.is_one());
692
        assert!(!UTEST::MAX.is_one());
693
        assert!(!UTEST::ZERO.is_one());
694
        let mut digits = *super::BUint::<2>::MAX.digits();
695
        digits[0] = 1;
696
        let b = super::BUint::<2>::from_digits(digits);
697
        assert!(!b.is_one());
698
    }
699
700
    #[test]
701
    fn bits() {
702
        let u = UTEST::from(0b1010100101010101u128);
703
        assert_eq!(u.bits(), 16);
704
705
        let u = UTEST::power_of_two(7);
706
        assert_eq!(u.bits(), 8);
707
    }
708
709
    #[test]
710
    fn default() {
711
        assert_eq!(UTEST::default(), utest::default().into());
712
    }
713
714
    #[test]
715
    fn sum() {
716
        let v = vec![&UTEST::ZERO, &UTEST::ONE, &UTEST::TWO, &UTEST::THREE, &UTEST::FOUR];
717
        assert_eq!(UTEST::TEN, v.iter().copied().sum());
718
        assert_eq!(UTEST::TEN, v.into_iter().sum());
719
    }
720
721
    #[test]
722
    fn product() {
723
        let v = vec![&UTEST::ONE, &UTEST::TWO, &UTEST::THREE];
724
        assert_eq!(UTEST::SIX, v.iter().copied().sum());
725
        assert_eq!(UTEST::SIX, v.into_iter().sum());
726
    }
727
}
728
729
crate::macro_impl!(mod_impl);
730
731
mod bigint_helpers;
732
pub mod cast;
733
mod checked;
734
mod cmp;
735
mod const_trait_fillers;
736
mod consts;
737
mod convert;
738
mod div;
739
mod endian;
740
mod fmt;
741
mod mask;
742
mod mul;
743
#[cfg(feature = "numtraits")]
744
mod numtraits;
745
mod ops;
746
mod overflowing;
747
mod radix;
748
mod saturating;
749
mod strict;
750
mod unchecked;
751
mod wrapping;