Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::sync::{Once, ONCE_INIT};
- pub struct Lazy<T: Sync>(pub Option<T>, pub Once);
- impl<T: Sync> Lazy<T> {
- #[inline(always)]
- pub fn get<F>(&'static mut self, f: F) -> &T
- where F: FnOnce() -> T
- {
- {
- let r = &mut self.0;
- self.1.call_once(|| {
- *r = Some(f());
- });
- }
- unsafe {
- match self.0 {
- Some(ref x) => x,
- None => std::hint::unreachable_unchecked(),
- }
- }
- }
- }
- unsafe impl<T: Sync> Sync for Lazy<T> {}
- #[macro_export]
- #[doc(hidden)]
- macro_rules! __lazy_static_create {
- ($NAME:ident, $T:ty) => {
- static mut $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy(None, $crate::lazy::ONCE_INIT);
- }
- }
- fn main() {}
Add Comment
Please, Sign In to add comment