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