1 unstable release

Uses old Rust 2015

0.1.0 Nov 1, 2018

#325 in No standard library

Download history 63/week @ 2023-08-04 89/week @ 2023-08-11 64/week @ 2023-08-18 62/week @ 2023-08-25 64/week @ 2023-09-01 71/week @ 2023-09-08 81/week @ 2023-09-15 24/week @ 2023-09-22 54/week @ 2023-09-29 65/week @ 2023-10-06 84/week @ 2023-10-13 86/week @ 2023-10-20 89/week @ 2023-10-27 97/week @ 2023-11-03 81/week @ 2023-11-10 80/week @ 2023-11-17

363 downloads per month
Used in 6 crates (via alloc-singleton)




Owned singletons


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


Owned singletons

An owned singleton is a proxy (struct) that grants exclusive access to a static mut variable.


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.


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;

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 {}


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`
static FOO: PhantomData<*const ()> = PhantomData;


~49K SLoC