#slab #type-safe #key #tokens #structure #wrapper #data-structures

slab_typesafe

Slab 的包装器,提供类型安全的令牌而不是 usize

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内存管理

Download history 258/week @ 2024-03-14 379/week @ 2024-03-21 533/week @ 2024-03-28 318/week @ 2024-04-04 402/week @ 2024-04-11 349/week @ 2024-04-18 317/week @ 2024-04-25 313/week @ 2024-05-02 457/week @ 2024-05-09 484/week @ 2024-05-16 538/week @ 2024-05-23 335/week @ 2024-05-30 411/week @ 2024-06-06 320/week @ 2024-06-13 404/week @ 2024-06-20 267/week @ 2024-06-27

1,498 每月下载量
用于 6 个 crates (3 直接)

MIT/Apache

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 版本之间相互转换。

基于 compactmap::wrapped

示例

基本的存储和检索。

#[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