#singleton #owned #proxy

无std owned-singleton

拥有单例

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2018年11月1日

#407无标准库

Download history 69/week @ 2024-03-14 83/week @ 2024-03-21 103/week @ 2024-03-28 72/week @ 2024-04-04 76/week @ 2024-04-11 106/week @ 2024-04-18 87/week @ 2024-04-25 67/week @ 2024-05-02 64/week @ 2024-05-09 71/week @ 2024-05-16 71/week @ 2024-05-23 70/week @ 2024-05-30 46/week @ 2024-06-06 51/week @ 2024-06-13 66/week @ 2024-06-20 32/week @ 2024-06-27

200 每月下载量
6 个物品中(通过 alloc-singleton)使用

MIT/Apache

8KB

owned-singleton

拥有单例

许可证

根据以下任一许可证发布

您可以选择。

贡献

除非您明确表示,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。


lib.rs:

拥有单例

拥有单例是一个代理(结构体),它为给定的 static mut 变量提供独占访问。

特性

拥有单例比 &'static mut 引用更小;它们是零大小类型。

这听起来对你来说还不够有用吗?可以使用 Singleton 抽象来实现 静态分配的内存池,其句柄大小为单个字节,并在 drop 时自动释放。

示例

Singleton 属性为给定的 static mut 变量创建一个代理(结构体),并为此实现 SingletonDerefDerefMutStableDeref 特性。

use owned_singleton::Singleton;

#[Singleton]
static mut FOO: u32 = 0;

let mut foo = unsafe { FOO::new() };
assert_eq!(*foo, 0);
*foo += 1;
assert_eq!(*foo, 1);

let bar: &'static mut u32 = foo.unwrap();
assert_eq!(*bar, 1);

默认情况下,Singleton 属性不实现 SendSync 特性;这会导致一个代理结构体不实现 SendSync。要选择 SendSync 特性,请在 Singleton 属性中添加 SendSync 参数。

use owned_singleton::Singleton;

#[Singleton(Send, Sync)]
static mut FOO: u32 = 0;

fn is_send<T>() where T: Send {}
fn is_sync<T>() where T: Sync {}

is_send::<FOO>();
is_sync::<FOO>();

在静态变量上使用 Singleton 将导致代理结构体未实现 DerefMut。然而,代理结构体仍然是对 static mut 变量的引用,因此 static mut 变量的类型上没有 Sync 的要求。

use std::marker::PhantomData;

use owned_singleton::Singleton;

// `PhantomData<*const ()>` does not implement `Send` or `Sync`
#[Singleton]
static FOO: PhantomData<*const ()> = PhantomData;

依赖关系

~2.5MB
~52K SLoC