7个版本
使用旧的Rust 2015
0.1.5 | 2020年12月22日 |
---|---|
0.1.4 | 2020年2月1日 |
0.1.3 | 2018年12月6日 |
0.1.2 | 2018年10月8日 |
0.0.0 | 2018年4月21日 |
192 在 无标准库
78 每月下载量
在 10 个crate中(7个直接)使用
38KB
750 行
一个用于C样式位掩码标志集合的类型安全位掩码标志生成器。它可以用于在C API周围创建类型安全的包装器。
bitflags!
宏生成一个管理一组标志的 struct
。标志应仅针对整数类型定义,否则在编译时可能会出现意外的类型错误。
示例
extern crate bitflags;
bitflags::bitflags! {
struct Flags: u32 {
const A = 0b00000001;
const B = 0b00000010;
const C = 0b00000100;
const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
}
}
fn main() {
let e1 = Flags::A | Flags::C;
let e2 = Flags::B | Flags::C;
assert_eq!((e1 | e2), Flags::ABC); // union
assert_eq!((e1 & e2), Flags::C); // intersection
assert_eq!((e1 - e2), Flags::A); // set difference
assert_eq!(!e2, Flags::A); // set complement
}
有关上述 bitflags!
扩展生成的代码的文档,请参阅 example_generated::Flags
。
生成的 struct
也可以通过类型和特性实现进行扩展
extern crate bitflags;
use std::fmt;
bitflags::bitflags! {
struct Flags: u32 {
const A = 0b00000001;
const B = 0b00000010;
}
}
impl Flags {
pub fn clear(&mut self) {
self.bits = 0; // The `bits` field can be accessed from within the
// same module where the `bitflags!` macro was invoked.
}
}
impl fmt::Display for Flags {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "hi!")
}
}
fn main() {
let mut flags = Flags::A | Flags::B;
flags.clear();
assert!(flags.is_empty());
assert_eq!(format!("{}", flags), "hi!");
assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
assert_eq!(format!("{:?}", Flags::B), "B");
}
可见性
默认情况下,生成的结构和相关的标志常量不会被导出至当前模块之外。可以通过在 flags
前添加 pub
将定义导出至当前模块之外。
extern crate bitflags;
mod example {
bitflags::bitflags! {
pub struct Flags1: u32 {
const A = 0b00000001;
}
}
bitflags::bitflags! {
struct Flags2: u32 {
const B = 0b00000010;
}
}
}
fn main() {
let flag1 = example::Flags1::A;
let flag2 = example::Flags2::B; // error: const `B` is private
}
属性
可以通过在 flags
关键字之前放置它们来将属性附加到生成的 struct
。
特性实现
Copy
、Clone
、PartialEq
、Eq
和 Hash
特性通过使用 derive
属性自动派生到 struct
。可以通过在 flags
上提供显式的 derive
属性来派生其他特性。
为 struct
实现了 Extend
和 FromIterator
特性:Extend
添加了迭代过的 struct
实例的并集,而 FromIterator
计算并集。
通过显示内部结构的位值,还实现了 Binary
、Debug
、LowerExp
、Octal
和 UpperExp
特性。
运算符
为生成的 struct
实现了以下运算符特性
BitOr
和BitOrAssign
:并集BitAnd
和BitAndAssign
:交集BitXor
和BitXorAssign
:切换Sub
和SubAssign
:集合差Not
:集合补
方法
以下方法定义于生成的 struct
empty
:空的标志集合all
:所有标志的集合bits
:当前存储的标志的原始值from_bits
:从底层的位表示转换,除非该表示包含不对应于标志的位from_bits_truncate
:从底层的位表示转换,丢弃任何不对应于标志的位is_empty
:如果没有存储任何标志,返回true
is_all
:如果所有标志都已设置,返回true
intersects
:如果self
和other
有共同的标志,返回true
contains
:如果other
中的所有标志都包含在self
中,返回true
insert
:就地插入指定的标志remove
:就地移除指定的标志toggle
:如果指定的标志不存在,则将其插入;如果已存在,则将其移除set
:根据传入的值插入或移除指定的标志
默认值
生成的结构体不会自动实现 Default
特性。
如果您的默认值等于 0
(这等于在生成的结构体上调用 empty()
),您可以直接派生 Default
extern crate bitflags;
bitflags::bitflags! {
// Results in default value with bits: 0
#[derive(Default)]
struct Flags: u32 {
const A = 0b00000001;
const B = 0b00000010;
const C = 0b00000100;
}
}
fn main() {
let derived_default: Flags = Default::default();
assert_eq!(derived_default.bits(), 0);
}
如果您的默认值不等于 0
,则需要自己实现 Default
extern crate bitflags;
bitflags::bitflags! {
struct Flags: u32 {
const A = 0b00000001;
const B = 0b00000010;
const C = 0b00000100;
}
}
// explicit `Default` implementation
impl Default for Flags {
fn default() -> Flags {
Flags::A | Flags::C
}
}
fn main() {
let implemented_default: Flags = Default::default();
assert_eq!(implemented_default, (Flags::A | Flags::C));
}