gfxmath_vec3/impls/sub/sub.rs
1use core::ops::Sub;
2use crate::Vec3;
3
4///
5/// ```
6/// use gfxmath_vec3::Vec3;
7///
8/// let mut a = Vec3::<f32>::new(0.5, 2.5, -2.5);
9/// let b = Vec3::<f32>::new(1.5, 2.5, 2.0);
10/// let c = Vec3::from(&a - &b);
11///
12/// a.x = 1.0;
13///
14/// assert_eq!(-1.0, c.x);
15/// assert_eq!( 0.0, c.y);
16/// assert_eq!(-4.5, c.z);
17///
18/// let c2 = Vec3::from(a - b);
19///
20/// assert_eq!(-0.5, c2.x);
21/// assert_eq!( 0.0, c2.y);
22/// assert_eq!(-4.5, c2.z);
23/// ```
24#[opimps::impl_ops(Sub)]
25#[inline]
26fn sub<T>(self: Vec3<T>, rhs: Vec3<T>) -> Vec3<T> where T: Sub<Output = T> + Copy {
27 let l = self.as_slice();
28 let r = rhs.as_slice();
29
30 Vec3::new(
31 l[0] - r[0],
32 l[1] - r[1],
33 l[2] - r[2]
34 )
35}
36
37/// ```
38/// use gfxmath_vec3::Vec3;
39///
40/// let v = Vec3::new(1.0, 2.0, 3.0);
41///
42/// let res = v - 3.0;
43///
44/// assert_eq!(-2.0, res.x);
45/// assert_eq!(-1.0, res.y);
46/// assert_eq!( 0.0, res.z);
47/// ```
48#[opimps::impl_ops_rprim(Sub)]
49#[inline]
50fn sub<T>(self: Vec3<T>, rhs: T) -> Vec3<T> where T: Sub<Output = T> + Copy {
51 let l = self.as_slice();
52 Vec3::new(l[0] - rhs, l[1] - rhs, l[2] - rhs)
53}
54
55/// ```
56/// use gfxmath_vec3::Vec3;
57///
58/// let v = Vec3::<f32>::new(1.0, 2.0, 3.0);
59///
60/// let res = 3.0 - v;
61///
62/// assert_eq!( 2.0, res.x);
63/// assert_eq!( 1.0, res.y);
64/// assert_eq!( 0.0, res.z);
65/// ```
66#[opimps::impl_ops_lprim(Sub)]
67#[inline]
68fn sub(self: f32, rhs: Vec3<f32>) -> Vec3<f32> {
69 let r = rhs.as_slice();
70 Vec3::new(self - r[0], self - r[1], self - r[2])
71}
72
73
74/// ```
75/// use gfxmath_vec3::Vec3;
76///
77/// let v = Vec3::<f64>::new(1.0, 2.0, 3.0);
78///
79/// let res = 3.0 - v;
80///
81/// assert_eq!( 2.0, res.x);
82/// assert_eq!( 1.0, res.y);
83/// assert_eq!( 0.0, res.z);
84/// ```
85#[opimps::impl_ops_lprim(Sub)]
86#[inline]
87fn sub(self: f64, rhs: Vec3<f64>) -> Vec3<f64> {
88 let r = rhs.as_slice();
89 Vec3::new(self - r[0], self - r[1], self - r[2])
90}
91
92
93/// ```
94/// use gfxmath_vec3::Vec3;
95///
96/// let v = Vec3::<i32>::new(1, 2, 3);
97///
98/// let res = 3 - v;
99///
100/// assert_eq!( 2, res.x);
101/// assert_eq!( 1, res.y);
102/// assert_eq!( 0, res.z);
103/// ```
104#[opimps::impl_ops_lprim(Sub)]
105#[inline]
106fn sub(self: i32, rhs: Vec3<i32>) -> Vec3<i32> {
107 let r = rhs.as_slice();
108 Vec3::new(self - r[0], self - r[1], self - r[2])
109}
110
111
112/// ```
113/// use gfxmath_vec3::Vec3;
114///
115/// let v = Vec3::<i64>::new(1, 2, 3);
116///
117/// let res = 3 - v;
118///
119/// assert_eq!( 2, res.x);
120/// assert_eq!( 1, res.y);
121/// assert_eq!( 0, res.z);
122/// ```
123#[opimps::impl_ops_lprim(Sub)]
124#[inline]
125fn sub(self: i64, rhs: Vec3<i64>) -> Vec3<i64> {
126 let r = rhs.as_slice();
127 Vec3::new(self - r[0], self - r[1], self - r[2])
128}
129