/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; |