#cell #aliasing #experimental #borrowing #no-alloc #branded

no-std toast-cell

无开销的类型品牌单元,无需运行时检查

1 个不稳定版本

0.3.0 2024年1月2日
0.2.1 2023年12月30日
0.2.0 2023年12月30日
0.1.1 2023年12月29日
0.1.0 2023年12月29日

#689内存管理

每月下载量 36 次

Unlicense 协议

10KB
129 代码行

toast-cell

一种编译时检查别名类型的类型品牌单元。

感谢 GhostCell 项目为这种模式奠定了基础,以及感谢 matthieu-m 创建了 ghost-cell crate


lib.rs:

toast_cell

一种编译时检查别名类型的类型品牌单元。

它基于 GhostCell 的先前工作,但用类型品牌交换了生命周期品牌。

安全性

与 GhostCell 不同,这个crate尚未经过正式证明。使用风险自负。

用法

此 crate 的接口与 GhostCell 的接口非常相似。主要区别在于 Token 需要从 type-factory 获取类型品牌,而不是生成的生命周期品牌。

use toast_cell::{type_factory, Cell, Token};

// 1. Create a brand type.
type_factory::with(|brand| {
    // 2. Make a unique `Token` out of it.
    //    The brand is consumed, so it cannot be used by any other token.
    let mut token = Token::new(brand);

    // 3. Use it with some `Cell`s.
    let cell = Cell::new(0);
    let references = [&cell, &cell, &cell];
    for cell in references {
        *cell.borrow_mut(&mut token) += 1;
    }

    assert_eq!(cell.into_inner(), 3);
});

由于生成的品牌类型不能复制并且会被消耗,每个 Token 都保证与任何其他 Token 独一无二。

品牌类型还保证使用一个 token 的 Cell 与其他 token 不兼容。

type_factory::with(|initial| {
    let (brand, other_brand) = type_factory::split(initial);
    let mut token = Token::new(brand);

    let cell = Cell::new(41);
    *cell.borrow_mut(&mut token) += 1;       //

    let mut other_token = Token::new(other_brand);
    *cell.borrow_mut(&mut other_token) -= 1; //
});

它是如何工作的?

此 crate 的文档目前相当稀疏。我建议查看 ghost-cell 的文档以获取有关 GhostCell 实际属性更多信息。

最低支持的 Rust 版本

MSRV 目前为 1.61。

这可能在次要版本之间发生变化。

许可证

我使用 Unlicense 将此 crate 释放到公共领域。

依赖项

~7KB