Try some optimization

This commit is contained in:
Malte Tammena 2022-12-09 21:41:23 +01:00
parent a3f17cd2b7
commit 05704d9ba1

View file

@ -10,15 +10,16 @@ impl Bitmask {
}
pub const fn from_alpha(alpha: &u8) -> Self {
// 'a' is the LSB, 'Z' is MSB
if *alpha <= b'Z' {
Self(1 << (alpha - b'A' + 26))
} else {
Self(1 << (alpha - b'a'))
}
Self(1 << (alpha - b'A'))
}
/// Get the priority from a rucksack entry
pub const fn to_priority(self) -> super::Prio {
self.0.trailing_zeros() as usize + 1
let log = self.0.trailing_zeros() as u8;
if log < 32 {
log as usize + 27
} else {
log as usize - 31
}
}
}
@ -50,13 +51,21 @@ mod tests {
#[test]
fn bitmask_works() {
assert_eq!(Bitmask::from_alpha(&b'A'), Bitmask(1));
assert_eq!(Bitmask::from_alpha(&b'Z'), Bitmask(1 << 25));
assert_eq!(Bitmask::from_alpha(&b'a'), Bitmask(1 << 32));
assert_eq!(Bitmask::from_alpha(&b'z'), Bitmask(1 << 57));
assert_eq!(
crate::parse_chars::<String>("abc".into()),
Bitmask::from_raw(7)
Bitmask((1 << 32) + (1 << 33) + (1 << 34))
);
assert_eq!(
crate::parse_chars::<String>("Z".into()),
Bitmask::from_raw(1 << 51)
Bitmask::from_raw(1 << 25)
);
assert_eq!(Bitmask::from_alpha(&b'a').to_priority(), 1);
assert_eq!(Bitmask::from_alpha(&b'z').to_priority(), 26);
assert_eq!(Bitmask::from_alpha(&b'A').to_priority(), 27);
assert_eq!(Bitmask::from_alpha(&b'Z').to_priority(), 52);
}
}