Struct voluntary_servitude::atomics::FillOnceAtomicOption
source · 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
sourceimpl<T> FillOnceAtomicOption<T>
impl<T> FillOnceAtomicOption<T>
sourcepub fn new<V>(data: V) -> Selfwhere
V: Into<Option<Box<T>>>,
pub fn new<V>(data: V) -> Selfwhere
V: Into<Option<Box<T>>>,
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));
sourcepub fn try_store<V>(&self, data: V, order: Ordering) -> Result<(), NotEmpty>where
V: Into<Box<T>>,
pub fn try_store<V>(&self, data: V, order: Ordering) -> Result<(), NotEmpty>where
V: Into<Box<T>>,
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));
sourcepub fn take(&mut self, order: Ordering) -> Option<Box<T>>
pub fn take(&mut self, order: Ordering) -> Option<Box<T>>
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);
sourceimpl<T: Copy> FillOnceAtomicOption<T>
impl<T: Copy> FillOnceAtomicOption<T>
sourcepub fn load(&self, order: Ordering) -> Option<T>
pub fn load(&self, order: Ordering) -> Option<T>
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));
sourceimpl<T> FillOnceAtomicOption<T>
impl<T> FillOnceAtomicOption<T>
sourcepub fn get_ref(&self, order: Ordering) -> Option<&T>
pub fn get_ref(&self, order: Ordering) -> Option<&T>
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));
sourcepub fn into_inner(self) -> Option<Box<T>>
pub fn into_inner(self) -> Option<Box<T>>
Converts itself into a Option<Box<T>>
let ten = FillOnceAtomicOption::from(10);
assert_eq!(ten.into_inner().map(|a| *a), Some(10));
sourcepub unsafe fn from_raw(ptr: *mut T) -> Self
pub unsafe fn from_raw(ptr: *mut T) -> Self
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));
sourcepub fn get_raw(&self, order: Ordering) -> *mut T
pub fn get_raw(&self, order: Ordering) -> *mut T
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
sourceimpl<T: Debug> Debug for FillOnceAtomicOption<T>
impl<T: Debug> Debug for FillOnceAtomicOption<T>
sourceimpl<T> Default for FillOnceAtomicOption<T>
impl<T> Default for FillOnceAtomicOption<T>
sourceimpl<T> From<Atomic<T>> for FillOnceAtomicOption<T>
impl<T> From<Atomic<T>> for FillOnceAtomicOption<T>
sourceimpl<T> From<AtomicOption<T>> for FillOnceAtomicOption<T>
impl<T> From<AtomicOption<T>> for FillOnceAtomicOption<T>
sourcefn from(atomic: AtomicOption<T>) -> Self
fn from(atomic: AtomicOption<T>) -> Self
sourceimpl<T> From<Box<T, Global>> for FillOnceAtomicOption<T>
impl<T> From<Box<T, Global>> for FillOnceAtomicOption<T>
sourceimpl<T> From<FillOnceAtomicOption<T>> for AtomicOption<T>
impl<T> From<FillOnceAtomicOption<T>> for AtomicOption<T>
sourcefn from(atomic: FillOnceAtomicOption<T>) -> Self
fn from(atomic: FillOnceAtomicOption<T>) -> Self
sourceimpl<T> From<Option<T>> for FillOnceAtomicOption<T>
impl<T> From<Option<T>> for FillOnceAtomicOption<T>
sourceimpl<T> From<T> for FillOnceAtomicOption<T>
impl<T> From<T> for FillOnceAtomicOption<T>
Auto Trait Implementations
impl<T> RefUnwindSafe for FillOnceAtomicOption<T>where
T: RefUnwindSafe,
impl<T> Send for FillOnceAtomicOption<T>where
T: Send,
impl<T> Sync for FillOnceAtomicOption<T>where
T: Sync,
impl<T> Unpin for FillOnceAtomicOption<T>
impl<T> UnwindSafe for FillOnceAtomicOption<T>where
T: UnwindSafe + RefUnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
sourceimpl<T> IntoSql for T
impl<T> IntoSql for T
sourcefn into_sql<T>(self) -> Self::Expressionwhere
Self: AsExpression<T> + Sized,
fn into_sql<T>(self) -> Self::Expressionwhere
Self: AsExpression<T> + Sized,
self
to an expression for Diesel’s query builder. Read moresourcefn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expressionwhere
&'a Self: AsExpression<T>,
fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expressionwhere
&'a Self: AsExpression<T>,
&self
to an expression for Diesel’s query builder. Read more