singlyton

Crates.iosinglyton
lib.rssinglyton
version4.1.1
sourcesrc
created_at2021-11-21 17:36:29.210958
updated_at2021-11-25 16:05:34.443491
descriptionSafe, single-threaded global state in Rust.
homepage
repositoryhttps://github.com/WilliamVenner/singlyton
max_upload_size
id485374
size27,185
William (WilliamVenner)

documentation

README

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");
Commit count: 21

cargo fmt