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