#![allow(non_snake_case)]
use num_traits::{Float, FloatConst, FromPrimitive, NumAssign};
use std::fmt::{Debug, Display, LowerExp};
#[cfg(feature = "sdp")]
use crate::algebra::dense::BlasFloatT;
pub trait CoreFloatT:
'static
+ Send
+ Sync
+ Float
+ FloatConst
+ NumAssign
+ Default
+ FromPrimitive
+ Display
+ LowerExp
+ Debug
+ Sized
{
}
impl<T> CoreFloatT for T where
T: 'static
+ Send
+ Sync
+ Float
+ FloatConst
+ NumAssign
+ Default
+ FromPrimitive
+ Display
+ LowerExp
+ Debug
+ Sized
{
}
cfg_if::cfg_if! {
if #[cfg(feature="sdp")] {
#[doc(hidden)]
pub trait MaybeBlasFloatT : BlasFloatT {}
impl<T> MaybeBlasFloatT for T where T: BlasFloatT {}
}
else {
#[doc(hidden)]
pub trait MaybeBlasFloatT {}
impl<T> MaybeBlasFloatT for T {}
}
}
cfg_if::cfg_if! {
if #[cfg(feature="faer-sparse")] {
#[doc(hidden)]
pub trait MaybeFaerFloatT : faer_traits::RealField {}
impl<T> MaybeFaerFloatT for T where T: faer_traits::RealField {}
}
else {
#[doc(hidden)]
pub trait MaybeFaerFloatT {}
impl<T> MaybeFaerFloatT for T {}
}
}
pub trait FloatT: CoreFloatT + MaybeBlasFloatT + MaybeFaerFloatT {}
impl<T> FloatT for T where T: CoreFloatT + MaybeBlasFloatT + MaybeFaerFloatT {}
pub(crate) trait AsFloatT<T>: 'static {
fn as_T(&self) -> T;
}
macro_rules! impl_as_FloatT {
($ty:ty, $ident:ident) => {
impl<T> AsFloatT<T> for $ty
where
T: std::ops::Mul<T, Output = T> + FromPrimitive + 'static,
{
#[inline]
fn as_T(&self) -> T {
T::$ident(*self).unwrap()
}
}
};
}
impl_as_FloatT!(u32, from_u32);
impl_as_FloatT!(u64, from_u64);
impl_as_FloatT!(usize, from_usize);
impl_as_FloatT!(f32, from_f32);
impl_as_FloatT!(f64, from_f64);