use core::sync::atomic::Ordering;
pub trait And {
type Value;
fn fetch_and(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Nand {
type Value;
fn fetch_nand(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Or {
type Value;
fn fetch_or(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Xor {
type Value;
fn fetch_xor(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Add {
type Value;
fn fetch_add(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Sub {
type Value;
fn fetch_sub(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Update {
type Value;
fn fetch_update<F>(
&self,
fetch_order: Ordering,
set_order: Ordering,
f: F,
) -> Result<Self::Value, Self::Value>
where
F: FnMut(Self::Value) -> Option<Self::Value>;
}
pub trait Max {
type Value;
fn fetch_max(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}
pub trait Min {
type Value;
fn fetch_min(
&self,
val: Self::Value,
order: Ordering,
) -> Self::Value;
}