use std::marker::PhantomData;
use std::sync::Once;
use crate::sync_unsafe_cell::SyncUnsafeCell;
use crate::token::TokenWrapper;
pub struct Static<T, Token> {
value: SyncUnsafeCell<T>,
init_once: Once,
initializer: fn(&SyncUnsafeCell<T>),
_token: PhantomData<fn(Token) -> Token>,
}
impl<T, Token: TokenWrapper> Static<T, Token> {
#[doc(hidden)]
pub const fn new(const_value: T, initializer: fn(&SyncUnsafeCell<T>)) -> Self {
Self {
value: SyncUnsafeCell::new(const_value),
init_once: Once::new(),
initializer,
_token: PhantomData,
}
}
#[inline]
pub fn init(&self) -> Token {
self.init_once.call_once(|| {
(self.initializer)(&self.value);
});
unsafe { Token::new() }
}
#[doc(hidden)]
#[inline]
pub unsafe fn get_value(&self) -> &T {
unsafe { self.value.get() }
}
}