mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-24 08:41:34 +11:00
Merge pull request #70 from corwinkuiper/integer-operations
Integer operations for Fixed Nums
This commit is contained in:
commit
aab6e6f405
|
@ -144,49 +144,65 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T, const N: usize> Mul<T> for Num<I, N>
|
impl<I, const N: usize> Mul<Num<I, N>> for Num<I, N>
|
||||||
where
|
where
|
||||||
I: FixedWidthUnsignedInteger,
|
I: FixedWidthUnsignedInteger,
|
||||||
T: Into<Num<I, N>>,
|
|
||||||
{
|
{
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
fn mul(self, rhs: T) -> Self::Output {
|
fn mul(self, rhs: Num<I, N>) -> Self::Output {
|
||||||
let rhs: Self = rhs.into();
|
|
||||||
|
|
||||||
Num(((self.floor() * rhs.floor()) << N)
|
Num(((self.floor() * rhs.floor()) << N)
|
||||||
+ (self.floor() * rhs.frac() + rhs.floor() * self.frac())
|
+ (self.floor() * rhs.frac() + rhs.floor() * self.frac())
|
||||||
+ ((self.frac() * rhs.frac()) >> N))
|
+ ((self.frac() * rhs.frac()) >> N))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T, const N: usize> MulAssign<T> for Num<I, N>
|
impl<I, const N: usize> Mul<I> for Num<I, N>
|
||||||
where
|
where
|
||||||
I: FixedWidthUnsignedInteger,
|
I: FixedWidthUnsignedInteger,
|
||||||
T: Into<Num<I, N>>,
|
|
||||||
{
|
{
|
||||||
fn mul_assign(&mut self, rhs: T) {
|
type Output = Self;
|
||||||
self.0 = (*self * rhs.into()).0
|
fn mul(self, rhs: I) -> Self::Output {
|
||||||
|
Num(self.0 * rhs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T, const N: usize> Div<T> for Num<I, N>
|
impl<I, T, const N: usize> MulAssign<T> for Num<I, N>
|
||||||
|
where
|
||||||
|
I: FixedWidthUnsignedInteger,
|
||||||
|
Num<I, N>: Mul<T, Output = Num<I, N>>,
|
||||||
|
{
|
||||||
|
fn mul_assign(&mut self, rhs: T) {
|
||||||
|
self.0 = (*self * rhs).0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I, const N: usize> Div<Num<I, N>> for Num<I, N>
|
||||||
where
|
where
|
||||||
I: FixedWidthUnsignedInteger,
|
I: FixedWidthUnsignedInteger,
|
||||||
T: Into<Num<I, N>>,
|
|
||||||
{
|
{
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
fn div(self, rhs: T) -> Self::Output {
|
fn div(self, rhs: Num<I, N>) -> Self::Output {
|
||||||
Num((self.0 << N) / rhs.into().0)
|
Num((self.0 << N) / rhs.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I, const N: usize> Div<I> for Num<I, N>
|
||||||
|
where
|
||||||
|
I: FixedWidthUnsignedInteger,
|
||||||
|
{
|
||||||
|
type Output = Self;
|
||||||
|
fn div(self, rhs: I) -> Self::Output {
|
||||||
|
Num(self.0 / rhs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, T, const N: usize> DivAssign<T> for Num<I, N>
|
impl<I, T, const N: usize> DivAssign<T> for Num<I, N>
|
||||||
where
|
where
|
||||||
I: FixedWidthUnsignedInteger,
|
I: FixedWidthUnsignedInteger,
|
||||||
T: Into<Num<I, N>>,
|
Num<I, N>: Div<T, Output = Num<I, N>>,
|
||||||
{
|
{
|
||||||
fn div_assign(&mut self, rhs: T) {
|
fn div_assign(&mut self, rhs: T) {
|
||||||
self.0 = (*self / rhs.into()).0
|
self.0 = (*self / rhs).0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -471,27 +487,47 @@ impl<T: Number> Add<Vector2D<T>> for Vector2D<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Number, U: Number + Into<T>> Mul<U> for Vector2D<T> {
|
impl<T: Number, U: Copy> Mul<U> for Vector2D<T>
|
||||||
|
where
|
||||||
|
T: Mul<U, Output = T>,
|
||||||
|
{
|
||||||
type Output = Vector2D<T>;
|
type Output = Vector2D<T>;
|
||||||
fn mul(self, rhs: U) -> Self::Output {
|
fn mul(self, rhs: U) -> Self::Output {
|
||||||
Vector2D {
|
Vector2D {
|
||||||
x: self.x * rhs.into(),
|
x: self.x * rhs,
|
||||||
y: self.y * rhs.into(),
|
y: self.y * rhs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Number, U: Number + Into<T>> Div<U> for Vector2D<T> {
|
impl<T: Number, U: Copy> MulAssign<U> for Vector2D<T>
|
||||||
|
where
|
||||||
|
T: Mul<U, Output = T>,
|
||||||
|
{
|
||||||
|
fn mul_assign(&mut self, rhs: U) {
|
||||||
|
let result = *self * rhs;
|
||||||
|
self.x = result.x;
|
||||||
|
self.y = result.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Number, U: Copy> Div<U> for Vector2D<T>
|
||||||
|
where
|
||||||
|
T: Div<U, Output = T>,
|
||||||
|
{
|
||||||
type Output = Vector2D<T>;
|
type Output = Vector2D<T>;
|
||||||
fn div(self, rhs: U) -> Self::Output {
|
fn div(self, rhs: U) -> Self::Output {
|
||||||
Vector2D {
|
Vector2D {
|
||||||
x: self.x / rhs.into(),
|
x: self.x / rhs,
|
||||||
y: self.y / rhs.into(),
|
y: self.y / rhs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Number, U: Number + Into<T>> DivAssign<U> for Vector2D<T> {
|
impl<T: Number, U: Copy> DivAssign<U> for Vector2D<T>
|
||||||
|
where
|
||||||
|
T: Div<U, Output = T>,
|
||||||
|
{
|
||||||
fn div_assign(&mut self, rhs: U) {
|
fn div_assign(&mut self, rhs: U) {
|
||||||
let result = *self / rhs;
|
let result = *self / rhs;
|
||||||
self.x = result.x;
|
self.x = result.x;
|
||||||
|
|
Loading…
Reference in a new issue