pub enum Steal<T> {
Empty,
Success(T),
Retry,
}
Expand description
Possible outcomes of a steal operation.
§Examples
There are lots of ways to chain results of steal operations together:
use crossbeam_deque::Steal::{self, Empty, Retry, Success};
let collect = |v: Vec<Steal<i32>>| v.into_iter().collect::<Steal<i32>>();
assert_eq!(collect(vec![Empty, Empty, Empty]), Empty);
assert_eq!(collect(vec![Empty, Retry, Empty]), Retry);
assert_eq!(collect(vec![Retry, Success(1), Empty]), Success(1));
assert_eq!(collect(vec![Empty, Empty]).or_else(|| Retry), Retry);
assert_eq!(collect(vec![Retry, Empty]).or_else(|| Success(1)), Success(1));
Variants§
Empty
The queue was empty at the time of stealing.
Success(T)
At least one task was successfully stolen.
Retry
The steal operation needs to be retried.
Implementations§
Source§impl<T> Steal<T>
impl<T> Steal<T>
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the queue was empty at the time of stealing.
§Examples
use crossbeam_deque::Steal::{Empty, Retry, Success};
assert!(!Success(7).is_empty());
assert!(!Retry::<i32>.is_empty());
assert!(Empty::<i32>.is_empty());
Sourcepub fn is_success(&self) -> bool
pub fn is_success(&self) -> bool
Returns true
if at least one task was stolen.
§Examples
use crossbeam_deque::Steal::{Empty, Retry, Success};
assert!(!Empty::<i32>.is_success());
assert!(!Retry::<i32>.is_success());
assert!(Success(7).is_success());
Sourcepub fn is_retry(&self) -> bool
pub fn is_retry(&self) -> bool
Returns true
if the steal operation needs to be retried.
§Examples
use crossbeam_deque::Steal::{Empty, Retry, Success};
assert!(!Empty::<i32>.is_retry());
assert!(!Success(7).is_retry());
assert!(Retry::<i32>.is_retry());
Sourcepub fn success(self) -> Option<T>
pub fn success(self) -> Option<T>
Returns the result of the operation, if successful.
§Examples
use crossbeam_deque::Steal::{Empty, Retry, Success};
assert_eq!(Empty::<i32>.success(), None);
assert_eq!(Retry::<i32>.success(), None);
assert_eq!(Success(7).success(), Some(7));
Sourcepub fn or_else<F>(self, f: F) -> Steal<T>
pub fn or_else<F>(self, f: F) -> Steal<T>
If no task was stolen, attempts another steal operation.
Returns this steal result if it is Success
. Otherwise, closure f
is invoked and then:
- If the second steal resulted in
Success
, it is returned. - If both steals were unsuccessful but any resulted in
Retry
, thenRetry
is returned. - If both resulted in
None
, thenNone
is returned.
§Examples
use crossbeam_deque::Steal::{Empty, Retry, Success};
assert_eq!(Success(1).or_else(|| Success(2)), Success(1));
assert_eq!(Retry.or_else(|| Success(2)), Success(2));
assert_eq!(Retry.or_else(|| Empty), Retry::<i32>);
assert_eq!(Empty.or_else(|| Retry), Retry::<i32>);
assert_eq!(Empty.or_else(|| Empty), Empty::<i32>);
Trait Implementations§
Source§impl<T> FromIterator<Steal<T>> for Steal<T>
impl<T> FromIterator<Steal<T>> for Steal<T>
impl<T> Copy for Steal<T>where
T: Copy,
impl<T> Eq for Steal<T>where
T: Eq,
impl<T> StructuralPartialEq for Steal<T>
Auto Trait Implementations§
impl<T> Freeze for Steal<T>where
T: Freeze,
impl<T> RefUnwindSafe for Steal<T>where
T: RefUnwindSafe,
impl<T> Send for Steal<T>where
T: Send,
impl<T> Sync for Steal<T>where
T: Sync,
impl<T> Unpin for Steal<T>where
T: Unpin,
impl<T> UnwindSafe for Steal<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (
clone_to_uninit
)