#[repr(C)]
#[derive(Debug, Clone, PartialEq)]
pub struct Vec2<T> {
pub x: T,
pub y: T
}
impl <T> Eq for Vec2<T> where T: PartialEq {}
impl <T> Vec2 <T> {
#[inline]
pub fn new(x: T, y: T) -> Self {
Self { x, y }
}
pub fn as_ptr(&self) -> *const T {
self as *const _ as *const T
}
pub fn as_mut_ptr(&mut self) -> *mut T {
self as *mut _ as *mut T
}
pub fn as_slice(&self) -> &[T] {
unsafe { std::slice::from_raw_parts(self.as_ptr(), 2) }
}
pub fn as_mut_slice(&mut self) -> &mut [T] {
unsafe { std::slice::from_raw_parts_mut(self.as_mut_ptr(), 2) }
}
}
impl <T> Vec2<T> where T: Clone {
#[inline]
pub fn all(val: T) -> Self {
Self::new(val.clone(), val.clone())
}
}
impl <T> From<(T, T)> for Vec2<T> {
fn from(val: (T, T)) -> Self {
Vec2::new(val.0, val.1)
}
}
impl <T> From<&(T, T)> for Vec2<T> where T: Clone {
fn from(val: &(T, T)) -> Self {
Vec2::new(val.0.clone(), val.1.clone())
}
}
impl <T> From<Vec2<T>> for (T, T) {
fn from(val: Vec2<T>) -> Self {
(val.x, val.y)
}
}
impl <T> From<&Vec2<T>> for (T, T) where T: Clone {
fn from(val: &Vec2<T>) -> Self {
(val.x.clone(), val.y.clone())
}
}
#[macro_export]
macro_rules! vec2 {
($x: expr, $y: expr) => {
{
Vec2::new($x, $y)
}
}
}