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 或 http://www.apache.org/licenses/LICENSE-2.0)MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)任选其一。
贡献
欢迎贡献!
除非您明确声明,否则根据Apache-2.0许可定义的您提交给作品中的任何贡献,都应按上述方式双许可,没有任何附加条款或条件。
依赖项
~210KB