Expand description
Owned singletons
An owned singleton is a proxy (struct) that grants exclusive access to a static mut variable.
§Features
Owned singletons are smaller than &'static mut references; they are zero sized types.
Doesn’t sound useful enough to you? The Singleton abstraction can be used to implement
statically allocated memory pools whose handles are a single byte in size and are automatically
deallocated on drop.
§Examples
The Singleton attribute creates a proxy (struct) for the given static mut variable and
implements the Singleton, Deref, DerefMut and StableDerefs traits for it.
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);The Singleton attribute doesn’t implement the Send or Sync traits by default; this results
in a proxy struct that does not implement Send or Sync. To opt into the Send and Sync
traits add the Send and Sync arguments to the Singleton attribute.
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>();Using Singleton on a static variable results in DerefMut not being implemented for the
proxy struct. However, the proxy struct will still be a handle to a static mut variable so
there’s no Sync requirement on the type of the static mut variable.
use std::marker::PhantomData;
use owned_singleton::Singleton;
// `PhantomData<*const ()>` does not implement `Send` or `Sync`
#[Singleton]
static FOO: PhantomData<*const ()> = PhantomData;Traits§
- Singleton
- An owned singleton: a proxy (handle) for a
static mutvariable
Attribute Macros§
- Singleton
- Attribute to declare an owned singleton