use std::fmt::Debug;
use std::fmt::Display;
use std::iter::Sum;
use std::ops::Add;
use std::ops::AddAssign;
use std::ops::Div;
use std::ops::DivAssign;
use std::ops::Mul;
use std::ops::MulAssign;
use std::ops::Neg;
use std::ops::Sub;
use std::ops::SubAssign;
use num_traits::Float;
use num_traits::NumAssignRef;
use num_traits::RefNum;
pub trait Component: Debug + Display + Sum + Float + RefNum<Self> + NumAssignRef {}
impl<T: Debug + Display + Sum + Float + RefNum<Self> + NumAssignRef> Component for T {}
pub trait RefComponent<Base>: Neg<Output = Base> + RefNum<Base> {}
impl<T, Base> RefComponent<Base> for T where T: Neg<Output = Base> + RefNum<Base> {}
pub trait VectorOps<Cmp, Base, Rhs>:
Neg<Output = Base>
+ Add<Rhs, Output = Base>
+ Sub<Rhs, Output = Base>
+ Mul<Cmp, Output = Base>
+ Div<Cmp, Output = Base>
{
}
impl<T, Cmp, Base, Rhs> VectorOps<Cmp, Base, Rhs> for T where
T: Neg<Output = Base>
+ Add<Rhs, Output = Base>
+ Sub<Rhs, Output = Base>
+ Mul<Cmp, Output = Base>
+ Div<Cmp, Output = Base>
{
}
pub trait VectorRefOps<Cmp, Base>:
VectorOps<Cmp, Base, Base> + for<'r> VectorOps<&'r Cmp, Base, &'r Base>
{
}
impl<T, Cmp, Base> VectorRefOps<Cmp, Base> for T where
T: VectorOps<Cmp, Base, Base> + for<'r> VectorOps<&'r Cmp, Base, &'r Base>
{
}
pub trait VectorAssignOps<Cmp, Rhs>:
AddAssign<Rhs> + SubAssign<Rhs> + MulAssign<Cmp> + DivAssign<Cmp>
{
}
impl<T, Cmp, Rhs> VectorAssignOps<Cmp, Rhs> for T where
T: AddAssign<Rhs> + SubAssign<Rhs> + MulAssign<Cmp> + DivAssign<Cmp>
{
}
pub trait VectorRefAssignOps<Cmp, Base>:
VectorAssignOps<Cmp, Base> + for<'r> VectorAssignOps<&'r Cmp, &'r Base>
{
}
impl<T, Cmp, Base> VectorRefAssignOps<Cmp, Base> for T where
T: VectorAssignOps<Cmp, Base> + for<'r> VectorAssignOps<&'r Cmp, &'r Base>
{
}