1//! # Overview 2//! 3//! `once_cell` provides two new cell-like types, [`unsync::OnceCell`] and [`sync::OnceCell`]. A `OnceCell` 4//! might store arbitrary non-`Copy` types, can be assigned to at most once and provides direct access 5//! to the stored contents. The core API looks *roughly* like this (and there's much more inside, read on!): 6//! 7//! ```rust,ignore 8//! impl<T> OnceCell<T> { 9//! const fn new() -> OnceCell<T> { ... } 10//! fn set(&self, value: T) -> Result<(), T> { ... } 11//! fn get(&self) -> Option<&T> { ... } 12//! } 13//! ``` 14//! 15//! Note that, like with [`RefCell`] and [`Mutex`], the `set` method requires only a shared reference. 16//! Because of the single assignment restriction `get` can return a `&T` instead of `Ref<T>` 17//! or `MutexGuard<T>`. 18//! 19//! The `sync` flavor is thread-safe (that is, implements the [`Sync`] trait), while the `unsync` one is not. 20//! 21//! [`unsync::OnceCell`]: unsync/struct.OnceCell.html 22//! [`sync::OnceCell`]: sync/struct.OnceCell.html 23//! [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html 24//! [`Mutex`]: https://doc.rust-lang.org/std/sync/struct.Mutex.html 25//! [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html 26//! 27//! # Recipes 28//! 29//! `OnceCell` might be useful for a variety of patterns. 30//! 31//! ## Safe Initialization of Global Data 32//! 33//! ```rust 34//! use std::{env, io}; 35//! 36//! use once_cell::sync::OnceCell; 37//! 38//! #[derive(Debug)] 39//! pub struct Logger { 40//! // ... 41//! } 42//! static INSTANCE: OnceCell<Logger> = OnceCell::new(); 43//! 44//! impl Logger { 45//! pub fn global() -> &'static Logger { 46//! INSTANCE.get().expect("logger is not initialized") 47//! } 48//! 49//! fn from_cli(args: env::Args) -> Result<Logger, std::io::Error> { 50//! // ... 51//! # Ok(Logger {}) 52//! } 53//! } 54//! 55//! fn main() { 56//! let logger = Logger::from_cli(env::args()).unwrap(); 57//! INSTANCE.set(logger).unwrap(); 58//! // use `Logger::global()` from now on 59//! } 60//! ``` 61//! 62//! ## Lazy Initialized Global Data 63//! 64//! This is essentially the `lazy_static!` macro, but without a macro. 65//! 66//! ```rust 67//! use std::{sync::Mutex, collections::HashMap}; 68//! 69//! use once_cell::sync::OnceCell; 70//! 71//! fn global_data() -> &'static Mutex<HashMap<i32, String>> { 72//! static INSTANCE: OnceCell<Mutex<HashMap<i32, String>>> = OnceCell::new(); 73//! INSTANCE.get_or_init(|| { 74//! let mut m = HashMap::new(); 75//! m.insert(13, "Spica".to_string()); 76//! m.insert(74, "Hoyten".to_string()); 77//! Mutex::new(m) 78//! }) 79//! } 80//! ``` 81//! 82//! There are also the [`sync::Lazy`] and [`unsync::Lazy`] convenience types to streamline this pattern: 83//! 84//! ```rust 85//! use std::{sync::Mutex, collections::HashMap}; 86//! use once_cell::sync::Lazy; 87//! 88//! static GLOBAL_DATA: Lazy<Mutex<HashMap<i32, String>>> = Lazy::new(|| { 89//! let mut m = HashMap::new(); 90//! m.insert(13, "Spica".to_string()); 91//! m.insert(74, "Hoyten".to_string()); 92//! Mutex::new(m) 93//! }); 94//! 95//! fn main() { 96//! println!("{:?}", GLOBAL_DATA.lock().unwrap()); 97//! } 98//! ``` 99//! 100//! Note that the variable that holds `Lazy` is declared as `static`, *not* 101//! `const`. This is important: using `const` instead compiles, but works wrong. 102//! 103//! [`sync::Lazy`]: sync/struct.Lazy.html 104//! [`unsync::Lazy`]: unsync/struct.Lazy.html 105//! 106//! ## General purpose lazy evaluation 107//! 108//! Unlike `lazy_static!`, `Lazy` works with local variables. 109//! 110//! ```rust 111//! use once_cell::unsync::Lazy; 112//! 113//! fn main() { 114//! let ctx = vec![1, 2, 3]; 115//! let thunk = Lazy::new(|| { 116//! ctx.iter().sum::<i32>() 117//! }); 118//! assert_eq!(*thunk, 6); 119//! } 120//! ``` 121//! 122//! If you need a lazy field in a struct, you probably should use `OnceCell` 123//! directly, because that will allow you to access `self` during initialization. 124//! 125//! ```rust 126//! use std::{fs, path::PathBuf}; 127//! 128//! use once_cell::unsync::OnceCell; 129//! 130//! struct Ctx { 131//! config_path: PathBuf, 132//! config: OnceCell<String>, 133//! } 134//! 135//! impl Ctx { 136//! pub fn get_config(&self) -> Result<&str, std::io::Error> { 137//! let cfg = self.config.get_or_try_init(|| { 138//! fs::read_to_string(&self.config_path) 139//! })?; 140//! Ok(cfg.as_str()) 141//! } 142//! } 143//! ``` 144//! 145//! ## Lazily Compiled Regex 146//! 147//! This is a `regex!` macro which takes a string literal and returns an 148//! *expression* that evaluates to a `&'static Regex`: 149//! 150//! ``` 151//! macro_rules! regex { 152//! ($re:literal $(,)?) => {{ 153//! static RE: once_cell::sync::OnceCell<regex::Regex> = once_cell::sync::OnceCell::new(); 154//! RE.get_or_init(|| regex::Regex::new($re).unwrap()) 155//! }}; 156//! } 157//! ``` 158//! 159//! This macro can be useful to avoid the "compile regex on every loop iteration" problem. 160//! 161//! ## Runtime `include_bytes!` 162//! 163//! The `include_bytes` macro is useful to include test resources, but it slows 164//! down test compilation a lot. An alternative is to load the resources at 165//! runtime: 166//! 167//! ``` 168//! use std::path::Path; 169//! 170//! use once_cell::sync::OnceCell; 171//! 172//! pub struct TestResource { 173//! path: &'static str, 174//! cell: OnceCell<Vec<u8>>, 175//! } 176//! 177//! impl TestResource { 178//! pub const fn new(path: &'static str) -> TestResource { 179//! TestResource { path, cell: OnceCell::new() } 180//! } 181//! pub fn bytes(&self) -> &[u8] { 182//! self.cell.get_or_init(|| { 183//! let dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); 184//! let path = Path::new(dir.as_str()).join(self.path); 185//! std::fs::read(&path).unwrap_or_else(|_err| { 186//! panic!("failed to load test resource: {}", path.display()) 187//! }) 188//! }).as_slice() 189//! } 190//! } 191//! 192//! static TEST_IMAGE: TestResource = TestResource::new("test_data/lena.png"); 193//! 194//! #[test] 195//! fn test_sobel_filter() { 196//! let rgb: &[u8] = TEST_IMAGE.bytes(); 197//! // ... 198//! # drop(rgb); 199//! } 200//! ``` 201//! 202//! ## `lateinit` 203//! 204//! `LateInit` type for delayed initialization. It is reminiscent of Kotlin's 205//! `lateinit` keyword and allows construction of cyclic data structures: 206//! 207//! 208//! ``` 209//! use once_cell::sync::OnceCell; 210//! 211//! pub struct LateInit<T> { cell: OnceCell<T> } 212//! 213//! impl<T> LateInit<T> { 214//! pub fn init(&self, value: T) { 215//! assert!(self.cell.set(value).is_ok()) 216//! } 217//! } 218//! 219//! impl<T> Default for LateInit<T> { 220//! fn default() -> Self { LateInit { cell: OnceCell::default() } } 221//! } 222//! 223//! impl<T> std::ops::Deref for LateInit<T> { 224//! type Target = T; 225//! fn deref(&self) -> &T { 226//! self.cell.get().unwrap() 227//! } 228//! } 229//! 230//! #[derive(Default)] 231//! struct A<'a> { 232//! b: LateInit<&'a B<'a>>, 233//! } 234//! 235//! #[derive(Default)] 236//! struct B<'a> { 237//! a: LateInit<&'a A<'a>> 238//! } 239//! 240//! 241//! fn build_cycle() { 242//! let a = A::default(); 243//! let b = B::default(); 244//! a.b.init(&b); 245//! b.a.init(&a); 246//! 247//! let _a = &a.b.a.b.a; 248//! } 249//! ``` 250//! 251//! # Comparison with std 252//! 253//! |`!Sync` types | Access Mode | Drawbacks | 254//! |----------------------|------------------------|-----------------------------------------------| 255//! |`Cell<T>` | `T` | requires `T: Copy` for `get` | 256//! |`RefCell<T>` | `RefMut<T>` / `Ref<T>` | may panic at runtime | 257//! |`unsync::OnceCell<T>` | `&T` | assignable only once | 258//! 259//! |`Sync` types | Access Mode | Drawbacks | 260//! |----------------------|------------------------|-----------------------------------------------| 261//! |`AtomicT` | `T` | works only with certain `Copy` types | 262//! |`Mutex<T>` | `MutexGuard<T>` | may deadlock at runtime, may block the thread | 263//! |`sync::OnceCell<T>` | `&T` | assignable only once, may block the thread | 264//! 265//! Technically, calling `get_or_init` will also cause a panic or a deadlock if it recursively calls 266//! itself. However, because the assignment can happen only once, such cases should be more rare than 267//! equivalents with `RefCell` and `Mutex`. 268//! 269//! # Minimum Supported `rustc` Version 270//! 271//! This crate's minimum supported `rustc` version is `1.56.0`. 272//! 273//! If only the `std` feature is enabled, MSRV will be updated conservatively, supporting at least latest 8 versions of the compiler. 274//! When using other features, like `parking_lot`, MSRV might be updated more frequently, up to the latest stable. 275//! In both cases, increasing MSRV is *not* considered a semver-breaking change. 276//! 277//! # Implementation details 278//! 279//! The implementation is based on the [`lazy_static`](https://github.com/rust-lang-nursery/lazy-static.rs/) 280//! and [`lazy_cell`](https://github.com/indiv0/lazycell/) crates and [`std::sync::Once`]. In some sense, 281//! `once_cell` just streamlines and unifies those APIs. 282//! 283//! To implement a sync flavor of `OnceCell`, this crates uses either a custom 284//! re-implementation of `std::sync::Once` or `parking_lot::Mutex`. This is 285//! controlled by the `parking_lot` feature (disabled by default). Performance 286//! is the same for both cases, but the `parking_lot` based `OnceCell<T>` is 287//! smaller by up to 16 bytes. 288//! 289//! This crate uses `unsafe`. 290//! 291//! [`std::sync::Once`]: https://doc.rust-lang.org/std/sync/struct.Once.html 292//! 293//! # F.A.Q. 294//! 295//! **Should I use lazy_static or once_cell?** 296//! 297//! To the first approximation, `once_cell` is both more flexible and more convenient than `lazy_static` 298//! and should be preferred. 299//! 300//! Unlike `once_cell`, `lazy_static` supports spinlock-based implementation of blocking which works with 301//! `#![no_std]`. 302//! 303//! `lazy_static` has received significantly more real world testing, but `once_cell` is also a widely 304//! used crate. 305//! 306//! **Should I use the sync or unsync flavor?** 307//! 308//! Because Rust compiler checks thread safety for you, it's impossible to accidentally use `unsync` where 309//! `sync` is required. So, use `unsync` in single-threaded code and `sync` in multi-threaded. It's easy 310//! to switch between the two if code becomes multi-threaded later. 311//! 312//! At the moment, `unsync` has an additional benefit that reentrant initialization causes a panic, which 313//! might be easier to debug than a deadlock. 314//! 315//! **Does this crate support async?** 316//! 317//! No, but you can use [`async_once_cell`](https://crates.io/crates/async_once_cell) instead. 318//! 319//! **Can I bring my own mutex?** 320//! 321//! There is [generic_once_cell](https://crates.io/crates/generic_once_cell) to allow just that. 322//! 323//! # Related crates 324//! 325//! * [double-checked-cell](https://github.com/niklasf/double-checked-cell) 326//! * [lazy-init](https://crates.io/crates/lazy-init) 327//! * [lazycell](https://crates.io/crates/lazycell) 328//! * [mitochondria](https://crates.io/crates/mitochondria) 329//! * [lazy_static](https://crates.io/crates/lazy_static) 330//! * [async_once_cell](https://crates.io/crates/async_once_cell) 331//! * [generic_once_cell](https://crates.io/crates/generic_once_cell) (bring your own mutex) 332//! 333//! Most of this crate's functionality is available in `std` in nightly Rust. 334//! See the [tracking issue](https://github.com/rust-lang/rust/issues/74465). 335 336#![cfg_attr(not(feature = "std"), no_std)] 337 338#[cfg(feature = "alloc")] 339extern crate alloc; 340 341#[cfg(all(feature = "critical-section", not(feature = "std")))] 342#[path = "imp_cs.rs"] 343mod imp; 344 345#[cfg(all(feature = "std", feature = "parking_lot"))] 346#[path = "imp_pl.rs"] 347mod imp; 348 349#[cfg(all(feature = "std", not(feature = "parking_lot")))] 350#[path = "imp_std.rs"] 351mod imp; 352 353/// Single-threaded version of `OnceCell`. 354pub mod unsync { 355 use core::{ 356 cell::{Cell, UnsafeCell}, 357 fmt, mem, 358 ops::{Deref, DerefMut}, 359 panic::{RefUnwindSafe, UnwindSafe}, 360 }; 361 362 use super::unwrap_unchecked; 363 364 /// A cell which can be written to only once. It is not thread safe. 365 /// 366 /// Unlike [`std::cell::RefCell`], a `OnceCell` provides simple `&` 367 /// references to the contents. 368 /// 369 /// [`std::cell::RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html 370 /// 371 /// # Example 372 /// ``` 373 /// use once_cell::unsync::OnceCell; 374 /// 375 /// let cell = OnceCell::new(); 376 /// assert!(cell.get().is_none()); 377 /// 378 /// let value: &String = cell.get_or_init(|| { 379 /// "Hello, World!".to_string() 380 /// }); 381 /// assert_eq!(value, "Hello, World!"); 382 /// assert!(cell.get().is_some()); 383 /// ``` 384 pub struct OnceCell<T> { 385 // Invariant: written to at most once. 386 inner: UnsafeCell<Option<T>>, 387 } 388 389 // Similarly to a `Sync` bound on `sync::OnceCell`, we can use 390 // `&unsync::OnceCell` to sneak a `T` through `catch_unwind`, 391 // by initializing the cell in closure and extracting the value in the 392 // `Drop`. 393 impl<T: RefUnwindSafe + UnwindSafe> RefUnwindSafe for OnceCell<T> {} 394 impl<T: UnwindSafe> UnwindSafe for OnceCell<T> {} 395 396 impl<T> Default for OnceCell<T> { 397 fn default() -> Self { 398 Self::new() 399 } 400 } 401 402 impl<T: fmt::Debug> fmt::Debug for OnceCell<T> { 403 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 404 match self.get() { 405 Some(v) => f.debug_tuple("OnceCell").field(v).finish(), 406 None => f.write_str("OnceCell(Uninit)"), 407 } 408 } 409 } 410 411 impl<T: Clone> Clone for OnceCell<T> { 412 fn clone(&self) -> OnceCell<T> { 413 match self.get() { 414 Some(value) => OnceCell::with_value(value.clone()), 415 None => OnceCell::new(), 416 } 417 } 418 419 fn clone_from(&mut self, source: &Self) { 420 match (self.get_mut(), source.get()) { 421 (Some(this), Some(source)) => this.clone_from(source), 422 _ => *self = source.clone(), 423 } 424 } 425 } 426 427 impl<T: PartialEq> PartialEq for OnceCell<T> { 428 fn eq(&self, other: &Self) -> bool { 429 self.get() == other.get() 430 } 431 } 432 433 impl<T: Eq> Eq for OnceCell<T> {} 434 435 impl<T> From<T> for OnceCell<T> { 436 fn from(value: T) -> Self { 437 OnceCell::with_value(value) 438 } 439 } 440 441 impl<T> OnceCell<T> { 442 /// Creates a new empty cell. 443 pub const fn new() -> OnceCell<T> { 444 OnceCell { inner: UnsafeCell::new(None) } 445 } 446 447 /// Creates a new initialized cell. 448 pub const fn with_value(value: T) -> OnceCell<T> { 449 OnceCell { inner: UnsafeCell::new(Some(value)) } 450 } 451 452 /// Gets a reference to the underlying value. 453 /// 454 /// Returns `None` if the cell is empty. 455 #[inline] 456 pub fn get(&self) -> Option<&T> { 457 // Safe due to `inner`'s invariant 458 unsafe { &*self.inner.get() }.as_ref() 459 } 460 461 /// Gets a mutable reference to the underlying value. 462 /// 463 /// Returns `None` if the cell is empty. 464 /// 465 /// This method is allowed to violate the invariant of writing to a `OnceCell` 466 /// at most once because it requires `&mut` access to `self`. As with all 467 /// interior mutability, `&mut` access permits arbitrary modification: 468 /// 469 /// ``` 470 /// use once_cell::unsync::OnceCell; 471 /// 472 /// let mut cell: OnceCell<u32> = OnceCell::new(); 473 /// cell.set(92).unwrap(); 474 /// *cell.get_mut().unwrap() = 93; 475 /// assert_eq!(cell.get(), Some(&93)); 476 /// ``` 477 #[inline] 478 pub fn get_mut(&mut self) -> Option<&mut T> { 479 // Safe because we have unique access 480 unsafe { &mut *self.inner.get() }.as_mut() 481 } 482 483 /// Sets the contents of this cell to `value`. 484 /// 485 /// Returns `Ok(())` if the cell was empty and `Err(value)` if it was 486 /// full. 487 /// 488 /// # Example 489 /// ``` 490 /// use once_cell::unsync::OnceCell; 491 /// 492 /// let cell = OnceCell::new(); 493 /// assert!(cell.get().is_none()); 494 /// 495 /// assert_eq!(cell.set(92), Ok(())); 496 /// assert_eq!(cell.set(62), Err(62)); 497 /// 498 /// assert!(cell.get().is_some()); 499 /// ``` 500 pub fn set(&self, value: T) -> Result<(), T> { 501 match self.try_insert(value) { 502 Ok(_) => Ok(()), 503 Err((_, value)) => Err(value), 504 } 505 } 506 507 /// Like [`set`](Self::set), but also returns a reference to the final cell value. 508 /// 509 /// # Example 510 /// ``` 511 /// use once_cell::unsync::OnceCell; 512 /// 513 /// let cell = OnceCell::new(); 514 /// assert!(cell.get().is_none()); 515 /// 516 /// assert_eq!(cell.try_insert(92), Ok(&92)); 517 /// assert_eq!(cell.try_insert(62), Err((&92, 62))); 518 /// 519 /// assert!(cell.get().is_some()); 520 /// ``` 521 pub fn try_insert(&self, value: T) -> Result<&T, (&T, T)> { 522 if let Some(old) = self.get() { 523 return Err((old, value)); 524 } 525 526 let slot = unsafe { &mut *self.inner.get() }; 527 // This is the only place where we set the slot, no races 528 // due to reentrancy/concurrency are possible, and we've 529 // checked that slot is currently `None`, so this write 530 // maintains the `inner`'s invariant. 531 *slot = Some(value); 532 Ok(unsafe { unwrap_unchecked(slot.as_ref()) }) 533 } 534 535 /// Gets the contents of the cell, initializing it with `f` 536 /// if the cell was empty. 537 /// 538 /// # Panics 539 /// 540 /// If `f` panics, the panic is propagated to the caller, and the cell 541 /// remains uninitialized. 542 /// 543 /// It is an error to reentrantly initialize the cell from `f`. Doing 544 /// so results in a panic. 545 /// 546 /// # Example 547 /// ``` 548 /// use once_cell::unsync::OnceCell; 549 /// 550 /// let cell = OnceCell::new(); 551 /// let value = cell.get_or_init(|| 92); 552 /// assert_eq!(value, &92); 553 /// let value = cell.get_or_init(|| unreachable!()); 554 /// assert_eq!(value, &92); 555 /// ``` 556 pub fn get_or_init<F>(&self, f: F) -> &T 557 where 558 F: FnOnce() -> T, 559 { 560 enum Void {} 561 match self.get_or_try_init(|| Ok::<T, Void>(f())) { 562 Ok(val) => val, 563 Err(void) => match void {}, 564 } 565 } 566 567 /// Gets the contents of the cell, initializing it with `f` if 568 /// the cell was empty. If the cell was empty and `f` failed, an 569 /// error is returned. 570 /// 571 /// # Panics 572 /// 573 /// If `f` panics, the panic is propagated to the caller, and the cell 574 /// remains uninitialized. 575 /// 576 /// It is an error to reentrantly initialize the cell from `f`. Doing 577 /// so results in a panic. 578 /// 579 /// # Example 580 /// ``` 581 /// use once_cell::unsync::OnceCell; 582 /// 583 /// let cell = OnceCell::new(); 584 /// assert_eq!(cell.get_or_try_init(|| Err(())), Err(())); 585 /// assert!(cell.get().is_none()); 586 /// let value = cell.get_or_try_init(|| -> Result<i32, ()> { 587 /// Ok(92) 588 /// }); 589 /// assert_eq!(value, Ok(&92)); 590 /// assert_eq!(cell.get(), Some(&92)) 591 /// ``` 592 pub fn get_or_try_init<F, E>(&self, f: F) -> Result<&T, E> 593 where 594 F: FnOnce() -> Result<T, E>, 595 { 596 if let Some(val) = self.get() { 597 return Ok(val); 598 } 599 let val = f()?; 600 // Note that *some* forms of reentrant initialization might lead to 601 // UB (see `reentrant_init` test). I believe that just removing this 602 // `assert`, while keeping `set/get` would be sound, but it seems 603 // better to panic, rather than to silently use an old value. 604 assert!(self.set(val).is_ok(), "reentrant init"); 605 Ok(unsafe { unwrap_unchecked(self.get()) }) 606 } 607 608 /// Takes the value out of this `OnceCell`, moving it back to an uninitialized state. 609 /// 610 /// Has no effect and returns `None` if the `OnceCell` hasn't been initialized. 611 /// 612 /// # Examples 613 /// 614 /// ``` 615 /// use once_cell::unsync::OnceCell; 616 /// 617 /// let mut cell: OnceCell<String> = OnceCell::new(); 618 /// assert_eq!(cell.take(), None); 619 /// 620 /// let mut cell = OnceCell::new(); 621 /// cell.set("hello".to_string()).unwrap(); 622 /// assert_eq!(cell.take(), Some("hello".to_string())); 623 /// assert_eq!(cell.get(), None); 624 /// ``` 625 /// 626 /// This method is allowed to violate the invariant of writing to a `OnceCell` 627 /// at most once because it requires `&mut` access to `self`. As with all 628 /// interior mutability, `&mut` access permits arbitrary modification: 629 /// 630 /// ``` 631 /// use once_cell::unsync::OnceCell; 632 /// 633 /// let mut cell: OnceCell<u32> = OnceCell::new(); 634 /// cell.set(92).unwrap(); 635 /// cell = OnceCell::new(); 636 /// ``` 637 pub fn take(&mut self) -> Option<T> { 638 mem::replace(self, Self::default()).into_inner() 639 } 640 641 /// Consumes the `OnceCell`, returning the wrapped value. 642 /// 643 /// Returns `None` if the cell was empty. 644 /// 645 /// # Examples 646 /// 647 /// ``` 648 /// use once_cell::unsync::OnceCell; 649 /// 650 /// let cell: OnceCell<String> = OnceCell::new(); 651 /// assert_eq!(cell.into_inner(), None); 652 /// 653 /// let cell = OnceCell::new(); 654 /// cell.set("hello".to_string()).unwrap(); 655 /// assert_eq!(cell.into_inner(), Some("hello".to_string())); 656 /// ``` 657 pub fn into_inner(self) -> Option<T> { 658 // Because `into_inner` takes `self` by value, the compiler statically verifies 659 // that it is not currently borrowed. So it is safe to move out `Option<T>`. 660 self.inner.into_inner() 661 } 662 } 663 664 /// A value which is initialized on the first access. 665 /// 666 /// # Example 667 /// ``` 668 /// use once_cell::unsync::Lazy; 669 /// 670 /// let lazy: Lazy<i32> = Lazy::new(|| { 671 /// println!("initializing"); 672 /// 92 673 /// }); 674 /// println!("ready"); 675 /// println!("{}", *lazy); 676 /// println!("{}", *lazy); 677 /// 678 /// // Prints: 679 /// // ready 680 /// // initializing 681 /// // 92 682 /// // 92 683 /// ``` 684 pub struct Lazy<T, F = fn() -> T> { 685 cell: OnceCell<T>, 686 init: Cell<Option<F>>, 687 } 688 689 impl<T, F: RefUnwindSafe> RefUnwindSafe for Lazy<T, F> where OnceCell<T>: RefUnwindSafe {} 690 691 impl<T: fmt::Debug, F> fmt::Debug for Lazy<T, F> { 692 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 693 f.debug_struct("Lazy").field("cell", &self.cell).field("init", &"..").finish() 694 } 695 } 696 697 impl<T, F> Lazy<T, F> { 698 /// Creates a new lazy value with the given initializing function. 699 /// 700 /// # Example 701 /// ``` 702 /// # fn main() { 703 /// use once_cell::unsync::Lazy; 704 /// 705 /// let hello = "Hello, World!".to_string(); 706 /// 707 /// let lazy = Lazy::new(|| hello.to_uppercase()); 708 /// 709 /// assert_eq!(&*lazy, "HELLO, WORLD!"); 710 /// # } 711 /// ``` 712 pub const fn new(init: F) -> Lazy<T, F> { 713 Lazy { cell: OnceCell::new(), init: Cell::new(Some(init)) } 714 } 715 716 /// Consumes this `Lazy` returning the stored value. 717 /// 718 /// Returns `Ok(value)` if `Lazy` is initialized and `Err(f)` otherwise. 719 pub fn into_value(this: Lazy<T, F>) -> Result<T, F> { 720 let cell = this.cell; 721 let init = this.init; 722 cell.into_inner().ok_or_else(|| { 723 init.take().unwrap_or_else(|| panic!("Lazy instance has previously been poisoned")) 724 }) 725 } 726 } 727 728 impl<T, F: FnOnce() -> T> Lazy<T, F> { 729 /// Forces the evaluation of this lazy value and returns a reference to 730 /// the result. 731 /// 732 /// This is equivalent to the `Deref` impl, but is explicit. 733 /// 734 /// # Example 735 /// ``` 736 /// use once_cell::unsync::Lazy; 737 /// 738 /// let lazy = Lazy::new(|| 92); 739 /// 740 /// assert_eq!(Lazy::force(&lazy), &92); 741 /// assert_eq!(&*lazy, &92); 742 /// ``` 743 pub fn force(this: &Lazy<T, F>) -> &T { 744 this.cell.get_or_init(|| match this.init.take() { 745 Some(f) => f(), 746 None => panic!("Lazy instance has previously been poisoned"), 747 }) 748 } 749 750 /// Forces the evaluation of this lazy value and returns a mutable reference to 751 /// the result. 752 /// 753 /// This is equivalent to the `DerefMut` impl, but is explicit. 754 /// 755 /// # Example 756 /// ``` 757 /// use once_cell::unsync::Lazy; 758 /// 759 /// let mut lazy = Lazy::new(|| 92); 760 /// 761 /// assert_eq!(Lazy::force_mut(&mut lazy), &92); 762 /// assert_eq!(*lazy, 92); 763 /// ``` 764 pub fn force_mut(this: &mut Lazy<T, F>) -> &mut T { 765 Self::force(this); 766 Self::get_mut(this).unwrap_or_else(|| unreachable!()) 767 } 768 769 /// Gets the reference to the result of this lazy value if 770 /// it was initialized, otherwise returns `None`. 771 /// 772 /// # Example 773 /// ``` 774 /// use once_cell::unsync::Lazy; 775 /// 776 /// let lazy = Lazy::new(|| 92); 777 /// 778 /// assert_eq!(Lazy::get(&lazy), None); 779 /// assert_eq!(&*lazy, &92); 780 /// assert_eq!(Lazy::get(&lazy), Some(&92)); 781 /// ``` 782 pub fn get(this: &Lazy<T, F>) -> Option<&T> { 783 this.cell.get() 784 } 785 786 /// Gets the mutable reference to the result of this lazy value if 787 /// it was initialized, otherwise returns `None`. 788 /// 789 /// # Example 790 /// ``` 791 /// use once_cell::unsync::Lazy; 792 /// 793 /// let mut lazy = Lazy::new(|| 92); 794 /// 795 /// assert_eq!(Lazy::get_mut(&mut lazy), None); 796 /// assert_eq!(*lazy, 92); 797 /// assert_eq!(Lazy::get_mut(&mut lazy), Some(&mut 92)); 798 /// ``` 799 pub fn get_mut(this: &mut Lazy<T, F>) -> Option<&mut T> { 800 this.cell.get_mut() 801 } 802 } 803 804 impl<T, F: FnOnce() -> T> Deref for Lazy<T, F> { 805 type Target = T; 806 fn deref(&self) -> &T { 807 Lazy::force(self) 808 } 809 } 810 811 impl<T, F: FnOnce() -> T> DerefMut for Lazy<T, F> { 812 fn deref_mut(&mut self) -> &mut T { 813 Lazy::force(self); 814 self.cell.get_mut().unwrap_or_else(|| unreachable!()) 815 } 816 } 817 818 impl<T: Default> Default for Lazy<T> { 819 /// Creates a new lazy value using `Default` as the initializing function. 820 fn default() -> Lazy<T> { 821 Lazy::new(T::default) 822 } 823 } 824} 825 826/// Thread-safe, blocking version of `OnceCell`. 827#[cfg(any(feature = "std", feature = "critical-section"))] 828pub mod sync { 829 use core::{ 830 cell::Cell, 831 fmt, mem, 832 ops::{Deref, DerefMut}, 833 panic::RefUnwindSafe, 834 }; 835 836 use super::{imp::OnceCell as Imp, unwrap_unchecked}; 837 838 /// A thread-safe cell which can be written to only once. 839 /// 840 /// `OnceCell` provides `&` references to the contents without RAII guards. 841 /// 842 /// Reading a non-`None` value out of `OnceCell` establishes a 843 /// happens-before relationship with a corresponding write. For example, if 844 /// thread A initializes the cell with `get_or_init(f)`, and thread B 845 /// subsequently reads the result of this call, B also observes all the side 846 /// effects of `f`. 847 /// 848 /// # Example 849 /// ``` 850 /// use once_cell::sync::OnceCell; 851 /// 852 /// static CELL: OnceCell<String> = OnceCell::new(); 853 /// assert!(CELL.get().is_none()); 854 /// 855 /// std::thread::spawn(|| { 856 /// let value: &String = CELL.get_or_init(|| { 857 /// "Hello, World!".to_string() 858 /// }); 859 /// assert_eq!(value, "Hello, World!"); 860 /// }).join().unwrap(); 861 /// 862 /// let value: Option<&String> = CELL.get(); 863 /// assert!(value.is_some()); 864 /// assert_eq!(value.unwrap().as_str(), "Hello, World!"); 865 /// ``` 866 pub struct OnceCell<T>(Imp<T>); 867 868 impl<T> Default for OnceCell<T> { 869 fn default() -> OnceCell<T> { 870 OnceCell::new() 871 } 872 } 873 874 impl<T: fmt::Debug> fmt::Debug for OnceCell<T> { 875 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 876 match self.get() { 877 Some(v) => f.debug_tuple("OnceCell").field(v).finish(), 878 None => f.write_str("OnceCell(Uninit)"), 879 } 880 } 881 } 882 883 impl<T: Clone> Clone for OnceCell<T> { 884 fn clone(&self) -> OnceCell<T> { 885 match self.get() { 886 Some(value) => Self::with_value(value.clone()), 887 None => Self::new(), 888 } 889 } 890 891 fn clone_from(&mut self, source: &Self) { 892 match (self.get_mut(), source.get()) { 893 (Some(this), Some(source)) => this.clone_from(source), 894 _ => *self = source.clone(), 895 } 896 } 897 } 898 899 impl<T> From<T> for OnceCell<T> { 900 fn from(value: T) -> Self { 901 Self::with_value(value) 902 } 903 } 904 905 impl<T: PartialEq> PartialEq for OnceCell<T> { 906 fn eq(&self, other: &OnceCell<T>) -> bool { 907 self.get() == other.get() 908 } 909 } 910 911 impl<T: Eq> Eq for OnceCell<T> {} 912 913 impl<T> OnceCell<T> { 914 /// Creates a new empty cell. 915 pub const fn new() -> OnceCell<T> { 916 OnceCell(Imp::new()) 917 } 918 919 /// Creates a new initialized cell. 920 pub const fn with_value(value: T) -> OnceCell<T> { 921 OnceCell(Imp::with_value(value)) 922 } 923 924 /// Gets the reference to the underlying value. 925 /// 926 /// Returns `None` if the cell is empty, or being initialized. This 927 /// method never blocks. 928 pub fn get(&self) -> Option<&T> { 929 if self.0.is_initialized() { 930 // Safe b/c value is initialized. 931 Some(unsafe { self.get_unchecked() }) 932 } else { 933 None 934 } 935 } 936 937 /// Gets the reference to the underlying value, blocking the current 938 /// thread until it is set. 939 /// 940 /// ``` 941 /// use once_cell::sync::OnceCell; 942 /// 943 /// let mut cell = std::sync::Arc::new(OnceCell::new()); 944 /// let t = std::thread::spawn({ 945 /// let cell = std::sync::Arc::clone(&cell); 946 /// move || cell.set(92).unwrap() 947 /// }); 948 /// 949 /// // Returns immediately, but might return None. 950 /// let _value_or_none = cell.get(); 951 /// 952 /// // Will return 92, but might block until the other thread does `.set`. 953 /// let value: &u32 = cell.wait(); 954 /// assert_eq!(*value, 92); 955 /// t.join().unwrap(); 956 /// ``` 957 #[cfg(feature = "std")] 958 pub fn wait(&self) -> &T { 959 if !self.0.is_initialized() { 960 self.0.wait() 961 } 962 debug_assert!(self.0.is_initialized()); 963 // Safe b/c of the wait call above and the fact that we didn't 964 // relinquish our borrow. 965 unsafe { self.get_unchecked() } 966 } 967 968 /// Gets the mutable reference to the underlying value. 969 /// 970 /// Returns `None` if the cell is empty. 971 /// 972 /// This method is allowed to violate the invariant of writing to a `OnceCell` 973 /// at most once because it requires `&mut` access to `self`. As with all 974 /// interior mutability, `&mut` access permits arbitrary modification: 975 /// 976 /// ``` 977 /// use once_cell::sync::OnceCell; 978 /// 979 /// let mut cell: OnceCell<u32> = OnceCell::new(); 980 /// cell.set(92).unwrap(); 981 /// cell = OnceCell::new(); 982 /// ``` 983 #[inline] 984 pub fn get_mut(&mut self) -> Option<&mut T> { 985 self.0.get_mut() 986 } 987 988 /// Get the reference to the underlying value, without checking if the 989 /// cell is initialized. 990 /// 991 /// # Safety 992 /// 993 /// Caller must ensure that the cell is in initialized state, and that 994 /// the contents are acquired by (synchronized to) this thread. 995 #[inline] 996 pub unsafe fn get_unchecked(&self) -> &T { 997 self.0.get_unchecked() 998 } 999 1000 /// Sets the contents of this cell to `value`. 1001 /// 1002 /// Returns `Ok(())` if the cell was empty and `Err(value)` if it was 1003 /// full. 1004 /// 1005 /// # Example 1006 /// 1007 /// ``` 1008 /// use once_cell::sync::OnceCell; 1009 /// 1010 /// static CELL: OnceCell<i32> = OnceCell::new(); 1011 /// 1012 /// fn main() { 1013 /// assert!(CELL.get().is_none()); 1014 /// 1015 /// std::thread::spawn(|| { 1016 /// assert_eq!(CELL.set(92), Ok(())); 1017 /// }).join().unwrap(); 1018 /// 1019 /// assert_eq!(CELL.set(62), Err(62)); 1020 /// assert_eq!(CELL.get(), Some(&92)); 1021 /// } 1022 /// ``` 1023 pub fn set(&self, value: T) -> Result<(), T> { 1024 match self.try_insert(value) { 1025 Ok(_) => Ok(()), 1026 Err((_, value)) => Err(value), 1027 } 1028 } 1029 1030 /// Like [`set`](Self::set), but also returns a reference to the final cell value. 1031 /// 1032 /// # Example 1033 /// 1034 /// ``` 1035 /// use once_cell::unsync::OnceCell; 1036 /// 1037 /// let cell = OnceCell::new(); 1038 /// assert!(cell.get().is_none()); 1039 /// 1040 /// assert_eq!(cell.try_insert(92), Ok(&92)); 1041 /// assert_eq!(cell.try_insert(62), Err((&92, 62))); 1042 /// 1043 /// assert!(cell.get().is_some()); 1044 /// ``` 1045 pub fn try_insert(&self, value: T) -> Result<&T, (&T, T)> { 1046 let mut value = Some(value); 1047 let res = self.get_or_init(|| unsafe { unwrap_unchecked(value.take()) }); 1048 match value { 1049 None => Ok(res), 1050 Some(value) => Err((res, value)), 1051 } 1052 } 1053 1054 /// Gets the contents of the cell, initializing it with `f` if the cell 1055 /// was empty. 1056 /// 1057 /// Many threads may call `get_or_init` concurrently with different 1058 /// initializing functions, but it is guaranteed that only one function 1059 /// will be executed. 1060 /// 1061 /// # Panics 1062 /// 1063 /// If `f` panics, the panic is propagated to the caller, and the cell 1064 /// remains uninitialized. 1065 /// 1066 /// It is an error to reentrantly initialize the cell from `f`. The 1067 /// exact outcome is unspecified. Current implementation deadlocks, but 1068 /// this may be changed to a panic in the future. 1069 /// 1070 /// # Example 1071 /// ``` 1072 /// use once_cell::sync::OnceCell; 1073 /// 1074 /// let cell = OnceCell::new(); 1075 /// let value = cell.get_or_init(|| 92); 1076 /// assert_eq!(value, &92); 1077 /// let value = cell.get_or_init(|| unreachable!()); 1078 /// assert_eq!(value, &92); 1079 /// ``` 1080 pub fn get_or_init<F>(&self, f: F) -> &T 1081 where 1082 F: FnOnce() -> T, 1083 { 1084 enum Void {} 1085 match self.get_or_try_init(|| Ok::<T, Void>(f())) { 1086 Ok(val) => val, 1087 Err(void) => match void {}, 1088 } 1089 } 1090 1091 /// Gets the contents of the cell, initializing it with `f` if 1092 /// the cell was empty. If the cell was empty and `f` failed, an 1093 /// error is returned. 1094 /// 1095 /// # Panics 1096 /// 1097 /// If `f` panics, the panic is propagated to the caller, and 1098 /// the cell remains uninitialized. 1099 /// 1100 /// It is an error to reentrantly initialize the cell from `f`. 1101 /// The exact outcome is unspecified. Current implementation 1102 /// deadlocks, but this may be changed to a panic in the future. 1103 /// 1104 /// # Example 1105 /// ``` 1106 /// use once_cell::sync::OnceCell; 1107 /// 1108 /// let cell = OnceCell::new(); 1109 /// assert_eq!(cell.get_or_try_init(|| Err(())), Err(())); 1110 /// assert!(cell.get().is_none()); 1111 /// let value = cell.get_or_try_init(|| -> Result<i32, ()> { 1112 /// Ok(92) 1113 /// }); 1114 /// assert_eq!(value, Ok(&92)); 1115 /// assert_eq!(cell.get(), Some(&92)) 1116 /// ``` 1117 pub fn get_or_try_init<F, E>(&self, f: F) -> Result<&T, E> 1118 where 1119 F: FnOnce() -> Result<T, E>, 1120 { 1121 // Fast path check 1122 if let Some(value) = self.get() { 1123 return Ok(value); 1124 } 1125 1126 self.0.initialize(f)?; 1127 1128 // Safe b/c value is initialized. 1129 debug_assert!(self.0.is_initialized()); 1130 Ok(unsafe { self.get_unchecked() }) 1131 } 1132 1133 /// Takes the value out of this `OnceCell`, moving it back to an uninitialized state. 1134 /// 1135 /// Has no effect and returns `None` if the `OnceCell` hasn't been initialized. 1136 /// 1137 /// # Examples 1138 /// 1139 /// ``` 1140 /// use once_cell::sync::OnceCell; 1141 /// 1142 /// let mut cell: OnceCell<String> = OnceCell::new(); 1143 /// assert_eq!(cell.take(), None); 1144 /// 1145 /// let mut cell = OnceCell::new(); 1146 /// cell.set("hello".to_string()).unwrap(); 1147 /// assert_eq!(cell.take(), Some("hello".to_string())); 1148 /// assert_eq!(cell.get(), None); 1149 /// ``` 1150 /// 1151 /// This method is allowed to violate the invariant of writing to a `OnceCell` 1152 /// at most once because it requires `&mut` access to `self`. As with all 1153 /// interior mutability, `&mut` access permits arbitrary modification: 1154 /// 1155 /// ``` 1156 /// use once_cell::sync::OnceCell; 1157 /// 1158 /// let mut cell: OnceCell<u32> = OnceCell::new(); 1159 /// cell.set(92).unwrap(); 1160 /// cell = OnceCell::new(); 1161 /// ``` 1162 pub fn take(&mut self) -> Option<T> { 1163 mem::replace(self, Self::default()).into_inner() 1164 } 1165 1166 /// Consumes the `OnceCell`, returning the wrapped value. Returns 1167 /// `None` if the cell was empty. 1168 /// 1169 /// # Examples 1170 /// 1171 /// ``` 1172 /// use once_cell::sync::OnceCell; 1173 /// 1174 /// let cell: OnceCell<String> = OnceCell::new(); 1175 /// assert_eq!(cell.into_inner(), None); 1176 /// 1177 /// let cell = OnceCell::new(); 1178 /// cell.set("hello".to_string()).unwrap(); 1179 /// assert_eq!(cell.into_inner(), Some("hello".to_string())); 1180 /// ``` 1181 #[inline] 1182 pub fn into_inner(self) -> Option<T> { 1183 self.0.into_inner() 1184 } 1185 } 1186 1187 /// A value which is initialized on the first access. 1188 /// 1189 /// This type is thread-safe and can be used in statics. 1190 /// 1191 /// # Example 1192 /// 1193 /// ``` 1194 /// use std::collections::HashMap; 1195 /// 1196 /// use once_cell::sync::Lazy; 1197 /// 1198 /// static HASHMAP: Lazy<HashMap<i32, String>> = Lazy::new(|| { 1199 /// println!("initializing"); 1200 /// let mut m = HashMap::new(); 1201 /// m.insert(13, "Spica".to_string()); 1202 /// m.insert(74, "Hoyten".to_string()); 1203 /// m 1204 /// }); 1205 /// 1206 /// fn main() { 1207 /// println!("ready"); 1208 /// std::thread::spawn(|| { 1209 /// println!("{:?}", HASHMAP.get(&13)); 1210 /// }).join().unwrap(); 1211 /// println!("{:?}", HASHMAP.get(&74)); 1212 /// 1213 /// // Prints: 1214 /// // ready 1215 /// // initializing 1216 /// // Some("Spica") 1217 /// // Some("Hoyten") 1218 /// } 1219 /// ``` 1220 pub struct Lazy<T, F = fn() -> T> { 1221 cell: OnceCell<T>, 1222 init: Cell<Option<F>>, 1223 } 1224 1225 impl<T: fmt::Debug, F> fmt::Debug for Lazy<T, F> { 1226 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 1227 f.debug_struct("Lazy").field("cell", &self.cell).field("init", &"..").finish() 1228 } 1229 } 1230 1231 // We never create a `&F` from a `&Lazy<T, F>` so it is fine to not impl 1232 // `Sync` for `F`. We do create a `&mut Option<F>` in `force`, but this is 1233 // properly synchronized, so it only happens once so it also does not 1234 // contribute to this impl. 1235 unsafe impl<T, F: Send> Sync for Lazy<T, F> where OnceCell<T>: Sync {} 1236 // auto-derived `Send` impl is OK. 1237 1238 impl<T, F: RefUnwindSafe> RefUnwindSafe for Lazy<T, F> where OnceCell<T>: RefUnwindSafe {} 1239 1240 impl<T, F> Lazy<T, F> { 1241 /// Creates a new lazy value with the given initializing 1242 /// function. 1243 pub const fn new(f: F) -> Lazy<T, F> { 1244 Lazy { cell: OnceCell::new(), init: Cell::new(Some(f)) } 1245 } 1246 1247 /// Consumes this `Lazy` returning the stored value. 1248 /// 1249 /// Returns `Ok(value)` if `Lazy` is initialized and `Err(f)` otherwise. 1250 pub fn into_value(this: Lazy<T, F>) -> Result<T, F> { 1251 let cell = this.cell; 1252 let init = this.init; 1253 cell.into_inner().ok_or_else(|| { 1254 init.take().unwrap_or_else(|| panic!("Lazy instance has previously been poisoned")) 1255 }) 1256 } 1257 } 1258 1259 impl<T, F: FnOnce() -> T> Lazy<T, F> { 1260 /// Forces the evaluation of this lazy value and 1261 /// returns a reference to the result. This is equivalent 1262 /// to the `Deref` impl, but is explicit. 1263 /// 1264 /// # Example 1265 /// ``` 1266 /// use once_cell::sync::Lazy; 1267 /// 1268 /// let lazy = Lazy::new(|| 92); 1269 /// 1270 /// assert_eq!(Lazy::force(&lazy), &92); 1271 /// assert_eq!(&*lazy, &92); 1272 /// ``` 1273 pub fn force(this: &Lazy<T, F>) -> &T { 1274 this.cell.get_or_init(|| match this.init.take() { 1275 Some(f) => f(), 1276 None => panic!("Lazy instance has previously been poisoned"), 1277 }) 1278 } 1279 1280 /// Forces the evaluation of this lazy value and 1281 /// returns a mutable reference to the result. This is equivalent 1282 /// to the `Deref` impl, but is explicit. 1283 /// 1284 /// # Example 1285 /// ``` 1286 /// use once_cell::sync::Lazy; 1287 /// 1288 /// let mut lazy = Lazy::new(|| 92); 1289 /// 1290 /// assert_eq!(Lazy::force_mut(&mut lazy), &mut 92); 1291 /// ``` 1292 pub fn force_mut(this: &mut Lazy<T, F>) -> &mut T { 1293 Self::force(this); 1294 Self::get_mut(this).unwrap_or_else(|| unreachable!()) 1295 } 1296 1297 /// Gets the reference to the result of this lazy value if 1298 /// it was initialized, otherwise returns `None`. 1299 /// 1300 /// # Example 1301 /// ``` 1302 /// use once_cell::sync::Lazy; 1303 /// 1304 /// let lazy = Lazy::new(|| 92); 1305 /// 1306 /// assert_eq!(Lazy::get(&lazy), None); 1307 /// assert_eq!(&*lazy, &92); 1308 /// assert_eq!(Lazy::get(&lazy), Some(&92)); 1309 /// ``` 1310 pub fn get(this: &Lazy<T, F>) -> Option<&T> { 1311 this.cell.get() 1312 } 1313 1314 /// Gets the reference to the result of this lazy value if 1315 /// it was initialized, otherwise returns `None`. 1316 /// 1317 /// # Example 1318 /// ``` 1319 /// use once_cell::sync::Lazy; 1320 /// 1321 /// let mut lazy = Lazy::new(|| 92); 1322 /// 1323 /// assert_eq!(Lazy::get_mut(&mut lazy), None); 1324 /// assert_eq!(&*lazy, &92); 1325 /// assert_eq!(Lazy::get_mut(&mut lazy), Some(&mut 92)); 1326 /// ``` 1327 pub fn get_mut(this: &mut Lazy<T, F>) -> Option<&mut T> { 1328 this.cell.get_mut() 1329 } 1330 } 1331 1332 impl<T, F: FnOnce() -> T> Deref for Lazy<T, F> { 1333 type Target = T; 1334 fn deref(&self) -> &T { 1335 Lazy::force(self) 1336 } 1337 } 1338 1339 impl<T, F: FnOnce() -> T> DerefMut for Lazy<T, F> { 1340 fn deref_mut(&mut self) -> &mut T { 1341 Lazy::force(self); 1342 self.cell.get_mut().unwrap_or_else(|| unreachable!()) 1343 } 1344 } 1345 1346 impl<T: Default> Default for Lazy<T> { 1347 /// Creates a new lazy value using `Default` as the initializing function. 1348 fn default() -> Lazy<T> { 1349 Lazy::new(T::default) 1350 } 1351 } 1352 1353 /// ```compile_fail 1354 /// struct S(*mut ()); 1355 /// unsafe impl Sync for S {} 1356 /// 1357 /// fn share<T: Sync>(_: &T) {} 1358 /// share(&once_cell::sync::OnceCell::<S>::new()); 1359 /// ``` 1360 /// 1361 /// ```compile_fail 1362 /// struct S(*mut ()); 1363 /// unsafe impl Sync for S {} 1364 /// 1365 /// fn share<T: Sync>(_: &T) {} 1366 /// share(&once_cell::sync::Lazy::<S>::new(|| unimplemented!())); 1367 /// ``` 1368 fn _dummy() {} 1369} 1370 1371#[cfg(feature = "race")] 1372pub mod race; 1373 1374// Remove once MSRV is at least 1.58. 1375#[inline] 1376unsafe fn unwrap_unchecked<T>(val: Option<T>) -> T { 1377 match val { 1378 Some(value) => value, 1379 None => { 1380 debug_assert!(false); 1381 core::hint::unreachable_unchecked() 1382 } 1383 } 1384} 1385