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}