4 个版本
使用旧的 Rust 2015
0.1.3 | 2019年1月7日 |
---|---|
0.1.2 | 2018年5月31日 |
0.1.1 | 2017年12月27日 |
0.1.0 | 2017年12月27日 |
471 在 内存管理 中
1,498 每月下载量
用于 6 个 crates (3 直接)
29KB
226 代码行
slab_typesafe
Rust 的 "slab" 数据结构的类型安全包装器
防止使用显然错误的键使用 slab
#[macro_use]
extern crate slab_typesafe;
declare_slab_token!(StringHandle1);
declare_slab_token!(StringHandle2);
let mut slab1 : Slab<StringHandle1, _> = Slab::new();
let mut slab2 : Slab<StringHandle2, _> = Slab::new();
let hello = slab1.insert("hello");
let world = slab2.insert("world");
slab1[world]; // the type `Slab<StringHandle1, _>` cannot be indexed by `StringHandle2`
slab2.remove(hello); // expected struct `StringHandle2`, found struct `StringHandle1`
```rust
lib.rs
:
Slab 的类型安全包装器。它实现了相同的数据结构和相同的方法,但使用和返回特殊的令牌而不是 usize
值,防止您将它们与其他无关的 usize
值混淆,包括其他 Slab 实例的键。
保护是浅层的,因为令牌实现了 From 和 Into。此外,整个 Slab 可以在包装的类型安全版本和未包装的 usize
版本之间相互转换。
示例
基本的存储和检索。
#[macro_use]
extern crate slab_typesafe;
declare_slab_token!(StringHandle);
let mut slab : Slab<StringHandle, &'static str> = Slab::new();
let hello = slab.insert("hello");
let world = slab.insert("world");
assert_eq!(slab[hello], "hello");
assert_eq!(slab[world], "world");
slab[world] = "earth";
assert_eq!(slab[world], "earth");
如果混淆了句柄,将出现错误
#[macro_use]
extern crate slab_typesafe;
declare_slab_token!(StringHandle1);
declare_slab_token!(StringHandle2);
let mut slab1 : Slab<StringHandle1, _> = Slab::new();
let mut slab2 : Slab<StringHandle2, _> = Slab::new();
let hello = slab1.insert("hello");
let world = slab2.insert("world");
slab1[world]; // the type `Slab<StringHandle1, _>` cannot be indexed by `StringHandle2`
slab2.remove(hello); // expected struct `StringHandle2`, found struct `StringHandle1`
请参阅原始文档中的其余示例 。
文档主要是原始 crates 文档的副本。
依赖关系
~45KB