1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
use ForceSomeRwLockReadGuard; use std::mem; use std::ops::DerefMut; use std::sync::RwLock; pub struct SafeStatic<T> { data: RwLock<Option<T>>, } impl <T> SafeStatic<T> { pub fn new() -> Self { SafeStatic { data: RwLock::new(None), } } pub fn get(&self) -> ForceSomeRwLockReadGuard<T> { match self.data.read() { Ok(ok) => { ForceSomeRwLockReadGuard::new(ok) }, Err(_) => panic!(), } } pub fn set(&self, value: T) { let mut data = match self.data.write() { Ok(some) => some, Err(_) => panic!(), }; let data_ref = data.deref_mut(); if let Some(_) = mem::replace(data_ref, Some(value)) { panic!(); } } }