use std::ops::Rem; pub fn gcd(mut a: T, mut b: T) -> T where T: Copy + Default + PartialEq, T: Rem, { let mut c = a % b; while c != T::default() { a = b; b = c; c = a % b; } b } pub struct SetBitIndices { val: T, } impl SetBitIndices { pub fn from_msb(val: T) -> Self { Self { val: val } } } impl Iterator for SetBitIndices { type Item = u32; fn next(&mut self) -> Option { if self.val == 0 { None } else { let pos = u32::BITS - self.val.leading_zeros() - 1; self.val ^= 1 << pos; Some(pos) } } }