gfxmath_vec3/
vec3.rs

1#[repr(C)]
2#[derive(Debug, Clone, PartialEq)]
3pub struct Vec3<T> {
4    pub x: T,
5    pub y: T,
6    pub z: T
7}
8
9impl <T> Vec3 <T> {
10    /// ```
11    /// use gfxmath_vec3::Vec3;
12    /// 
13    /// let v = Vec3::<f32>::new(2.5, 0.0, -19.5);
14    /// 
15    /// assert_eq!(2.5, v.x);
16    /// assert_eq!(0.0, v.y);
17    /// assert_eq!(-19.5, v.z);
18    /// ```
19    pub fn new(x: T, y: T, z: T) -> Self {
20        return Self { x, y, z }
21    }
22
23    pub fn as_ptr(&self) -> *const T {
24        self as *const _ as *const T
25    }
26
27    pub fn as_mut_ptr(&mut self) -> *mut T {
28        self as *mut _ as *mut T
29    }
30
31    ///
32    /// ```
33    /// use gfxmath_vec3::Vec3;
34    /// 
35    /// let a = Vec3::<f32>::new(1.0, 2.0, 3.0);
36    /// 
37    /// let a_slice = a.as_slice();
38    /// 
39    /// assert_eq!(1.0, a_slice[0]);
40    /// assert_eq!(2.0, a_slice[1]);
41    /// assert_eq!(3.0, a_slice[2]);
42    /// ```
43    pub fn as_slice(&self) -> &[T] {
44        unsafe { std::slice::from_raw_parts(self.as_ptr(), 3) }
45    }
46
47    ///
48    /// ```
49    /// use gfxmath_vec3::Vec3;
50    /// 
51    /// let mut a = Vec3::<f32>::new(1.0, 2.0, 3.0);
52    /// 
53    /// {
54    ///     let a_slice = a.as_mut_slice();
55    /// 
56    ///     assert_eq!(1.0, a_slice[0]);
57    ///     assert_eq!(2.0, a_slice[1]);
58    ///     assert_eq!(3.0, a_slice[2]);
59    /// 
60    ///     a_slice[2] = 108.0;
61    ///     assert_eq!(108.0, a_slice[2]); 
62    /// }
63    /// 
64    /// a.x = 4.5;
65    /// assert_eq!(4.5, a.x);
66    /// 
67    /// let a_slice = a.as_mut_slice();
68    /// 
69    /// assert_eq!(4.5, a_slice[0]);
70    /// assert_eq!(2.0, a_slice[1]);
71    /// assert_eq!(108.0, a_slice[2]);
72    /// ```
73    pub fn as_mut_slice(&mut self) -> &mut [T] {
74        unsafe { std::slice::from_raw_parts_mut(self.as_mut_ptr(), 3) }
75    }
76}
77
78impl <T> Vec3<T> where T: Clone {
79    /// ```
80    /// use gfxmath_vec3::Vec3;
81    /// 
82    /// let v = Vec3::<f32>::all(2.5);
83    /// 
84    /// assert_eq!(2.5, v.x);
85    /// assert_eq!(2.5, v.y);
86    /// assert_eq!(2.5, v.z);
87    /// ```
88    pub fn all(val: T) -> Self {
89        Self::new(val.clone(), val.clone(), val.clone())
90    }
91}
92
93/// ```
94/// use gfxmath_vec3::{Vec3, vec3};
95/// 
96/// let v = vec3!(1.0, 2.0, 3.0);
97/// 
98/// assert_eq!(1.0, v.x);
99/// assert_eq!(2.0, v.y);
100/// assert_eq!(3.0, v.z);
101/// ```
102#[macro_export]
103macro_rules! vec3 {
104    ($x: expr, $y: expr, $z: expr) => {
105        {
106            Vec3::new($x, $y, $z)
107        }
108    }
109}