Add some optimizations

This commit is contained in:
daxpedda 2023-10-08 21:12:43 +02:00
parent 6db2587999
commit dd34d9027a
No known key found for this signature in database
GPG Key ID: 43D62A3EA388E46F

View File

@ -128,8 +128,7 @@ impl<T> OnceCell<T> {
// checked that slot is currently `None`, so this write
// maintains the `inner`'s invariant.
let slot = unsafe { &mut *self.inner.get() };
*slot = Some(value);
Ok(self.get().unwrap())
Ok(slot.insert(value))
}
/// Gets the contents of the cell, initializing it with `f`
@ -213,10 +212,9 @@ impl<T> OnceCell<T> {
let val = outlined_call(f)?;
// Note that *some* forms of reentrant initialization might lead to
// UB (see `reentrant_init` test). I believe that just removing this
// `assert`, while keeping `set/get` would be sound, but it seems
// `panic`, while keeping `try_insert` would be sound, but it seems
// better to panic, rather than to silently use an old value.
assert!(self.set(val).is_ok(), "reentrant init");
Ok(self.get().unwrap())
if let Ok(val) = self.try_insert(val) { Ok(val) } else { panic!("reentrant init") }
}
/// Consumes the cell, returning the wrapped value.