2 个不稳定版本
0.53.0 | 2020 年 1 月 10 日 |
---|---|
0.52.0 | 2020 年 1 月 10 日 |
#193 in #entity
150 每月下载量
在 13 个包中使用了 (7 直接)
88KB
2K SLoC
此包包含 Cranelift 核心代码生成器使用的基于数组的数组数据结构,这些数据结构使用密集编号的实体引用作为映射键。
与类似 slotmap、slab 和 generational-arena 的包相比,此包的一个主要区别是,该包目前不提供删除实体的方式。这限制了它在删除不重要的情况下的使用,但这也使其更有效率,因为它不需要额外的簿记状态来重用已删除对象的存储空间,或者确保新对象始终具有唯一的键(例如 slotmap 和 generational-arena 的版本控制)。
另一个主要区别是,此包通过 PrimaryMap
宏保护了使用一个映射的键访问另一个映射中的元素。在 SlotMap
、Slab
和 Arena
中有一个值类型参数,而 PrimaryMap
有一个键类型参数和一个值类型参数。该包还提供了一个 entity_impl
宏,该宏使声明用于作为键的新唯一类型变得简单。任何尝试使用非预期映射中的键的操作都会被诊断出类型错误。
另一个是,此包有两个核心映射类型,PrimaryMap
和 SecondaryMap
,它们具有互补的作用。一个 PrimaryMap
在插入元素时创建自己的键,而一个 SecondaryMap
重复使用 PrimaryMap
的键值,在概念上存储相同索引空间中的额外数据。SecondaryMap
的值必须实现 Default
,并且 SecondaryMap
中的所有元素最初都有 default()
的值。
实现 Default
的常见方法是将类型包装在 Option
中,但是此包还提供 PackedOption
工具,在某些情况下可以节省内存。
此包提供的其他实用工具包括
EntityList
,用于分配许多小数组(例如编译器代码生成器中的指令操作数列表)。SparseMap
:是SecondaryMap
的替代品,在某些情况下可以节省更多内存。EntitySet
:使用位向量记录哪些实体是该集合成员的特殊形式的SecondaryMap
。
依赖关系
~185KB