#nightly #static #generic #data #experimental #variables #macro

nightly generic-static-cache

泛型函数中的泛型静态存储

8 个版本

0.1.7 2023年12月21日
0.1.6 2023年12月20日

56#nightly

Download history 40/week @ 2024-03-29 8/week @ 2024-04-05

每月62次 下载

MIT/Apache

18KB
235

⚠ Nightly ⚠

这个 crate 仍然非常实验性,可能无论如何都不是一个好主意!

引用 Rust 参考

"在泛型作用域中定义的静态项(例如在泛型或默认实现中)将导致恰好定义一个静态项,就像将静态定义从当前作用域拉出到模块中一样。不会为单形化定义一个项。"

解决这个问题的方法之一是使用一个 HashMap<TypeId,Data>。这是一个简单且通常适当的解决方案。如果查找性能很重要,可以跳过对 TypeId 的哈希,以获得一些微小的改进,因为它 已经包含 一个高质量的哈希。这已在 TypeIdMap 中实现。

这个 crate 旨在通过使用内联汇编分配存储来进一步完全消除查找。

支持的目标是 x86-64aarch64。在其他目标上,generic_static 宏将回退到 hashmap,并且大多数其他功能不可用。

此外,不同的编译单元可能访问不同的数据实例!

这个 crate 需要以下不稳定功能:asm_const 以及(在不支持的目标上)const_collections_with_hasher

示例

泛型上下文中的静态变量

fn get_and_inc<T>() -> i32 {
    generic_static!{
        static COUNTER = &AtomicI32::new(1);
    }
    COUNTER.fetch_add(1, Ordering::Relaxed)
}
assert_eq!(get_and_inc::<bool>(), 1);
assert_eq!(get_and_inc::<bool>(), 2);
assert_eq!(get_and_inc::<String>(), 1);
assert_eq!(get_and_inc::<bool>(), 3);

将数据与类型关联

#[derive(Copy, Clone, Eq, PartialEq)]
struct Metadata(&'static str);

struct Cat;
struct Bomb;

use generic_static_cache::{get, init};
init::<Cat, _>(Metadata("nya!")).unwrap();
init::<Bomb, _>(Metadata("boom!")).unwrap();

assert_eq!(get::<Cat, _>(), Some(Metadata("nya!")));
assert_eq!(get::<Bomb, _>(), Some(Metadata("boom!")));

依赖关系

~135KB