#entity #map #set #object

不使用std cranelift-entity

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

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 无标准库

Download history 113450/week @ 2024-05-01 122538/week @ 2024-05-08 124291/week @ 2024-05-15 129968/week @ 2024-05-22 132114/week @ 2024-05-29 112248/week @ 2024-06-05 125838/week @ 2024-06-12 117311/week @ 2024-06-19 110002/week @ 2024-06-26 116629/week @ 2024-07-03 137054/week @ 2024-07-10 144261/week @ 2024-07-17 126864/week @ 2024-07-24 125057/week @ 2024-07-31 141847/week @ 2024-08-07 140916/week @ 2024-08-14

每月559,083次下载
用于 803 个crate (直接使用39个)

Apache-2.0 WITH LLVM-exception

140KB
3K SLoC

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

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

另一个主要区别是,这个crate可以防止使用一个map中的密钥来访问另一个map中的元素。在SlotMapSlabArena中有一个值类型参数的情况下,PrimaryMap有一个键类型参数和一个值类型参数。该crate还提供了entity_impl宏,这使得声明用于键的新唯一类型变得容易。任何尝试在非预期map中使用键的行为都会被诊断出类型错误。

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

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

该crate提供的其他实用工具包括

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

依赖项

~170KB