flag-cell-0.0.1 has been yanked.
flag-cell
Apache-2.0 Licensed
一个用于对值进行“轻量引用 + 逻辑启用/禁用”管理的 Rust 小库。提供 FlagCell(持有者)和 FlagRef(轻量共享引用)两类主要类型,并且实现了在不破坏内存安全、Rust借用规则前提下的逻辑禁用/启用与引用计数检查。
本仓库当前仅实现单线程版本(
src/local.rs);src/sync.rsTODO。
主要特性
- 轻量共享引用(类似于 Rc 但带“逻辑禁用/启用”语义,且仅存在单个Rc(
FlagCell),其余引用皆为Weak(FlagRef)) - 可以临时“禁用”被持有的数据,阻止引用读取内部数据
FlagCell被释放时将自动禁用,且FlagCell可被任意FlagRef复活(仅它死了之后)- 支持安全解包
FlagCell。 - 小巧。
何时使用
- 需要以“软锁/软禁用”方式阻止访问数据(例如:逻辑上挂起某个资源,但不立即释放内存)
- 需要单所有权时得知所有者是否存在
快速开始
将本库作为依赖(仓库暂未发布到 crates.io,可使用 git 依赖):
在 Cargo.toml 中添加(示例):
[]
= { = "https://github.com/Milk-COCO/flag-cell" }
然后在代码中使用:
use *;
主要 API 概览
- 导出(crate 根)
-
FlagCell<T>:持有值的主类型。主要方法(节选):FlagCell::new(value: T) -> FlagCell<T>flag_borrow(&self) -> FlagRef<T>:生成一个FlagRefref_count(&self) -> isize:返回当前引用数量(实现上会减去自身,语义请参阅源码)is_enabled(&self) -> boolenable(&self) -> Option<()>/disable(&self) -> Option<()>try_unwrap(self) -> Result<T, Self>:非 panic 版本的取出内部值unwrap(self) -> T:若存在引用或已禁用会 panic
-
FlagRef<T>:由FlagCell产生的轻量引用(可 Clone)。主要方法(节选):ref_count(&self) -> isize:返回引用计数(实现上对计数的解释与 FlagCell 略有差别,请参见源码)is_enabled(&self) -> boolunsafe fn enable(&self) -> FlagRefOption<()>:强制将数据逻辑启用(逻辑不安全)
-
FlagRefOption<T>:枚举表征引用读取结果的状态:Some(T)、Conflict、Empty、Disabled- 实现了从
FlagRefOption<T>到Option<T>的转换
-
注意:以上 API 概览基于当前 src/local.rs 的实现摘录。若需更详细的每个方法签名与行为(例如 panic 条件与并发安全假设),请查阅源码文档注释。
设计与注意事项(来自源码的重要点)
FlagCell::unwrap()会在存在任何活动FlagRef(ref_count > 0)或被禁用时 panic。try_unwrap()提供了非 panic 的替代,返回Err(self)以便调用者处理。FlagRef提供了一个unsafe fn enable()方法:这是一个“逻辑不安全”操作(不会造成本地内存未定义行为,但可能破坏类型的逻辑契约),需谨慎使用。Drop行为:FlagCell与FlagRef的 drop 在语义上互斥,源码中有专门处理内存释放的逻辑(使用ManuallyDrop、RefCell、Cell<isize>等原语进行手工管理)。
示例与调试
仓库源码(src/local.rs)包含了大量注释与实现细节,建议阅读以理解下列重要点:
- 引用计数如何记录(正负值处理表示启用/禁用状态)
FlagRefOption的几种返回状态以及如何向Option转换try_unwrap与unwrap在不同条件下的行为差异
TODO / 未来工作
- 添加多线程/同步版本(
sync.rs)实现并完善测试 - 发布到 crates.io(目前可通过 git 依赖使用)
- 增加示例与文档
贡献
欢迎 PR 与 Issue。建议流程:
- Fork → 新分支(feature/xxx 或 fix/xxx)
- 添加测试与实现
- 提交 PR 并在描述中附上复现步骤或测试用例
联系
详见仓库所有者首页 Milk-COCO