8 个不稳定版本 (3 个破坏性更新)

0.4.0 2024 年 2 月 7 日
0.3.0 2023 年 8 月 31 日
0.2.3 2023 年 1 月 25 日
0.2.2 2022 年 8 月 31 日
0.1.0 2021 年 4 月 2 日

#199 in 数据结构

Download history 10/week @ 2024-04-06 4/week @ 2024-06-01

每月 56 次下载
用于 icinga2-api

MIT/Apache

53KB
1.5K SLoC

Enumoid

该软件包是一个 Rust 库,可以建立类型所包含的值与 0 到 n 之间的整数的映射,其中 n 是不同值的数量。这用于提供一系列用于遍历值空间和按此类值索引的几个容器数据结构的实用函数。

依赖关系

[dependencies]
enumoid = "0.4"

派生 Enumoid

为了使用此软件包中的类型,它必须使用同名的 derive proc 宏实现 Enumoid trait。

可以为具有单元变体的枚举类型派生 Enumoid

use enumoid::Enumoid;

#[derive(Enumoid)]
enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday }

也可以为具有单个字段且该字段的类型也实现 Enumoid 的元组变体派生 Enumoid

# use enumoid::Enumoid;
# #[derive(Enumoid)]
# enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday }
#[derive(Enumoid)]
enum Day { Work(Weekday), Rest(Weekend) }

#[derive(Enumoid)]
enum Weekend { Saturday, Sunday }

字段不能具有泛型类型,因为这需要当前不稳定的 const generics 特性。

也可以为单元结构和具有单个字段且该字段的类型实现 Enumoid 的元组结构派生 Enumoid

# use enumoid::Enumoid;
# #[derive(Enumoid)]
# enum Day { Placeholder }
#[derive(Enumoid)]
struct AnyDay;

#[derive(Enumoid)]
struct EveryDay(Day);

默认情况下,使用 u8 来表示 Enumoid 所包含值的数量。如果您想为具有 255 个以上值的类型派生 Enumoid,您可以使用 index_type 辅助属性指定更宽的类型。

# use enumoid::Enumoid;
#[derive(Enumoid)]
#[index_type(u32)]
enum Massive { A, /*...*/ }

遍历 Enumoids

Enumoid trait 提供了一系列用于遍历值空间的实用函数。它们允许您找到下一个或上一个值,带或不带循环。例如

# use enumoid::Enumoid;
# #[derive(Enumoid, Debug, PartialEq)]
# enum Day { Work(Weekday), Rest(Weekend) }
# #[derive(Enumoid, Debug, PartialEq)]
# enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday }
# #[derive(Enumoid, Debug, PartialEq)]
# enum Weekend { Saturday, Sunday }
let tomorrow = Day::Work(Weekday::Friday).next();
assert_eq!(tomorrow, Some(Day::Rest(Weekend::Saturday)));

let yesterday = Day::Work(Weekday::Monday).prev_wrapped();
assert_eq!(yesterday, Day::Rest(Weekend::Sunday));

另一个有用的操作是遍历所有值

# use enumoid::Enumoid;
# #[derive(Enumoid, Debug, PartialEq)]
# enum Weekend { Saturday, Sunday }
assert_eq!(
    Weekend::iter().collect::<Vec<Weekend>>(),
    vec![Weekend::Saturday, Weekend::Sunday])

Enumoid 索引容器

该软件包提供了一系列容器类型,它们使用 Enumoid 作为键。它们内部都由固定大小的数组支持,因此不进行分配。例如,EnumMap 提供了一个从 Enumoid 的值到其他类型 T 的完整映射

# use enumoid::Enumoid;
# use enumoid::EnumMap;
# #[derive(Enumoid)]
# enum FooBar { Foo, Bar }
let mut map = EnumMap::<FooBar, String>::new();
map[FooBar::Foo] = "Hello".to_string();

EnumOptionMap 类似,但它提供了一种部分映射,其中元素可能不存在。 EnumVec 也是一个部分映射,但它像一个向量,其中任何存在的元素都与 Enumoid 的第一个值连续。

EnumSet 是专门用于存储集合成员关系的

# use enumoid::Enumoid;
# use enumoid::EnumSet;
# #[derive(Enumoid)]
# enum FooBar { Foo, Bar }
let mut set = EnumSet::<FooBar>::new();
set.insert(FooBar::Foo);
set.insert(FooBar::Bar);
assert_eq!(set.count(), 2);

许可

本软件包采用Apache许可证版本2.0(参见LICENCE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)或MIT许可证(参见LICENCE-MIT或http://opensource.org/licenses/MIT),由您选择。

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交用于包含在作品中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~0.5–1MB
~24K SLoC