8次发布
0.2.0 | 2024年3月9日 |
---|---|
0.1.1 | 2023年5月24日 |
0.1.0 | 2023年3月23日 |
#2222 在 数据结构
17KB
335 行
tyght-map
静态类型映射实现。
lib.rs
:
tyght-map crate 提供了静态类型映射实现。
类型映射是一种值按其类型索引的映射。
映射 TyghtMap
具有以下特性
- 映射的大小将与其项的大小相匹配。
- 没有堆分配,此crate是
!#[no_std]
。 - 提供可靠和不可靠的方法。
- 无安全隐患。
示例
#![feature(generic_const_exprs)]
// Insert some different types into the map and check the size
let map = TyghtMap::new().insert(3u32).insert(4i32).insert(3f32);
assert_eq!(std::mem::size_of_val(&map), 12);
// Retrieve the `u32` from the map
let item: &u32 = map.get();
assert_eq!(*item, 3);
// Insert a `String` into the map, then mutate it
let mut map = map.insert("Hey".to_string());
*map.get_mut::<String>() += ", world!";
// Try to get a `u8` from the map
let item = map.try_get::<u8>();
assert_eq!(item, None);
// Remove the `String` from the map
let (item, _map) = map.remove::<String>();
println!("{item}");
特质
对 TyghtMap<S>
的 S
的约束作为对其包含的值的约束。
有三个重要的标记特质
Contains<T>
当S
包含T
时在S
上实现,允许MaybeContains<T>
总是在S
上实现,允许Missing<T>
当S
不包含T
时在S
上实现,允许
以下函数 不能 使用不包含 String
和 u32
的映射调用。
fn print_string<S>(map: &TyghtMap<S>)
where
S: Contains<String>,
S: Contains<u32>,
{
let string: &String = map.get();
let int: &u32 = map.get();
println!("{string} {int}");
}
夜间版
与其他尝试不同,此实现不依赖于专业化。然而,它依赖于各种夜间功能
这些有望在专业化之前以某种形式得到稳定。