3个版本
| 0.1.6 | 2024年5月21日 |
|---|---|
| 0.1.5 | 2024年5月19日 |
5 在 #typemap
每月下载量206次
在 3 个crate中使用(通过 bevy_defer)
22KB
428 行
ty_map_gen
类型投影映射生成器。
语法
type_map!(
/// Asset Map
#[derive(Clone, PartialEq, Eq)]
pub AssetMap where T [Asset] => Handle<T> [Clone + Eq] as HashMap
);
这创建了一个类型,将泛型T投影到Handle<T>(大致上)
pub struct AssetMap(HashMap<TypeId, Box<dyn Any>>)
具有访问方法(大致上)
fn get<T: Asset + 'static>(&self) -> Option<&Handle<T>> where Handle<T>: Clone + Eq {
self.0.get(TypeId::of::<T>()).and_then(|v| v.downcast_ref())
}
由于存储在映射中的所有值都是Clone和Eq,因此可以推导它们。
as HashMap字段接受所有与HashMap具有相同API的结构体,这包括BTreeMap和第三方类型,如FxHashMap或VecMap。要指定自定义哈希器,必须定义一个具有签名Map<Key, Value>的新类型。
边界
在宏中,边界(在括号[]中)是可选的。右侧的边界必须是对象安全,不包括Clone、PartialEq、Eq、Ord、PartialOrd、Hash和Serialize,这些是特殊处理的。此外,只能指定std::cmp中的一个特质。如果您需要Send和Sync,则应在此处添加它们。
目前右侧使用一个唯一的作用域,因此您必须提供完全限定的特质路径。
方法和实现
默认情况下,这些方法由宏生成
Default、new、is_empty、len、get、get_mut、insert、remove、clear、extend。
双键
type_map!(
/// Asset Map
#[derive(Clone, PartialEq, Eq)]
pub AssetMap where (T, String) [Asset] => Handle<T> [Clone + Eq] as HashMap
);
这向映射添加了另一个键,具有访问方法(大致上)
fn get<T: Asset + 'static>(&self, key: &Q) -> Option<&Handle<T>> where Handle<T>: Clone + Eq {
self.0.get(&(TypeId::of::<T>(), key)).and_then(|v| v.downcast_ref())
}
性能
由于下转换不受检查,因此与使用Box<dyn Any>的简单实现相比,此crate的查找(get和get_mut)更快。
许可证
以下许可证之一
Apache许可证,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)MIT许可证(LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)任选其一。
贡献
欢迎贡献!
除非您明确声明,否则根据Apache-2.0许可定义的您提交给作品中的任何贡献,都应按上述方式双许可,没有任何附加条款或条件。
依赖项
~210KB