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 |
#320 in Memory management
115 downloads per month
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