use crate::ir::model::expr::{Expr, Ident};
use crate::ir::model::types::AtomicOp;
impl Expr {
#[must_use]
#[inline]
pub fn atomic_add(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::Add,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_or(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::Or,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_and(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::And,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_xor(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::Xor,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_min(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::Min,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_max(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::Max,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_exchange(buffer: &str, index: Self, value: Self) -> Self {
Self::Atomic {
op: AtomicOp::Exchange,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: None,
value: Box::new(value),
}
}
#[must_use]
#[inline]
pub fn atomic_compare_exchange(
buffer: &str,
index: Self,
expected: Self,
new_value: Self,
) -> Self {
Self::Atomic {
op: AtomicOp::CompareExchange,
buffer: Ident::from(buffer),
index: Box::new(index),
expected: Some(Box::new(expected)),
value: Box::new(new_value),
}
}
}