5 个版本

0.2.1 2020年11月14日
0.2.0 2020年11月13日
0.1.3 2020年11月13日
0.1.0 2020年9月29日

#1132并发

MIT/Apache

130KB
2.5K SLoC

pour

crates.io Downloads Documentation Pipeline status codecov License: MIT

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