"Benno Lossin" <lossin@xxxxxxxxxx> writes: > On Thu Jul 3, 2025 at 11:03 AM CEST, Andreas Hindborg wrote: >> "Benno Lossin" <lossin@xxxxxxxxxx> writes: >>> On Wed Jul 2, 2025 at 3:18 PM CEST, Andreas Hindborg wrote: [...] >>>> + Some(unsafe { &*self.value.get() }) >>>> + } else { >>>> + None >>>> + } >>>> + } >>>> + >>>> + /// Populate the [`OnceLock`]. >>>> + /// >>>> + /// Returns `true` if the [`OnceLock`] was successfully populated. >>>> + pub fn populate(&self, value: T) -> bool { >>>> + // INVARIANT: We obtain exclusive access to the contained allocation and write 1 to >>>> + // `init`. >>>> + if let Ok(0) = self.init.cmpxchg(0, 1, Acquire) { >>>> + // SAFETY: We obtained exclusive access to the contained object. >>>> + unsafe { core::ptr::write(self.value.get(), value) }; >>>> + // INVARIANT: We release our exclusive access and transition the object to shared >>>> + // access. >>>> + self.init.store(2, Release); >>>> + true >>>> + } else { >>>> + false >>>> + } >>>> + } >>>> +} >>>> + >>>> +impl<T: Copy> OnceLock<T> { >>>> + /// Get a copy of the contained object. >>>> + /// >>>> + /// Returns [`None`] if the [`OnceLock`] is empty. >>>> + pub fn copy(&self) -> Option<T> { >>>> + if self.init.load(Acquire) == 2 { >>>> + // SAFETY: As determined by the load above, the object is ready for shared access. >>>> + Some(unsafe { *self.value.get() }) >>>> + } else { >>>> + None >>>> + } >>> >>> The impl can just be: >>> >>> self.as_ref().copied() >> >> Nice. I was thinking of dropping this method and just have callers do >> >> my_once_lock.as_ref().map(|v| v.copied()) >> >> What do you think? > > There is `Option::copied`, so no need for the `.map` call. Cool. > I don't > really have a preference, if users always want to access it by-value, > then we should have `copy`. But should it be `copy` or `copied` like `Option`? Best regards, Andreas Hindborg