haar_lib/algo/enum_bit/
superset_asc.rs

1//! ビット列の上位集合を昇順に列挙する
2use std::iter::successors;
3
4/// ビット列としての`a`の上位集合を昇順に列挙するイテレータを返す。
5pub fn super_asc(a: u32, n: u32) -> impl Iterator<Item = u32> {
6    successors(Some(a), move |&t| {
7        let t = (t + 1) | a;
8        (t < 1 << n).then_some(t)
9    })
10}
11
12#[cfg(test)]
13mod tests {
14    use super::*;
15    use test_case::test_case;
16
17    #[test_case(0b11111111, 8)]
18    #[test_case(0b00000000, 8)]
19    #[test_case(0b10101010, 8)]
20    #[test_case(0b00000001, 8)]
21    #[test_case(0b10000000, 8)]
22    #[test_case(0b10000001, 8)]
23    #[test_case(0b11011011, 8)]
24    fn check(x: u32, n: u32) {
25        let a = (0..1 << n).filter(|i| (x & !i) == 0).collect::<Vec<_>>();
26
27        let b = super_asc(x, n).collect::<Vec<_>>();
28
29        assert_eq!(a, b);
30    }
31}