Skip to content

Commit

Permalink
add functions to allow constructing Attributes in a const context
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kierdavis committed Aug 30, 2023
1 parent 08762b3 commit 84c19ff
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/style/attributes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,24 @@ 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.
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.
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)]
Expand Down Expand Up @@ -117,4 +135,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));
}
}

0 comments on commit 84c19ff

Please sign in to comment.