use std::ops::{Add, Sub, Mul, Div};
#[derive(Debug, Clone, Copy)]
pub struct Vec2<T> {
pub x: T,
pub y: T,
}
impl<T> Vec2<T> {
pub fn new(x: T, y: T) -> Self {
Vec2 { x, y }
}
}
impl<T: Add<Output = T>> Add for Vec2<T> {
type Output = Self;
fn add(self, other: Self) -> Self {
Vec2 {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
impl<T: Sub<Output = T>> Sub for Vec2<T> {
type Output = Self;
fn sub(self, other: Self) -> Self {
Vec2 {
x: self.x - other.x,
y: self.y - other.y,
}
}
}
impl<T: Mul<Output = T> + Copy> Mul<T> for Vec2<T> {
type Output = Self;
fn mul(self, scalar: T) -> Self {
Vec2 {
x: self.x * scalar,
y: self.y * scalar,
}
}
}
impl<T: Div<Output = T> + Copy> Div<T> for Vec2<T> {
type Output = Self;
fn div(self, scalar: T) -> Self {
Vec2 {
x: self.x / scalar,
y: self.y / scalar,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Vec3<T> {
pub x: T,
pub y: T,
pub z: T,
}
impl<T> Vec3<T> {
pub fn new(x: T, y: T, z: T) -> Self {
Vec3 { x, y, z }
}
}
impl<T: Add<Output = T>> Add for Vec3<T> {
type Output = Self;
fn add(self, other: Self) -> Self {
Vec3 {
x: self.x + other.x,
y: self.y + other.y,
z: self.z + other.z,
}
}
}
impl<T: Sub<Output = T>> Sub for Vec3<T> {
type Output = Self;
fn sub(self, other: Self) -> Self {
Vec3 {
x: self.x - other.x,
y: self.y - other.y,
z: self.z - other.z,
}
}
}
impl<T: Mul<Output = T> + Copy> Mul<T> for Vec3<T> {
type Output = Self;
fn mul(self, scalar: T) -> Self {
Vec3 {
x: self.x * scalar,
y: self.y * scalar,
z: self.z * scalar,
}
}
}
impl<T: Div<Output = T> + Copy> Div<T> for Vec3<T> {
type Output = Self;
fn div(self, scalar: T) -> Self {
Vec3 {
x: self.x / scalar,
y: self.y / scalar,
z: self.z / scalar,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Vec4<T> {
pub x: T,
pub y: T,
pub z: T,
pub w: T,
}
impl<T> Vec4<T> {
pub fn new(x: T, y: T, z: T, w: T) -> Self {
Vec4 { x, y, z, w }
}
}
impl<T: Add<Output = T>> Add for Vec4<T> {
type Output = Self;
fn add(self, other: Self) -> Self {
Vec4 {
x: self.x + other.x,
y: self.y + other.y,
z: self.z + other.z,
w: self.w + other.w,
}
}
}
impl<T: Sub<Output = T>> Sub for Vec4<T> {
type Output = Self;
fn sub(self, other: Self) -> Self {
Vec4 {
x: self.x - other.x,
y: self.y - other.y,
z: self.z - other.z,
w: self.w - other.w,
}
}
}
impl<T: Mul<Output = T> + Copy> Mul<T> for Vec4<T> {
type Output = Self;
fn mul(self, scalar: T) -> Self {
Vec4 {
x: self.x * scalar,
y: self.y * scalar,
z: self.z * scalar,
w: self.w * scalar,
}
}
}
impl<T: Div<Output = T> + Copy> Div<T> for Vec4<T> {
type Output = Self;
fn div(self, scalar: T) -> Self {
Vec4 {
x: self.x / scalar,
y: self.y / scalar,
z: self.z / scalar,
w: self.w / scalar,
}
}
}