Add functions to allow constructing Attributes in a const context (#817)

Previously, the only ways to construct new `Attributes` values were
`Attributes::default()` or `Attributes::from(_)`, neither of can be
made `const fn` due to limitations of these standard library traits.
This commit is contained in:
Kier Davis 2024-01-06 12:03:59 +00:00 committed by GitHub
parent 94fdd586e6
commit 0935196d5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -62,6 +62,26 @@ impl BitXor for Attributes {
} }
impl Attributes { impl Attributes {
/// Returns the empty bitset.
#[inline(always)]
pub const fn none() -> Self {
Self(0)
}
/// Returns a copy of the bitset with the given attribute set.
/// If it's already set, this returns the bitset unmodified.
#[inline(always)]
pub const fn with(self, attribute: Attribute) -> Self {
Self(self.0 | attribute.bytes())
}
/// Returns a copy of the bitset with the given attribute unset.
/// If it's not set, this returns the bitset unmodified.
#[inline(always)]
pub const fn without(self, attribute: Attribute) -> Self {
Self(self.0 & !attribute.bytes())
}
/// Sets the attribute. /// Sets the attribute.
/// If it's already set, this does nothing. /// If it's already set, this does nothing.
#[inline(always)] #[inline(always)]
@ -117,4 +137,11 @@ mod tests {
attributes.toggle(Attribute::Bold); attributes.toggle(Attribute::Bold);
assert!(attributes.is_empty()); assert!(attributes.is_empty());
} }
#[test]
fn test_attributes_const() {
const ATTRIBUTES: Attributes = Attributes::none().with(Attribute::Bold).with(Attribute::Italic).without(Attribute::Bold);
assert!(!ATTRIBUTES.has(Attribute::Bold));
assert!(ATTRIBUTES.has(Attribute::Italic));
}
} }