#entity #map #set

无 std alexcrichton-cranelift-entity

使用实体引用作为映射键的数据结构

2 个不稳定版本

0.53.0 2020 年 1 月 10 日
0.52.0 2020 年 1 月 10 日

#193 in #entity

Download history 10/week @ 2023-11-30 14/week @ 2023-12-07 22/week @ 2023-12-14 21/week @ 2023-12-21 15/week @ 2023-12-28 11/week @ 2024-01-04 23/week @ 2024-01-11 13/week @ 2024-01-18 7/week @ 2024-01-25 8/week @ 2024-02-01 31/week @ 2024-02-08 31/week @ 2024-02-15 53/week @ 2024-02-22 33/week @ 2024-02-29 42/week @ 2024-03-07 20/week @ 2024-03-14

150 每月下载量
13 个包中使用了 (7 直接)

Apache-2.0 WITH LLVM-exception

88KB
2K SLoC

此包包含 Cranelift 核心代码生成器使用的基于数组的数组数据结构,这些数据结构使用密集编号的实体引用作为映射键。

与类似 slotmap、slab 和 generational-arena 的包相比,此包的一个主要区别是,该包目前不提供删除实体的方式。这限制了它在删除不重要的情况下的使用,但这也使其更有效率,因为它不需要额外的簿记状态来重用已删除对象的存储空间,或者确保新对象始终具有唯一的键(例如 slotmap 和 generational-arena 的版本控制)。

另一个主要区别是,此包通过 PrimaryMap 宏保护了使用一个映射的键访问另一个映射中的元素。在 SlotMapSlabArena 中有一个值类型参数,而 PrimaryMap 有一个键类型参数和一个值类型参数。该包还提供了一个 entity_impl 宏,该宏使声明用于作为键的新唯一类型变得简单。任何尝试使用非预期映射中的键的操作都会被诊断出类型错误。

另一个是,此包有两个核心映射类型,PrimaryMapSecondaryMap,它们具有互补的作用。一个 PrimaryMap 在插入元素时创建自己的键,而一个 SecondaryMap 重复使用 PrimaryMap 的键值,在概念上存储相同索引空间中的额外数据。SecondaryMap 的值必须实现 Default,并且 SecondaryMap 中的所有元素最初都有 default() 的值。

实现 Default 的常见方法是将类型包装在 Option 中,但是此包还提供 PackedOption 工具,在某些情况下可以节省内存。

此包提供的其他实用工具包括

  • EntityList,用于分配许多小数组(例如编译器代码生成器中的指令操作数列表)。
  • SparseMap:是SecondaryMap的替代品,在某些情况下可以节省更多内存。
  • EntitySet:使用位向量记录哪些实体是该集合成员的特殊形式的SecondaryMap

依赖关系

~185KB