use std::iter::FromIterator; #[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] pub struct CharBag(u64); impl CharBag { pub fn is_superset(self, other: CharBag) -> bool { self.0 & other.0 == other.0 } fn insert(&mut self, c: char) { let c = c.to_ascii_lowercase(); if ('a'..='z').contains(&c) { let mut count = self.0; let idx = c as u8 - b'a'; count >>= idx * 2; count = ((count << 1) | 1) & 3; count <<= idx * 2; self.0 |= count; } else if ('0'..='9').contains(&c) { let idx = c as u8 - b'0'; self.0 |= 1 << (idx + 52); } else if c == '-' { self.0 |= 1 << 62; } } } impl Extend for CharBag { fn extend>(&mut self, iter: T) { for c in iter { self.insert(c); } } } impl FromIterator for CharBag { fn from_iter>(iter: T) -> Self { let mut result = Self::default(); result.extend(iter); result } } impl From<&str> for CharBag { fn from(s: &str) -> Self { let mut bag = Self(0); for c in s.chars() { bag.insert(c); } bag } } impl From<&[char]> for CharBag { fn from(chars: &[char]) -> Self { let mut bag = Self(0); for c in chars { bag.insert(*c); } bag } }