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