From 95d5a18e99f00c66a3efa6aabaf8532758a5e560 Mon Sep 17 00:00:00 2001 From: Zac Wilson Date: Mon, 22 Dec 2025 17:19:51 +0000 Subject: [PATCH] Started KeySet type --- src/lib.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 3be75a6..69650c1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -82,6 +82,56 @@ impl InterruptConfig { } } +#[derive(Clone, Copy)] +pub struct KeySet(u128); + +impl KeySet { + fn contains(&self, key_number: u8) -> bool { + (self.0 & (1 << key_number)) != 0 + } +} + +impl core::ops::Not for KeySet { + type Output = KeySet; + + fn not(self) -> Self::Output { + KeySet(!self.0) + } +} + +pub struct KeySetIter { + key_set: KeySet, + shift: u8, +} + +impl core::iter::Iterator for KeySetIter { + type Item = u8; + + fn next(&mut self) -> Option { + let next_shift = self.key_set.0.trailing_zeros() as u8 + 1; + if next_shift >= 128 { + return None; + } + + self.key_set.0 >>= next_shift; + self.shift += next_shift; + + Some(self.shift - 1) + } +} + +impl core::iter::IntoIterator for KeySet { + type Item = u8; + + type IntoIter = KeySetIter; + + fn into_iter(self) -> Self::IntoIter { + KeySetIter { + key_set: self, + shift: 0 + } + } +} impl TCA8418 { pub fn new(