pub struct AtomicSwap<T> { /* private fields */ }Expand description
Allows shared access to T by only swap related operations. Acts like it stores an Option<T>
use atomic_swapping::AtomicSwap;
let swap = AtomicSwap::new(100usize);
assert_eq!(swap.clone_inner(), 100usize);
assert_eq!(swap.swap(300usize), 100usize);
assert_eq!(swap.clone_inner(), 300usize);Implementations§
Source§impl<T> AtomicSwap<T>
impl<T> AtomicSwap<T>
Sourcepub const fn new(value: T) -> Self
pub const fn new(value: T) -> Self
Creates a new AtomicSwap from a value.
let some_swap = AtomicSwap::new(100usize);
assert_eq!(some_swap.swap(200usize), 100usize);Sourcepub fn swap(&self, value: T) -> T
pub fn swap(&self, value: T) -> T
Swaps the current value in the swap with value, returning the currently contained value.
Same as AtomicSwap::swap_hint with spin_loop as spin_loop_hint.
let swap = AtomicSwap::new(100usize);
assert_eq!(swap.swap(200usize), 100usize);
assert_eq!(swap.swap(300usize), 200usize);Sourcepub fn swap_hint(&self, value: T, spin_loop_hint: impl FnMut()) -> T
pub fn swap_hint(&self, value: T, spin_loop_hint: impl FnMut()) -> T
Swaps the current value in the swap with value, returning the currently contained value.
Same as AtomicSwap::swap but with a custom spin loop hint function.
let swap = AtomicSwap::new(100usize);
let spin_hint = ||println!("I'm spinning! Probably should yield here.");
assert_eq!(swap.swap_hint(200usize, spin_hint), 100usize);
assert_eq!(swap.swap_hint(300usize, spin_hint), 200usize);Sourcepub fn clone_inner(&self) -> T
pub fn clone_inner(&self) -> T
Clones the contained value if Some and returns it. T must be Clone and Sync because multiple threads could clone this simultaneously.
Same as AtomicSwap::clone_inner_hint with spin_loop as spin_loop_hint.
let swap = AtomicSwap::new(100usize);
assert_eq!(swap.clone_inner(), 100usize);
assert_eq!(swap.swap(200usize), 100usize);
assert_eq!(swap.clone_inner(), 200usize);Sourcepub fn clone_inner_hint(&self, spin_loop_hint: impl FnMut()) -> T
pub fn clone_inner_hint(&self, spin_loop_hint: impl FnMut()) -> T
Clones the contained value if Some and returns it. T must be Clone and Sync because multiple threads could clone this simultaneously.
Same as AtomicSwap::clone_inner but with a custom spin loop hint function.
let swap = AtomicSwap::new(100usize);
let spin_hint = ||println!("I'm spinning! Probably should yield here.");
assert_eq!(swap.clone_inner_hint(spin_hint), 100usize);
assert_eq!(swap.swap_hint(200usize, spin_hint), 100usize);
assert_eq!(swap.clone_inner_hint(spin_hint), 200usize);