gfxmath_vec2/
vec2.rs

1#[repr(C)]
2#[derive(Debug, Clone, PartialEq)]
3pub struct Vec2<T> {
4    pub x: T,
5    pub y: T
6}
7
8impl <T> Eq for Vec2<T> where T: PartialEq {}
9
10impl <T> Vec2 <T> {
11    #[inline]
12    pub fn new(x: T, y: T) -> Self {
13        Self { x, y }
14    }
15
16    pub fn as_ptr(&self) -> *const T {
17        self as *const _ as *const T
18    }
19
20    pub fn as_mut_ptr(&mut self) -> *mut T {
21        self as *mut _ as *mut T
22    }
23
24        ///
25    /// ```
26    /// use gfxmath_vec2::Vec2;
27    /// 
28    /// let a = Vec2::<f32>::new(1.0, 2.0);
29    /// 
30    /// let a_slice = a.as_slice();
31    /// 
32    /// assert_eq!(1.0, a_slice[0]);
33    /// assert_eq!(2.0, a_slice[1]);
34    /// ```
35    pub fn as_slice(&self) -> &[T] {
36        unsafe { std::slice::from_raw_parts(self.as_ptr(), 2) }
37    }
38
39    ///
40    /// ```
41    /// use gfxmath_vec2::Vec2;
42    /// 
43    /// let mut a = Vec2::<f32>::new(1.0, 2.0);
44    /// 
45    /// {
46    ///     let a_slice = a.as_mut_slice();
47    /// 
48    ///     assert_eq!(1.0, a_slice[0]);
49    ///     assert_eq!(2.0, a_slice[1]);
50    /// 
51    ///     a_slice[1] = 108.0;
52    ///     assert_eq!(108.0, a_slice[1]); 
53    /// }
54    /// 
55    /// a.x = 4.5;
56    /// assert_eq!(4.5, a.x);
57    /// 
58    /// let a_slice = a.as_mut_slice();
59    /// 
60    /// assert_eq!(4.5, a_slice[0]);
61    /// assert_eq!(108.0, a_slice[1]);
62    /// ```
63    pub fn as_mut_slice(&mut self) -> &mut [T] {
64        unsafe { std::slice::from_raw_parts_mut(self.as_mut_ptr(), 2) }
65    }
66}
67
68impl <T> Vec2<T> where T: Clone {
69    /// ```
70    /// use gfxmath_vec2::Vec2;
71    /// 
72    /// let v = Vec2::<f32>::all(2.5);
73    /// 
74    /// assert_eq!(2.5, v.x);
75    /// assert_eq!(2.5, v.y);
76    /// ```
77    #[inline]
78    pub fn all(val: T) -> Self {
79        Self::new(val.clone(), val.clone())
80    }
81}
82
83///
84/// ```
85/// use gfxmath_vec2::Vec2;
86/// 
87/// let v: Vec2<f32> = (3.0, 2.0).into();
88/// 
89/// assert_eq!(3.0, v.x);
90/// assert_eq!(2.0, v.y);
91/// ```
92impl <T> From<(T, T)> for Vec2<T> {
93    fn from(val: (T, T)) -> Self {
94        Vec2::new(val.0, val.1)
95    }
96}
97
98///
99/// ```
100/// use gfxmath_vec2::Vec2;
101/// 
102/// let v0 = (3.0, 2.0);
103/// 
104/// let v: Vec2<f32> = (&v0).into();
105/// 
106/// assert_eq!(3.0, v.x);
107/// assert_eq!(2.0, v.y);
108/// ```
109impl <T> From<&(T, T)> for Vec2<T> where T: Clone {
110    fn from(val: &(T, T)) -> Self {
111        Vec2::new(val.0.clone(), val.1.clone())
112    }
113}
114
115///
116/// ```
117/// use gfxmath_vec2::Vec2;
118/// 
119/// let v = Vec2::new(3.0, 2.0);
120/// let v: (f32, f32) = v.into();
121/// 
122/// assert_eq!(3.0, v.0);
123/// assert_eq!(2.0, v.1);
124/// 
125/// ```
126impl <T> From<Vec2<T>> for (T, T) {
127    fn from(val: Vec2<T>) -> Self {
128        (val.x, val.y)
129    }
130}
131
132///
133/// ```
134/// use gfxmath_vec2::Vec2;
135/// 
136/// let v = Vec2::new(3.0, 2.0);
137/// let v: (f32, f32) = (&v).into();
138/// 
139/// assert_eq!(3.0, v.0);
140/// assert_eq!(2.0, v.1);
141/// ```
142impl <T> From<&Vec2<T>> for (T, T) where T: Clone {
143    fn from(val: &Vec2<T>) -> Self {
144        (val.x.clone(), val.y.clone())
145    }
146}
147
148/// ```
149/// use gfxmath_vec2::{Vec2, vec2};
150/// let v = vec2!(2.0, 3.0);
151/// assert_eq!(2.0, v.x);
152/// assert_eq!(3.0, v.y);
153/// ```
154#[macro_export]
155macro_rules! vec2 {
156    ($x: expr, $y: expr) => {
157        {
158            Vec2::new($x, $y)
159        }
160    }
161}