#typemap #map #generator #key #projecting

ty_map_gen

类型投影映射生成器

3个版本

0.1.6 2024年5月21日
0.1.5 2024年5月19日

5#typemap

Download history 166/week @ 2024-05-12 334/week @ 2024-05-19 4/week @ 2024-05-26 28/week @ 2024-06-02 10/week @ 2024-06-09 54/week @ 2024-06-30 4/week @ 2024-07-07 200/week @ 2024-07-28

每月下载量206次
3 个crate中使用(通过 bevy_defer

MIT/Apache

22KB
428

ty_map_gen

Crates.io Docs

类型投影映射生成器。

语法

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())
}

由于存储在映射中的所有值都是CloneEq,因此可以推导它们。

as HashMap字段接受所有与HashMap具有相同API的结构体,这包括BTreeMap和第三方类型,如FxHashMapVecMap。要指定自定义哈希器,必须定义一个具有签名Map<Key, Value>的新类型。

边界

在宏中,边界(在括号[]中)是可选的。右侧的边界必须是对象安全,不包括ClonePartialEqEqOrdPartialOrdHashSerialize,这些是特殊处理的。此外,只能指定std::cmp中的一个特质。如果您需要SendSync,则应在此处添加它们。

目前右侧使用一个唯一的作用域,因此您必须提供完全限定的特质路径。

方法和实现

默认情况下,这些方法由宏生成

Defaultnewis_emptylengetget_mutinsertremoveclearextend

双键

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的查找(getget_mut)更快。

许可证

以下许可证之一

Apache许可证,版本2.0(LICENSE-APACHEhttp://www.apache.org/licenses/LICENSE-2.0)MIT许可证(LICENSE-MIThttp://opensource.org/licenses/MIT)任选其一。

贡献

欢迎贡献!

除非您明确声明,否则根据Apache-2.0许可定义的您提交给作品中的任何贡献,都应按上述方式双许可,没有任何附加条款或条件。

依赖项

~210KB