From 890fb130e8855ca617e5f9e55c4c5bb3f08bc3fe Mon Sep 17 00:00:00 2001 From: Laurence Tratt Date: Tue, 8 Jul 2025 16:04:27 +0100 Subject: [PATCH] Implement `FusedIterator` for `Iter{Set,Unset}Bits` --- src/lib.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 099cbeb..8b16615 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ use std::{ cmp::{min, PartialEq}, fmt::{self, Debug}, hash::{Hash, Hasher}, - iter::{DoubleEndedIterator, FromIterator}, + iter::{DoubleEndedIterator, FromIterator, FusedIterator}, mem::{replace, size_of}, ops::{ Bound::{Excluded, Included, Unbounded}, @@ -1182,6 +1182,8 @@ impl DoubleEndedIterator for IterSetBits<'_, T> { } } +impl FusedIterator for IterSetBits<'_, T> {} + #[derive(Clone)] pub struct IterUnsetBits<'a, T: 'a> { vob: &'a Vob, @@ -1260,6 +1262,8 @@ impl DoubleEndedIterator for IterUnsetBits<'_, T> { } } +impl FusedIterator for IterUnsetBits<'_, T> {} + impl PartialEq for Vob { fn eq(&self, other: &Self) -> bool { if self.len != other.len { @@ -1914,6 +1918,21 @@ mod tests { t(&v1, 128.., vec![129, 130, 256]); } + #[test] + fn test_fused() { + let v1 = vob![true]; + let mut i1 = v1.iter_set_bits(..); + assert!(i1.next().is_some()); + assert!(i1.next().is_none()); + assert!(i1.next().is_none()); + + let v2 = vob![false]; + let mut i2 = v2.iter_unset_bits(..); + assert!(i2.next().is_some()); + assert!(i2.next().is_none()); + assert!(i2.next().is_none()); + } + #[test] fn test_eq() { let v1 = Vob::from_iter(vec![true, false]);