From 0935196d5ab6d6e67d64ebae2c1805e6070e0242 Mon Sep 17 00:00:00 2001 From: Kier Davis Date: Sat, 6 Jan 2024 12:03:59 +0000 Subject: [PATCH] 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. --- src/style/attributes.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/style/attributes.rs b/src/style/attributes.rs index 7acd02e5f..aa481c3a4 100644 --- a/src/style/attributes.rs +++ b/src/style/attributes.rs @@ -62,6 +62,26 @@ impl BitXor for 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. /// If it's already set, this does nothing. #[inline(always)] @@ -117,4 +137,11 @@ mod tests { attributes.toggle(Attribute::Bold); 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)); + } }