6 个版本
0.0.6 | 2024 年 1 月 21 日 |
---|---|
0.0.5 | 2024 年 1 月 19 日 |
#627 在 Rust 模式
每月 27 下载
用于 meslin
14KB
200 行
Type-sets
在 Rust 类型系统中实现的集合。
这个 crate 允许在 Rust 类型系统中创建类型集合。这些集合可以使用 SubsetOf
和 SupersetOf
进行比较。所有特性都标记为 unsafe,除了 AsSet
,这为在 unsafe
代码中使用冲突实现提供了保证。
集合最多实现 12 个项目。
这个库是为在 meslin
中使用而创建的,但它足够通用,可能还有其他用途。
示例
use type_sets::*;
use std::any::TypeId;
// We can define functions, that may only be called if the parameter `T` is
// a subset or superset of another set.
fn is_subset<T: SubsetOf<Set![u32, u64]>>() {}
fn is_superset<T: SupersetOf<Set![u32, u64]>>() {}
fn contains_u64<T: Contains<u64>>() {}
// We can also use custom structs as sets
struct MySet;
impl AsSet for MySet {
type Set = Set![u32];
}
fn main() {
is_subset::<Set![u32, u64]>(); // compiles
is_subset::<Set![u64, u32]>(); // compiles
is_subset::<Set![u32]>();
// is_subset::<Set![u32, u64, u32]>(); // does not compile
is_superset::<Set![u32, u64]>(); // compiles
is_superset::<Set![u32, u64, u128]>(); // compiles
is_superset::<Set![u128, u32, u64, u32, u32, u32]>(); // compiles
// is_superset::<Set![u32]>(); // does not compile
is_subset::<MySet>(); // compiles
// is_superset::<MySet>(); // does not compile
contains_u64::<Set![u64]>();
// contains_u64::<Set![u32]>(); // does not compile
assert_eq!(
<Set![u64, u32]>::members(),
[TypeId::of::<u64>(), TypeId::of::<u32>()]
);
assert_eq!(
MySet::members(),
[TypeId::of::<u32>()]
);
}
依赖项
~2MB
~37K SLoC