use std::ops::{Add, Sub, Mul, Div};
#[repr(C)]
#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Debug, Copy)]
pub struct Vector2<T> {
pub x: T,
pub y: T
}
pub type Vector2i = Vector2<i32>;
pub type Vector2u = Vector2<u32>;
pub type Vector2f = Vector2<f32>;
impl<T> Vector2<T> {
pub fn new(x: T, y: T) -> Vector2<T> {
Vector2 {
x: x,
y: y
}
}
}
impl<T: Add + Copy> Add<T> for Vector2<T> {
type Output = Vector2<T::Output>;
fn add(self, rhs: T) -> Vector2<T::Output> {
Vector2 {
x: self.x + rhs,
y: self.y + rhs
}
}
}
impl<T: Sub + Copy> Sub<T> for Vector2<T> {
type Output = Vector2<T::Output>;
fn sub(self, rhs: T) -> Vector2<T::Output> {
Vector2 {
x: self.x - rhs,
y: self.y - rhs
}
}
}
impl<T: Mul + Copy> Mul<T> for Vector2<T> {
type Output = Vector2<T::Output>;
fn mul(self, rhs: T) -> Vector2<T::Output> {
Vector2 {
x: self.x * rhs,
y: self.y * rhs
}
}
}
impl<T: Div + Copy> Div<T> for Vector2<T> {
type Output = Vector2<T::Output>;
fn div(self, rhs: T) -> Vector2<T::Output> {
Vector2 {
x: self.x / rhs,
y: self.y / rhs
}
}
}
impl<T: Add> Add for Vector2<T> {
type Output = Vector2<T::Output>;
fn add(self, rhs: Vector2<T>) -> Vector2<T::Output> {
Vector2 {
x: self.x + rhs.x,
y: self.y + rhs.y
}
}
}
impl<T: Sub> Sub for Vector2<T> {
type Output = Vector2<T::Output>;
fn sub(self, rhs: Vector2<T>) -> Vector2<T::Output> {
Vector2 {
x: self.x - rhs.x,
y: self.y - rhs.y
}
}
}
impl<T: Mul> Mul for Vector2<T> {
type Output = Vector2<T::Output>;
fn mul(self, rhs: Vector2<T>) -> Vector2<T::Output> {
Vector2 {
x: self.x * rhs.x,
y: self.y * rhs.y
}
}
}
impl<T: Div> Div for Vector2<T> {
type Output = Vector2<T::Output>;
fn div(self, rhs: Vector2<T>) -> Vector2<T::Output> {
Vector2 {
x: self.x / rhs.x,
y: self.y / rhs.y
}
}
}
pub trait ToVec {
fn to_vector2f(&self) -> Vector2f;
fn to_vector2i(&self) -> Vector2i;
fn to_vector2u(&self) -> Vector2u;
}
impl ToVec for Vector2f {
fn to_vector2f(&self) -> Vector2f {
self.clone()
}
fn to_vector2i(&self) -> Vector2i {
Vector2i {
x: self.x as i32,
y: self.y as i32
}
}
fn to_vector2u(&self) -> Vector2u {
Vector2u {
x: self.x as u32,
y: self.y as u32
}
}
}
impl ToVec for Vector2i {
fn to_vector2f(&self) -> Vector2f {
Vector2f {
x: self.x as f32,
y: self.y as f32
}
}
fn to_vector2i(&self) -> Vector2i {
self.clone()
}
fn to_vector2u(&self) -> Vector2u {
Vector2u {
x: self.x as u32,
y: self.y as u32
}
}
}
impl ToVec for Vector2u {
fn to_vector2f(&self) -> Vector2f {
Vector2f {
x: self.x as f32,
y: self.y as f32
}
}
fn to_vector2i(&self) -> Vector2i {
Vector2i {
x: self.x as i32,
y: self.y as i32
}
}
fn to_vector2u(&self) -> Vector2u {
self.clone()
}
}