67 lines · 1.5 KB · Rust
RawDownload
use std::iter::FromIterator; pub fn simple_lowercase(c: char) -> char {    c.to_lowercase().next().unwrap_or(c)} #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]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 = simple_lowercase(c);        if c.is_ascii_lowercase() {            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 c.is_ascii_digit() {            let idx = c as u8 - b'0';            self.0 |= 1 << (idx + 52);        } else if c == '-' {            self.0 |= 1 << 62;        }    }} impl Extend<char> for CharBag {    fn extend<T: IntoIterator<Item = char>>(&mut self, iter: T) {        for c in iter {            self.insert(c);        }    }} impl FromIterator<char> for CharBag {    fn from_iter<T: IntoIterator<Item = char>>(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    }}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t