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}