157个版本 (96个破坏性)
| 新 0.111.0 | 2024年8月20日 |
|---|---|
| 0.110.1 | 2024年7月22日 |
| 0.106.0 | 2024年3月20日 |
| 0.103.0 | 2023年12月20日 |
| 0.17.0 | 2018年7月24日 |
#22 in 无标准库
每月559,083次下载
用于 803 个crate (直接使用39个)
140KB
3K SLoC
这个crate包含由核心Cranelift代码生成器使用,并以密集编号的实体引用作为映射键的基于数组的数据库结构。
这个crate与slotmap、slab、generational-arena等crate的主要区别在于,这个crate目前不提供删除实体的方法。这限制了其在删除不重要的情况下的使用,但这也使其更高效,因为它不需要额外的账簿状态来重用存储空间,或确保新对象始终具有唯一的键(例如slotmap和generational-arena的版本控制)。
另一个主要区别是,这个crate可以防止使用一个map中的密钥来访问另一个map中的元素。在SlotMap、Slab和Arena中有一个值类型参数的情况下,PrimaryMap有一个键类型参数和一个值类型参数。该crate还提供了entity_impl宏,这使得声明用于键的新唯一类型变得容易。任何尝试在非预期map中使用键的行为都会被诊断出类型错误。
另一个特点是,这个crate有两个核心map类型,PrimaryMap和SecondaryMap,它们具有互补的作用。一个PrimaryMap在插入元素时创建自己的键,而一个SecondaryMap则重用PrimaryMap的键值,在概念上存储相同索引空间中的额外数据。SecondaryMap的值必须实现Default,并且SecondaryMap中的所有元素最初都具有default()的值。
实现Default的常见方法是将类型包裹在Option中,但是这个crate还提供了一个PackedOption实用工具,在某些情况下可以节省内存。
该crate提供的其他实用工具包括
EntityList,用于分配许多小型数组(例如编译器代码生成器中的指令操作数列表)。SparseMap:在某种情况下可以节省内存的SecondaryMap的替代方案。EntitySet:一种特殊的SecondaryMap形式,使用位向量记录哪些实体是集合的成员。
依赖项
~170KB