use crate::{Float, Integer};
use az::{CheckedAs, CheckedCast};
use num_traits::cast::ToPrimitive;
use num_traits::ops::inv::Inv;
use num_traits::ops::mul_add::{MulAdd, MulAddAssign};
impl Inv for Float {
type Output = Self;
#[inline]
fn inv(self) -> Self::Output {
self.recip()
}
}
impl MulAdd for Float {
type Output = Float;
#[inline]
fn mul_add(self, a: Float, b: Float) -> Float {
self.mul_add(&a, &b)
}
}
impl MulAddAssign for Float {
#[inline]
fn mul_add_assign(&mut self, a: Float, b: Float) {
self.mul_add_mut(&a, &b);
}
}
impl MulAdd<&Float, &Float> for Float {
type Output = Float;
#[inline]
fn mul_add(self, a: &Float, b: &Float) -> Float {
self.mul_add(a, b)
}
}
impl MulAddAssign<&Float, &Float> for Float {
#[inline]
fn mul_add_assign(&mut self, a: &Float, b: &Float) {
self.mul_add_mut(a, b);
}
}
impl ToPrimitive for Float {
#[inline]
fn to_i64(&self) -> Option<i64> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_u64(&self) -> Option<u64> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_isize(&self) -> Option<isize> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_i8(&self) -> Option<i8> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_i16(&self) -> Option<i16> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_i32(&self) -> Option<i32> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_i128(&self) -> Option<i128> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_usize(&self) -> Option<usize> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_u8(&self) -> Option<u8> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_u16(&self) -> Option<u16> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_u32(&self) -> Option<u32> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_u128(&self) -> Option<u128> {
self.checked_as::<Integer>()
.and_then(CheckedCast::checked_cast)
}
#[inline]
fn to_f32(&self) -> Option<f32> {
Some(self.to_f32())
}
#[inline]
fn to_f64(&self) -> Option<f64> {
Some(self.to_f64())
}
}