use core::ops::{Add, Mul, MulAssign, Sub};
use crate::{Vector, common, numeric::Two, quaternion::Quaternion};
common::_impl_tuple_wrapper_unary_op!([T], Quaternion<T>, item: T, len: 4, Neg, neg);
common::_impl_tuple_wrapper_binary_op!([T], Quaternion<T>, item: T, len: 4, Add, add);
common::_impl_tuple_wrapper_assign_op!([T], Quaternion<T>, item: T, len: 4, AddAssign, add_assign);
common::_impl_tuple_wrapper_binary_op!([T], Quaternion<T>, item: T, len: 4, Sub, sub);
common::_impl_tuple_wrapper_assign_op!([T], Quaternion<T>, item: T, len: 4, SubAssign, sub_assign);
common::_impl_tuple_wrapper_binary_op!([T], Quaternion<T>, item: T, len: 4, Mul<T>, mul);
common::_impl_tuple_wrapper_assign_op!([T], Quaternion<T>, item: T, len: 4, MulAssign<T>, mul_assign);
common::_impl_tuple_wrapper_binary_op!([T], Quaternion<T>, item: T, len: 4, Div<T>, div);
common::_impl_tuple_wrapper_assign_op!([T], Quaternion<T>, item: T, len: 4, DivAssign<T>, div_assign);
impl<T> Mul for Quaternion<T>
where
T: Copy + Mul<Output = T> + Add<Output = T> + Sub<Output = T>,
{
type Output = Self;
#[inline]
fn mul(self, rhs: Self) -> Self::Output {
self.compose(rhs)
}
}
impl<T> MulAssign for Quaternion<T>
where
T: Copy + Mul<Output = T> + Add<Output = T> + Sub<Output = T>,
{
#[inline]
fn mul_assign(&mut self, rhs: Self) {
*self = self.compose(rhs);
}
}
impl<T> Mul<Vector<T, 3>> for Quaternion<T>
where
T: Copy + Mul<Output = T> + Add<Output = T> + Sub<Output = T> + Two,
{
type Output = Vector<T, 3>;
#[inline]
fn mul(self, rhs: Vector<T, 3>) -> Self::Output {
self.rotate_vector(rhs)
}
}