【Chrono库】WeekdaySet 星期几集合实现解析(weekday_set.rs)
这是一个 Rust 时间库中的星期几集合 (WeekdaySet) 实现,使用位掩码高效存储和操作星期几集合。
核心设计
数据结构
pub struct WeekdaySet(u8); // 使用单个字节存储,第8位始终为0
- 使用位掩码表示星期几集合
- 第1-7位分别对应周一至周日
- 第8位始终为0,保持不变量
主要功能
1. 创建方法
// 从数组创建
WeekdaySet::from_array([Mon, Wed, Fri])// 创建单个星期几
WeekdaySet::single(Mon)// 预定义常量
WeekdaySet::EMPTY // 空集
WeekdaySet::ALL // 包含所有星期
2. 集合操作
// 标准集合操作
set1.union(set2) // 并集
set1.intersection(set2) // 交集
set1.difference(set2) // 差集
set1.symmetric_difference(set2) // 对称差集// 子集检查
set1.is_subset(set2)
3. 元素操作
// 增删元素
set.insert(Mon) // 返回是否为新元素
set.remove(Mon) // 返回是否包含该元素// 查询
set.contains(Mon)
set.is_empty()
set.len() // 元素数量
4. 迭代功能
// 从指定星期开始迭代(可环绕)
let iter = set.iter(Wed) // 从周三开始
iter.next() → Wed, Fri, Mon, ...
关键技术点
位掩码映射
Weekday::Mon => 0b000_0001 // 第1位
Weekday::Tue => 0b000_0010 // 第2位
Weekday::Wed => 0b000_0100 // 第3位
// ... 以此类推
Weekday::Sun => 0b100_0000 // 第7位
迭代器算法
split_at() 方法将集合按指定星期分割:
before: 从周一到指定星期前一天after: 从指定星期天到周日
迭代时优先处理 after 部分,实现环绕迭代。
性能优化
- 所有操作都是位运算,非常高效
- 大部分方法是
const函数 - 结构体是
Copy类型
使用示例
// 创建工作日的集合
let workdays = WeekdaySet::from_array([Mon, Tue, Wed, Thu, Fri]);// 检查是否包含某天
assert!(workdays.contains(Mon));// 添加周末
let mut all_days = workdays;
all_days.insert(Sat);
all_days.insert(Sun);// 迭代(从周三开始)
for day in all_days.iter(Wed) {println!("{}", day); // 输出: Wed, Thu, Fri, Sat, Sun, Mon, Tue
}
设计优势
- 内存高效: 仅1字节存储
- 性能优秀: 位运算操作
- 编译时计算: 大量
const方法 - 类型安全: 强类型接口
- 功能完整: 支持完整集合操作
这个实现展示了 Rust 在系统编程中的优势:零成本抽象、内存安全和高效性能。
