14 个版本 (5 个重大更新)
0.6.1 | 2023 年 12 月 28 日 |
---|---|
0.6.0 | 2023 年 10 月 13 日 |
0.5.0 | 2023 年 10 月 13 日 |
0.4.2 | 2023 年 10 月 12 日 |
0.1.1 | 2023 年 8 月 31 日 |
#485 in 数据结构
129 个月下载量
在 3 crates 中使用
59KB
1.5K SLoC
Indexical:人性化的索引集合
Indexical 是一个库,可以方便且高效地处理对象的索引集合。"索引"意味着对象的域是有限的,并且可以为每个对象分配一个数字索引。这可以使用位集等高效的数据结构。
Indexical 是建立在现有的位集库(如 bitvec
和 rustc_index::bit_set
)之上。这些数据结构只“理解”原始索引,而不是索引所表示的对象。Indexical 提供了在对象域和索引域之间进行转换的实用工具。
示例
use indexical::{IndexedDomain, IndexedValue, bitset::bitvec::IndexSet};
use std::rc::Rc;
// 1. Define a custom type.
#[derive(PartialEq, Eq, Clone, Hash)]
pub struct MyString(String);
// 2. Define a new index for your custom type.
indexical::define_index_type! {
pub struct StringIndex for MyString = u32;
}
// 3. Create an immutable indexed domain from a collection of objects.
// By default this is Rc-wrapped, but you can also use Arc or &-refs.
let domain = Rc::new(IndexedDomain::from_iter([
MyString(String::from("Hello")), MyString(String::from("world"))
]));
// 4. Now you can make a set! Notice how you can pass either a `MyString`
// or a `StringIndex` to `set.insert(..)` and `set.contains(..)`.
let mut set = IndexSet::new(&domain);
set.insert(MyString(String::from("Hello")));
set.insert(StringIndex::from_usize(1));
assert!(set.contains(&MyString(String::from("world"))));
依赖项
~2MB
~41K SLoC