9 stable releases (3 major)

4.1.1 Nov 25, 2021
4.0.0 Nov 25, 2021
3.0.0 Nov 24, 2021
2.0.0 Nov 21, 2021
1.2.1 Nov 21, 2021

#297 in Memory management

Download history 20/week @ 2024-01-08 24/week @ 2024-01-15 9/week @ 2024-01-22 260/week @ 2024-01-29 116/week @ 2024-02-05 42/week @ 2024-02-12 76/week @ 2024-02-19 89/week @ 2024-02-26 65/week @ 2024-03-04 70/week @ 2024-03-11 85/week @ 2024-03-18 88/week @ 2024-03-25 88/week @ 2024-04-01 3/week @ 2024-04-08 16/week @ 2024-04-15 15/week @ 2024-04-22

126 downloads per month

MIT license

26KB
426 lines

Singlyton

Safe, single-threaded global state in Rust.

Debug assertions are present to ensure:

  • Borrow checking (see RefCell)
  • Thread safety (two threads cannot access the same singleton)
  • Sound usage of uninitialized memory

Why?

Single-threaded global state is a bit of a boogeyman in Rust:

  • static mut is heavily discouraged due to its easy ability to cause UB through aliasing.
  • Thread locals can be slow for performance critical contexts, are nonsense to use in a single-threaded environment, and may not be available on all platforms
  • Working around Rust's thread-safety mechanisms in single-threaded contexts can be ugly, annoying and unnecessary

Usage

First, add singlyton as a dependency of your project in your Cargo.toml file:

[dependencies]
singlyton = "*"

Singleton

use singlyton::Singleton;

static SINGLETON: Singleton<&'static str> = Singleton::new("Hello");
debug_assert_eq!(*SINGLETON.get(), "Hello");

SINGLETON.replace("Test");
debug_assert_eq!(*SINGLETON.get(), "Test");

*SINGLETON.get_mut() = "Test 2";
debug_assert_eq!(*SINGLETON.get(), "Test 2");

SingletonUninit

use singlyton::SingletonUninit;

static SINGLETON: SingletonUninit<String> = SingletonUninit::uninit();

SINGLETON.init("Hello".to_string());
debug_assert_eq!(SINGLETON.get().as_str(), "Hello");

SINGLETON.replace("Test".to_string());
debug_assert_eq!(SINGLETON.get().as_str(), "Test");

*SINGLETON.get_mut() = "Test 2".to_string();
debug_assert_eq!(SINGLETON.get().as_str(), "Test 2");

Dependencies

~20KB