5 个版本
0.2.1 | 2020年11月14日 |
---|---|
0.2.0 |
|
0.1.3 | 2020年11月13日 |
0.1.0 | 2020年9月29日 |
#1132 在 并发 中
130KB
2.5K SLoC
pour
pour
是一个不可变 IdMap
的实现:它使用基数 trie 将位向量 ID 映射到值。
由于这些 IdMap
是不可变的,它们之间可以共享大量数据,并且可以通过哈希归约来增加 IdMap
之间的共享程度。更有趣的是,这种数据结构被设计用来支持在哈希归约的 IdMaps
上进行渐近快速的集合操作,包括
- 并集、交集、(对称)差集和补集
- 子集/超集检查
最好的部分是,共享的内存越多,这些操作在一般情况下就越快(尽管这些操作的专门 ptr
变体在非哈希归约,即最大共享的输入上可能会返回错误的值!为了允许用户自定义哈希归约策略,该数据结构内部 Arc
可以作为不透明对象暴露,用户可以使用 ConsCtx
特性来操作它们。或者,SetCtx
通过不进行归约来实现 ()
,并且有一些辅助函数用于执行不进行归约的集合操作。
还有一些不错的实现细节(可能会改变),包括
IdMap<K, V>
和因此IdSet<K>
的大小是指针大小。NonEmptyIdMap<K, V>
和因此NonEmptyIdSet<K>
的大小是指针大小和空指针优化的,即Option<NonEmptySet<T>>
也是指针大小。
目前,功能集有意识地保持相对简单,因为 pour
有特定的用例(即 rain
中间表示)。但如果我有时间或有人想要贡献,可以添加各种功能!潜在的未来功能示例包括
- 不仅从整数键,还从整数范围映射,效率相似
- 不同类型的联合映射
pour
目前实现时没有使用任何 unsafe
,但这可能会改变。我们确实使用了非标准的 elysees
Arc
实现(作者是 Servo 的 triomphe
的分支),以避免弱引用计数。
注意:“级别”目前尚不支持!返回大于 0 的级别数字将导致恐慌!
欢迎贡献、提问和问题!请在此处提交问题 https://gitlab.com/tekne/pour,并且对于任何其他查询,请联系作者 [email protected]。
依赖关系
~1.5–2MB
~38K SLoC