【Chrono库】WeekdaySet 星期几集合实现解析(weekday_set.rs)

这是一个 Rust 时间库中的星期几集合 (WeekdaySet) 实现,使用位掩码高效存储和操作星期几集合。

核心设计

数据结构

rust 复制代码
pub struct WeekdaySet(u8); // 使用单个字节存储,第8位始终为0
  • 使用位掩码表示星期几集合
  • 第1-7位分别对应周一至周日
  • 第8位始终为0,保持不变量

主要功能

1. 创建方法

rust 复制代码
// 从数组创建
WeekdaySet::from_array([Mon, Wed, Fri])

// 创建单个星期几
WeekdaySet::single(Mon)

// 预定义常量
WeekdaySet::EMPTY  // 空集
WeekdaySet::ALL    // 包含所有星期

2. 集合操作

rust 复制代码
// 标准集合操作
set1.union(set2)           // 并集
set1.intersection(set2)    // 交集  
set1.difference(set2)      // 差集
set1.symmetric_difference(set2) // 对称差集

// 子集检查
set1.is_subset(set2)

3. 元素操作

rust 复制代码
// 增删元素
set.insert(Mon)  // 返回是否为新元素
set.remove(Mon)  // 返回是否包含该元素

// 查询
set.contains(Mon)
set.is_empty()
set.len()        // 元素数量

4. 迭代功能

rust 复制代码
// 从指定星期开始迭代(可环绕)
let iter = set.iter(Wed)  // 从周三开始
iter.next() → Wed, Fri, Mon, ...

关键技术点

位掩码映射

rust 复制代码
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 类型

使用示例

rust 复制代码
// 创建工作日的集合
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. 内存高效: 仅1字节存储
  2. 性能优秀: 位运算操作
  3. 编译时计算 : 大量 const 方法
  4. 类型安全: 强类型接口
  5. 功能完整: 支持完整集合操作

这个实现展示了 Rust 在系统编程中的优势:零成本抽象、内存安全和高效性能。

相关推荐
DongLi011 天前
rustlings 学习笔记 -- exercises/05_vecs
rust
番茄灭世神2 天前
Rust学习笔记第2篇
rust·编程语言
shimly1234562 天前
(done) 速通 rustlings(20) 错误处理1 --- 不涉及Traits
rust
shimly1234562 天前
(done) 速通 rustlings(19) Option
rust
@atweiwei2 天前
rust所有权机制详解
开发语言·数据结构·后端·rust·内存·所有权
shimly1234562 天前
(done) 速通 rustlings(24) 错误处理2 --- 涉及Traits
rust
shimly1234562 天前
(done) 速通 rustlings(23) 特性 Traits
rust
shimly1234562 天前
(done) 速通 rustlings(17) 哈希表
rust
shimly1234563 天前
(done) 速通 rustlings(15) 字符串
rust
shimly1234563 天前
(done) 速通 rustlings(22) 泛型
rust