#map #match #derive #struct #fast-map #maplike

过程宏 fast-map-derive

使用match实现Maplike

4个版本

0.2.1 2020年1月16日
0.2.0 2020年1月16日
0.1.1 2019年10月7日
0.1.0 2019年10月4日

#143 in #match


用于 fast-map

MIT 许可协议

10KB
211

fast-map

Docs Crates.io

一个小型库和自定义 derive,用于创建一个使用 match 表达式进行 getinsert 操作的类似 map 的结构体。

如果你在编译时知道你的键,这个库在支持的操作上可能会比 HashMap 更快。

为包装结构体提供以下操作(通过 derive 宏)

  • MyMap::get,返回 Result<Option<&V>, Error>
  • MyMap::get_mut,返回 Result<Option<&mut V>, Error>
  • MyMap::insert,返回 Result<Option<V>, Error>,其中 V 是旧值(如果存在)
  • MyMap::remove,返回 Result<Option<V>, Error>
  • MyMap::values,返回一个 &V 迭代器

如果你知道你的操作不会失败(例如,如果你的键类型是 enum,并且你将所有变体作为键列出),你可以在 derive 属性中添加 infallible = true,这将 unwrap 你映射操作的结果。

用法


fn main() {
    pub enum A { A, B, C, D };

    #[derive(Default, fast_map::FastMap)]
    // We know this cannot fail, since we list all the `enum` variants, so we add `infallible = true`
    #[fast_map(infallible = true, keys(A::A, A::B, A::C, A::D))]
    struct Foo(fast_map::Map4<A, String>);

    let mut foo = Foo::default();

    foo.insert(A::B, "B".into());

    assert_eq!(foo.get(A::B), Some(&"B".to_string()));

    assert_eq!(foo.get(A::C), None);

    foo.insert(A::C, "C".into());

    assert_eq!(foo.values().collect::<Vec<_>>().len(), 2);
}

变更日志

0.2.1

  • 将无错误操作的依赖关系重新添加为宏属性(infallible = true)。默认为false

0.2.0

  • 移除了easystrict MapLike特质。对于get等操作,显式处理未知键更好。
  • get_mut操作添加到包装结构体中

当前版本:0.2.1

许可:MIT

依赖项

~1.5MB
~35K SLoC