Skip to content

Commit 8168d80

Browse files
Speedy37cuviper
authored andcommitted
fix IterU32Digits len returns value is invalid
1 parent d819767 commit 8168d80

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

src/biguint.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2357,7 +2357,7 @@ impl Iterator for IterU32Digits<'_> {
23572357
#[cfg(u64_digit)]
23582358
impl<'a> ExactSizeIterator for IterU32Digits<'a> {
23592359
fn len(&self) -> usize {
2360-
self.data.len() * 2 - usize::from(self.last_hi_is_zero)
2360+
self.data.len() * 2 - usize::from(self.last_hi_is_zero) - usize::from(!self.next_is_lo)
23612361
}
23622362
}
23632363

@@ -3372,3 +3372,45 @@ fn test_pow_biguint() {
33723372

33733373
assert_eq!(BigUint::from(125u8), base.pow(exponent));
33743374
}
3375+
3376+
#[test]
3377+
fn test_iter_u32_digits() {
3378+
let n = BigUint::from(5u8);
3379+
let mut it = n.iter_u32_digits();
3380+
assert_eq!(it.len(), 1);
3381+
assert_eq!(it.next(), Some(5));
3382+
assert_eq!(it.len(), 0);
3383+
assert_eq!(it.next(), None);
3384+
assert_eq!(it.len(), 0);
3385+
assert_eq!(it.next(), None);
3386+
3387+
let n = BigUint::from(112500000000u64);
3388+
let mut it = n.iter_u32_digits();
3389+
assert_eq!(it.len(), 2);
3390+
assert_eq!(it.next(), Some(830850304));
3391+
assert_eq!(it.len(), 1);
3392+
assert_eq!(it.next(), Some(26));
3393+
assert_eq!(it.len(), 0);
3394+
assert_eq!(it.next(), None);
3395+
}
3396+
3397+
#[test]
3398+
fn test_iter_u64_digits() {
3399+
let n = BigUint::from(5u8);
3400+
let mut it = n.iter_u64_digits();
3401+
assert_eq!(it.len(), 1);
3402+
assert_eq!(it.next(), Some(5));
3403+
assert_eq!(it.len(), 0);
3404+
assert_eq!(it.next(), None);
3405+
assert_eq!(it.len(), 0);
3406+
assert_eq!(it.next(), None);
3407+
3408+
let n = BigUint::from(18_446_744_073_709_551_616u128);
3409+
let mut it = n.iter_u64_digits();
3410+
assert_eq!(it.len(), 2);
3411+
assert_eq!(it.next(), Some(0));
3412+
assert_eq!(it.len(), 1);
3413+
assert_eq!(it.next(), Some(1));
3414+
assert_eq!(it.len(), 0);
3415+
assert_eq!(it.next(), None);
3416+
}

0 commit comments

Comments
 (0)