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