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:
		
							parent
							
								
									94fdd586e6
								
							
						
					
					
						commit
						0935196d5a
					
				@ -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));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user