#![allow(dead_code)]
pub struct Vector2Ref<'a> {
pub x: &'a mut f64,
pub y: &'a mut f64,
}
impl<'a> Vector2Ref<'a> {
pub fn new(x: &'a mut f64, y: &'a mut f64) -> Self {
Vector2Ref { x, y }
}
pub fn dot(&self, other: &Vector2Ref) -> f64 {
*self.x * *other.x + *self.y * *other.y
}
pub fn cross(&self, other: &Vector2Ref) -> f64 {
*self.x * *other.y - *other.x * *self.y
}
pub fn add_assign(&mut self, other: &Vector2Ref) {
*self.x += *other.x;
*self.y += *other.y;
}
pub fn sub_assign(&mut self, other: &Vector2Ref) {
*self.x -= *other.x;
*self.y -= *other.y;
}
pub fn mul_assign(&mut self, alpha: f64) {
*self.x *= alpha;
*self.y *= alpha;
}
pub fn div_assign(&mut self, alpha: f64) {
*self.x /= alpha;
*self.y /= alpha;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vector2() {
let mut x = 1.0;
let mut y = 2.0;
let mut v = Vector2Ref::new(&mut x, &mut y);
v.mul_assign(2.0);
assert_eq!(*v.x, 2.0);
assert_eq!(*v.y, 4.0);
let mut v2 = Vector2Ref::new(&mut x, &mut y);
v2.mul_assign(2.0);
assert_eq!(*v2.y, 8.0);
}
#[test]
fn test_dot() {
let mut x1 = 3.0;
let mut y1 = 4.0;
let mut x2 = 5.0;
let mut y2 = 6.0;
let v1 = Vector2Ref::new(&mut x1, &mut y1);
let v2 = Vector2Ref::new(&mut x2, &mut y2);
assert_eq!(v1.dot(&v2), 39.0);
}
#[test]
fn test_cross() {
let mut x1 = 3.0;
let mut y1 = 4.0;
let mut x2 = 5.0;
let mut y2 = 6.0;
let v1 = Vector2Ref::new(&mut x1, &mut y1);
let v2 = Vector2Ref::new(&mut x2, &mut y2);
assert_eq!(v1.cross(&v2), -2.0);
}
#[test]
fn test_add_assign() {
let mut x1 = 1.0;
let mut y1 = 2.0;
let mut x2 = 3.0;
let mut y2 = 4.0;
let mut v1 = Vector2Ref::new(&mut x1, &mut y1);
let v2 = Vector2Ref::new(&mut x2, &mut y2);
v1.add_assign(&v2);
assert_eq!(*v1.x, 4.0);
assert_eq!(*v1.y, 6.0);
}
#[test]
fn test_sub_assign() {
let mut x1 = 5.0;
let mut y1 = 6.0;
let mut x2 = 3.0;
let mut y2 = 4.0;
let mut v1 = Vector2Ref::new(&mut x1, &mut y1);
let v2 = Vector2Ref::new(&mut x2, &mut y2);
v1.sub_assign(&v2);
assert_eq!(*v1.x, 2.0);
assert_eq!(*v1.y, 2.0);
}
#[test]
fn test_div_assign() {
let mut x = 6.0;
let mut y = 8.0;
let mut v = Vector2Ref::new(&mut x, &mut y);
v.div_assign(2.0);
assert_eq!(*v.x, 3.0);
assert_eq!(*v.y, 4.0);
}
}