use crate::{
core::optional::{
NSTDOptional, NSTDOptionalInt, NSTDOptionalInt16, NSTDOptionalInt32, NSTDOptionalInt64,
NSTDOptionalInt8, NSTDOptionalUInt, NSTDOptionalUInt16, NSTDOptionalUInt32,
NSTDOptionalUInt64, NSTDOptionalUInt8,
},
NSTDFloat32, NSTDFloat64, NSTDInt, NSTDInt16, NSTDInt32, NSTDInt64, NSTDInt8, NSTDUInt,
NSTDUInt16, NSTDUInt32, NSTDUInt64, NSTDUInt8,
};
use nstdapi::nstdapi;
#[inline]
#[nstdapi]
pub fn nstd_core_math_deg_f32(rad: NSTDFloat32) -> NSTDFloat32 {
rad.to_degrees()
}
#[inline]
#[nstdapi]
pub fn nstd_core_math_deg_f64(rad: NSTDFloat64) -> NSTDFloat64 {
rad.to_degrees()
}
#[inline]
#[nstdapi]
pub fn nstd_core_math_rad_f32(deg: NSTDFloat32) -> NSTDFloat32 {
deg.to_radians()
}
#[inline]
#[nstdapi]
pub fn nstd_core_math_rad_f64(deg: NSTDFloat64) -> NSTDFloat64 {
deg.to_radians()
}
macro_rules! gen_abs {
($name: ident, $T: ty) => {
#[doc = concat!("- `", stringify!($T), " x` - The value.")]
#[doc = concat!("`", stringify!($T), " abs` - The absolute value of `x`.")]
#[doc = concat!("use nstd_sys::core::math::", stringify!($name), ";")]
#[doc = concat!("assert!(", stringify!($name), "(10) == 10);")]
#[doc = concat!("assert!(", stringify!($name), "(-10) == 10);")]
#[inline]
#[nstdapi]
pub const fn $name(x: $T) -> $T {
x.abs()
}
};
}
gen_abs!(nstd_core_math_abs_int, NSTDInt);
gen_abs!(nstd_core_math_abs_i8, NSTDInt8);
gen_abs!(nstd_core_math_abs_i16, NSTDInt16);
gen_abs!(nstd_core_math_abs_i32, NSTDInt32);
gen_abs!(nstd_core_math_abs_i64, NSTDInt64);
macro_rules! gen_pow {
($name: ident, $T: ty) => {
#[doc = concat!("- `", stringify!($T), " x` - The value.")]
#[doc = concat!("`", stringify!($T), " pow` - `x` raised to the power of `exp`.")]
#[doc = concat!("use nstd_sys::core::math::", stringify!($name), ";")]
#[doc = concat!("assert!(", stringify!($name), "(2, 3) == 8);")]
#[doc = concat!("assert!(", stringify!($name), "(2, 5) == 32);")]
#[inline]
#[nstdapi]
pub const fn $name(x: $T, exp: NSTDUInt32) -> $T {
x.pow(exp)
}
};
}
gen_pow!(nstd_core_math_pow_int, NSTDInt);
gen_pow!(nstd_core_math_pow_uint, NSTDUInt);
gen_pow!(nstd_core_math_pow_i8, NSTDInt8);
gen_pow!(nstd_core_math_pow_u8, NSTDUInt8);
gen_pow!(nstd_core_math_pow_i16, NSTDInt16);
gen_pow!(nstd_core_math_pow_u16, NSTDUInt16);
gen_pow!(nstd_core_math_pow_i32, NSTDInt32);
gen_pow!(nstd_core_math_pow_u32, NSTDUInt32);
gen_pow!(nstd_core_math_pow_i64, NSTDInt64);
gen_pow!(nstd_core_math_pow_u64, NSTDUInt64);
macro_rules! gen_clamp {
(
$(#[$meta:meta])*
$name: ident, $T: ty
) => {
#[doc = concat!("- `", stringify!($T), " x` - The value to clamp.")]
#[doc = concat!("- `", stringify!($T), " min` - The minimum clamp value.")]
#[doc = concat!("- `", stringify!($T), " max` - The maximum clamp value.")]
#[doc = concat!("`", stringify!($T), " v` - The clamped value.")]
$(#[$meta])*
#[inline]
#[nstdapi]
pub fn $name(x: $T, min: $T, max: $T) -> $T {
x.clamp(min, max)
}
};
}
gen_clamp!(
nstd_core_math_clamp_f32,
NSTDFloat32
);
gen_clamp!(
nstd_core_math_clamp_f64,
NSTDFloat64
);
gen_clamp!(
nstd_core_math_clamp_int,
NSTDInt
);
gen_clamp!(
nstd_core_math_clamp_uint,
NSTDUInt
);
gen_clamp!(
nstd_core_math_clamp_i8,
NSTDInt8
);
gen_clamp!(
nstd_core_math_clamp_u8,
NSTDUInt8
);
gen_clamp!(
nstd_core_math_clamp_i16,
NSTDInt16
);
gen_clamp!(
nstd_core_math_clamp_u16,
NSTDUInt16
);
gen_clamp!(
nstd_core_math_clamp_i32,
NSTDInt32
);
gen_clamp!(
nstd_core_math_clamp_u32,
NSTDUInt32
);
gen_clamp!(
nstd_core_math_clamp_i64,
NSTDInt64
);
gen_clamp!(
nstd_core_math_clamp_u64,
NSTDUInt64
);
macro_rules! gen_div_ceil {
($name: ident, $T: ty, $Opt: ty) => {
#[doc = concat!("- `", stringify!($T), " x` - The first value.")]
#[doc = concat!("- `", stringify!($T), " y` - The second value.")]
#[doc = concat!("`", stringify!($Opt), " v` - The divided value rounded up on success, or an uninitialized \"none\" variant if `y` is 0 or overflow occurs.")]
#[doc = concat!("use nstd_sys::core::{math::", stringify!($name), ", optional::NSTDOptional};")]
#[doc = concat!("assert!(", stringify!($name), "(8, 5) == NSTDOptional::Some(2));")]
#[doc = concat!("assert!(", stringify!($name), "(8, 3) == NSTDOptional::Some(3));")]
#[doc = concat!("assert!(", stringify!($name), "(8, 2) == NSTDOptional::Some(4));")]
#[doc = concat!("assert!(", stringify!($name), "(8, 0) == NSTDOptional::None);")]
#[nstdapi]
#[allow(unused_comparisons)]
pub const fn $name(x: $T, y: $T) -> $Opt {
if let Some(v) = x.checked_div(y) {
if let Some(r) = x.checked_rem(y) {
return match (r > 0 && y > 0) || (r < 0 && y < 0) {
true => match v.checked_add(1) {
Some(v) => NSTDOptional::Some(v),
_ => NSTDOptional::None,
},
false => NSTDOptional::Some(v),
};
}
}
NSTDOptional::None
}
};
}
gen_div_ceil!(nstd_core_math_div_ceil_int, NSTDInt, NSTDOptionalInt);
gen_div_ceil!(nstd_core_math_div_ceil_uint, NSTDUInt, NSTDOptionalUInt);
gen_div_ceil!(nstd_core_math_div_ceil_i8, NSTDInt8, NSTDOptionalInt8);
gen_div_ceil!(nstd_core_math_div_ceil_u8, NSTDUInt8, NSTDOptionalUInt8);
gen_div_ceil!(nstd_core_math_div_ceil_i16, NSTDInt16, NSTDOptionalInt16);
gen_div_ceil!(nstd_core_math_div_ceil_u16, NSTDUInt16, NSTDOptionalUInt16);
gen_div_ceil!(nstd_core_math_div_ceil_i32, NSTDInt32, NSTDOptionalInt32);
gen_div_ceil!(nstd_core_math_div_ceil_u32, NSTDUInt32, NSTDOptionalUInt32);
gen_div_ceil!(nstd_core_math_div_ceil_i64, NSTDInt64, NSTDOptionalInt64);
gen_div_ceil!(nstd_core_math_div_ceil_u64, NSTDUInt64, NSTDOptionalUInt64);
macro_rules! gen_div_floor {
($name: ident, $T: ty, $Opt: ty) => {
#[doc = concat!(" - `", stringify!($T), " x` - The first value.")]
#[doc = concat!(" - `", stringify!($T), " y` - The second value.")]
#[doc = concat!(" `", stringify!($Opt), " v` - The divided value rounded down on success, or an uninitialized \"none\" variant if `y` is 0 or overflow occurs.")]
#[doc = concat!("use nstd_sys::core::{math::", stringify!($name), ", optional::NSTDOptional};")]
#[doc = concat!("assert!(", stringify!($name), "(5, 2) == NSTDOptional::Some(2));")]
#[doc = concat!("assert!(", stringify!($name), "(13, 4) == NSTDOptional::Some(3));")]
#[doc = concat!("assert!(", stringify!($name), "(23, 5) == NSTDOptional::Some(4));")]
#[doc = concat!("assert!(", stringify!($name), "(23, 0) == NSTDOptional::None);")]
#[nstdapi]
#[allow(unused_comparisons)]
pub const fn $name(x: $T, y: $T) -> $Opt {
if let Some(v) = x.checked_div(y) {
if let Some(r) = x.checked_rem(y) {
return match (r > 0 && y < 0) || (r < 0 && y > 0) {
true => match v.checked_sub(1) {
Some(v) => NSTDOptional::Some(v),
_ => NSTDOptional::None,
},
false => NSTDOptional::Some(v),
};
}
}
NSTDOptional::None
}
};
}
gen_div_floor!(nstd_core_math_div_floor_int, NSTDInt, NSTDOptionalInt);
gen_div_floor!(nstd_core_math_div_floor_uint, NSTDUInt, NSTDOptionalUInt);
gen_div_floor!(nstd_core_math_div_floor_i8, NSTDInt8, NSTDOptionalInt8);
gen_div_floor!(nstd_core_math_div_floor_u8, NSTDUInt8, NSTDOptionalUInt8);
gen_div_floor!(nstd_core_math_div_floor_i16, NSTDInt16, NSTDOptionalInt16);
gen_div_floor!(nstd_core_math_div_floor_u16, NSTDUInt16, NSTDOptionalUInt16);
gen_div_floor!(nstd_core_math_div_floor_i32, NSTDInt32, NSTDOptionalInt32);
gen_div_floor!(nstd_core_math_div_floor_u32, NSTDUInt32, NSTDOptionalUInt32);
gen_div_floor!(nstd_core_math_div_floor_i64, NSTDInt64, NSTDOptionalInt64);
gen_div_floor!(nstd_core_math_div_floor_u64, NSTDUInt64, NSTDOptionalUInt64);