use crate::RealField;
use crate::complex::octonion_number::Octonion;
use crate::num::identity::one::{ConstOne, One};
use crate::num::identity::zero::{ConstZero, Zero};
impl<F: RealField> Zero for Octonion<F> {
fn zero() -> Self {
Octonion::new(
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
)
}
fn is_zero(&self) -> bool {
self.s.is_zero()
&& self.e1.is_zero()
&& self.e2.is_zero()
&& self.e3.is_zero()
&& self.e4.is_zero()
&& self.e5.is_zero()
&& self.e6.is_zero()
&& self.e7.is_zero()
}
}
impl<F: RealField + ConstZero> ConstZero for Octonion<F> {
const ZERO: Self = Octonion {
s: F::ZERO,
e1: F::ZERO,
e2: F::ZERO,
e3: F::ZERO,
e4: F::ZERO,
e5: F::ZERO,
e6: F::ZERO,
e7: F::ZERO,
};
}
impl<F: RealField> One for Octonion<F> {
fn one() -> Self {
Octonion::new(
F::one(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
F::zero(),
)
}
fn is_one(&self) -> bool {
self.s.is_one()
&& self.e1.is_zero()
&& self.e2.is_zero()
&& self.e3.is_zero()
&& self.e4.is_zero()
&& self.e5.is_zero()
&& self.e6.is_zero()
&& self.e7.is_zero()
}
}
impl<F: RealField + ConstOne + ConstZero> ConstOne for Octonion<F> {
const ONE: Self = Octonion {
s: F::ONE,
e1: F::ZERO,
e2: F::ZERO,
e3: F::ZERO,
e4: F::ZERO,
e5: F::ZERO,
e6: F::ZERO,
e7: F::ZERO,
};
}