use ruda_kernel::dsl::{Runtime, prelude::InputScalar};
use ruda_kernel::tensor::RudaTensor;
use super::binary::numeric::{AddOp, DivOp, MulOp, PowOp, RemainderOp, SubOp, launch_binop, launch_scalar_binop};
use super::binary::int::{BitwiseAndOp, BitwiseOrOp, BitwiseXorOp, launch_binop_int, launch_scalar_binop_int};
pub fn add<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop::<R, AddOp>(lhs, rhs)
}
pub fn add_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop::<R, AddOp>(lhs, rhs)
}
pub fn sub<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop::<R, SubOp>(lhs, rhs)
}
pub fn sub_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop::<R, SubOp>(lhs, rhs)
}
pub fn mul<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop::<R, MulOp>(lhs, rhs)
}
pub fn mul_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop::<R, MulOp>(lhs, rhs)
}
pub fn div<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop::<R, DivOp>(lhs, rhs)
}
pub fn div_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop::<R, DivOp>(lhs, rhs)
}
pub fn remainder<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop::<R, RemainderOp>(lhs, rhs)
}
pub fn remainder_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop::<R, RemainderOp>(lhs, rhs)
}
pub fn pow<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop::<R, PowOp>(lhs, rhs)
}
pub fn bitwise_and<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop_int::<R, BitwiseAndOp>(lhs, rhs)
}
pub fn bitwise_and_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop_int::<R, BitwiseAndOp>(lhs, rhs)
}
pub fn bitwise_or<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop_int::<R, BitwiseOrOp>(lhs, rhs)
}
pub fn bitwise_or_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop_int::<R, BitwiseOrOp>(lhs, rhs)
}
pub fn bitwise_xor<R: Runtime>(lhs: RudaTensor<R>, rhs: RudaTensor<R>) -> RudaTensor<R> {
launch_binop_int::<R, BitwiseXorOp>(lhs, rhs)
}
pub fn bitwise_xor_scalar<R: Runtime>(lhs: RudaTensor<R>, rhs: InputScalar) -> RudaTensor<R> {
launch_scalar_binop_int::<R, BitwiseXorOp>(lhs, rhs)
}