use crate::ValidLayout;
use crate::mask::{Mask, MaskLayout};
use crate::simd::{Simd, SimdLayout, SimdScalar};
use core::cmp::Ordering;
use core::num::FpCategory;
use multitype::{Float, Uint};
#[expect(clippy::wrong_self_convention)]
pub trait SimdFloat<T, const N: usize>: crate::num::seal::SimdFloat + Sized
where
T: SimdScalar + Float<Bits: SimdScalar + Uint<Int: SimdScalar>>,
SimdLayout<T, N>: ValidLayout,
SimdLayout<<T as Float>::Bits, N>: ValidLayout,
SimdLayout<<<T as Float>::Bits as Uint>::Int, N>: ValidLayout,
SimdLayout<u32, N>: ValidLayout,
SimdLayout<i32, N>: ValidLayout,
MaskLayout<N>: ValidLayout,
{
const EPSILON: Self;
const MIN: Self;
const MIN_POSITIVE: Self;
const MAX: Self;
const INFINITY: Self;
const NEG_INFINITY: Self;
const NAN: Self;
const E: Self;
const PI: Self;
const TAU: Self;
const LOG2_10: Self;
const LOG2_E: Self;
const LN_2: Self;
const LN_10: Self;
const LOG10_2: Self;
const LOG10_E: Self;
const SQRT_2: Self;
const FRAC_1_PI: Self;
const FRAC_1_SQRT_2: Self;
const FRAC_2_PI: Self;
const FRAC_2_SQRT_PI: Self;
const FRAC_PI_2: Self;
const FRAC_PI_3: Self;
const FRAC_PI_4: Self;
const FRAC_PI_6: Self;
const FRAC_PI_8: Self;
const ZERO: Self;
const ONE: Self;
#[must_use]
fn from_bits(bits: Simd<T::Bits, N>) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn mul_add(self, a: Self, b: Self) -> Self;
#[must_use]
fn recip(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn div_euclid(self, rhs: Self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn rem_euclid(self, rhs: Self) -> Self;
#[must_use]
fn abs(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn powf(self, rhs: Self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn powi(self, rhs: Simd<i32, N>) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn exp(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn exp_m1(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn exp2(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn sqrt(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn cbrt(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn log(self, base: Self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn ln(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn ln_1p(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn log2(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn log10(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn hypot(self, rhs: Self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn sin(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn cos(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn tan(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn asin(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn acos(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn atan(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn atan2(self, rhs: Self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn sinh(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn cosh(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn tanh(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn asinh(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn acosh(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn atanh(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn round(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn round_ties_even(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn floor(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn ceil(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn trunc(self) -> Self;
#[cfg(feature = "std")]
#[must_use]
fn fract(self) -> Self;
#[must_use]
fn to_radians(self) -> Self;
#[must_use]
fn to_degrees(self) -> Self;
#[must_use]
fn next_down(self) -> Self;
#[must_use]
fn next_up(self) -> Self;
#[must_use]
fn copysign(self, sign: Self) -> Self;
#[must_use]
fn midpoint(self, rhs: Self) -> Self;
#[must_use]
fn clamp(self, min: Self, max: Self) -> Self;
#[must_use]
fn min(self, rhs: Self) -> Self;
#[must_use]
fn max(self, rhs: Self) -> Self;
#[must_use]
fn signum(self) -> Self;
#[must_use]
fn classify(self) -> [FpCategory; N];
#[must_use]
fn total_cmp(&self, rhs: &Self) -> [Ordering; N];
#[must_use]
fn is_nan(self) -> Mask<N>;
#[must_use]
fn is_infinite(self) -> Mask<N>;
#[must_use]
fn is_finite(self) -> Mask<N>;
#[must_use]
fn is_normal(self) -> Mask<N>;
#[must_use]
fn is_subnormal(self) -> Mask<N>;
#[must_use]
fn is_sign_negative(self) -> Mask<N>;
#[must_use]
fn is_sign_positive(self) -> Mask<N>;
#[must_use]
fn to_bits(self) -> Simd<T::Bits, N>;
}