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 数据结构

Download history 85/week @ 2024-03-11 48/week @ 2024-03-18 4/week @ 2024-03-25 34/week @ 2024-04-01 9/week @ 2024-04-08 6/week @ 2024-04-15 24/week @ 2024-04-22 31/week @ 2024-04-29 15/week @ 2024-05-06 3/week @ 2024-05-13 23/week @ 2024-05-20 24/week @ 2024-05-27 46/week @ 2024-06-03 35/week @ 2024-06-10 15/week @ 2024-06-17 32/week @ 2024-06-24

129 个月下载量
3 crates 中使用

MIT/Apache

59KB
1.5K SLoC

Indexical:人性化的索引集合

Indexical 是一个库,可以方便且高效地处理对象的索引集合。"索引"意味着对象的域是有限的,并且可以为每个对象分配一个数字索引。这可以使用位集等高效的数据结构。

Indexical 是建立在现有的位集库(如 bitvecrustc_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