pub struct FillOnceAtomicOption<T>(_);
Expand description

Atomic abstraction of a Option<Box<T>> that can provide access to a Option<&T>

This is ideal for a iterator or some consumer that doesn’t actually consume the data

To make that possible the API is heavily limited (can only write to it through try_store)

Implementations

Creates new FillOnceAtomicOption

use std::sync::atomic::Ordering;
let empty: FillOnceAtomicOption<()> = FillOnceAtomicOption::new(None);
assert_eq!(empty.get_ref(Ordering::SeqCst), None);

let filled = FillOnceAtomicOption::new(Box::new(10));
assert_eq!(filled.get_ref(Ordering::SeqCst), Some(&10));

Stores new value if FillOnceAtomicOption was not initialized (contains a None)

This operation is implemented as a single atomic compare_and_swap.

use std::sync::atomic::Ordering;
let option = FillOnceAtomicOption::default();
let old = option.try_store(5, Ordering::SeqCst);
assert!(old.is_ok());
assert_eq!(option.get_ref(Ordering::SeqCst), Some(&5));

let failed_to_store = option.try_store(10, Ordering::SeqCst);
assert!(failed_to_store.is_err());
assert_eq!(option.get_ref(Ordering::SeqCst), Some(&5));

Replaces FillOnceAtomicOption value with None returning old value

As opposed to take from AtomicOption

use std::sync::atomic::Ordering;
let mut option = FillOnceAtomicOption::from(5);
assert_eq!(option.take(Ordering::SeqCst), Some(Box::new(5)));
assert_eq!(option.take(Ordering::SeqCst), None);

Returns a copy of the wrapped T

use std::sync::atomic::Ordering;
let empty: FillOnceAtomicOption<()> = FillOnceAtomicOption::new(None);
assert_eq!(empty.load(Ordering::SeqCst), None);

let filled = FillOnceAtomicOption::from(10);
assert_eq!(filled.load(Ordering::SeqCst), Some(10));

Atomically extracts a reference to the element stored

use std::sync::atomic::Ordering;
let empty: FillOnceAtomicOption<()> = FillOnceAtomicOption::new(None);
assert_eq!(empty.get_ref(Ordering::SeqCst), None);

let filled = FillOnceAtomicOption::from(10);
assert_eq!(filled.get_ref(Ordering::SeqCst), Some(&10));

Converts itself into a Option<Box<T>>

let ten = FillOnceAtomicOption::from(10);
assert_eq!(ten.into_inner().map(|a| *a), Some(10));

Creates new FillOnceAtomicOption based on a raw pointer

Safety

Unsafe because it uses a raw pointer, so it can’t be sure of its origin (and ownership)

You must own the pointer to call this

use std::{sync::atomic::Ordering, ptr::null_mut};
let empty = unsafe { FillOnceAtomicOption::<()>::from_raw(null_mut()) };
assert_eq!(empty.get_ref(Ordering::SeqCst), None);

let filled = unsafe { FillOnceAtomicOption::from_raw(Box::into_raw(10.into())) };
assert_eq!(filled.get_ref(Ordering::SeqCst), Some(&10));

Atomically extracts the stored pointer

If pointer returned is not null it’s safe to deref as long as you don’t drop the FillOnceAtomicOption

Safety

To deref it you must ensure that it’s not null, the FillOnceAtomicOption wasn’t dropped

Returns null if FillOnceAtomicOption is empty (was not initialized or dropped)

use std::{sync::atomic::Ordering, ptr::null_mut, ops::Deref};
let empty: FillOnceAtomicOption<()> = FillOnceAtomicOption::new(None);
assert_eq!(empty.get_raw(Ordering::SeqCst), null_mut());

let filled = FillOnceAtomicOption::from(10);
assert_eq!(unsafe { (&*filled.get_raw(Ordering::SeqCst)).deref() }, &10);

Trait Implementations

Formats the value using the given formatter. Read more
Returns the “default value” for a type. Read more
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Converts to this type from the input type.
Formats the value using the given formatter.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Converts to this type from the input type.

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Convert self to an expression for Diesel’s query builder. Read more
Convert &self to an expression for Diesel’s query builder. Read more
The alignment of pointer.
The type for initializers.
Initializes a with the given initializer. Read more
Dereferences the given pointer. Read more
Mutably dereferences the given pointer. Read more
Drops the object pointed to by the given pointer. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.