nalgebra_glm/
vector_relational.rs

1use crate::aliases::TVec;
2use crate::traits::Number;
3
4/// Checks that all the vector components are `true`.
5///
6/// # Examples:
7///
8/// ```
9/// # use nalgebra_glm as glm;
10/// let vec = glm::vec2(true, false);
11/// assert_eq!(false, glm::all(&vec));
12///
13/// let vec = glm::vec2(true, true);
14/// assert_eq!(true, glm::all(&vec));
15/// ```
16///
17/// # See also:
18///
19/// * [`any()`]
20/// * [`not()`]
21pub fn all<const D: usize>(v: &TVec<bool, D>) -> bool {
22    v.iter().all(|x| *x)
23}
24
25/// Checks that at least one of the vector components is `true`.
26///
27/// # Examples:
28///
29/// ```
30/// # use nalgebra_glm as glm;
31/// let vec = glm::vec2(true, false);
32/// assert_eq!(true, glm::any(&vec));
33///
34/// let vec = glm::vec2(true, true);
35/// assert_eq!(true, glm::any(&vec));
36///
37/// let vec = glm::vec2(false, false);
38/// assert_eq!(false, glm::any(&vec));
39/// ```
40///
41/// # See also:
42///
43/// * [`all()`]
44/// * [`not()`]
45pub fn any<const D: usize>(v: &TVec<bool, D>) -> bool {
46    v.iter().any(|x| *x)
47}
48
49/// Component-wise equality comparison.
50///
51/// # Examples:
52///
53/// ```
54/// # use nalgebra_glm as glm;
55/// assert_eq!(glm::vec2(true, false),
56///            glm::equal(&glm::vec2(1.0, 3.0),
57///                       &glm::vec2(1.0, 2.0)));
58/// ```
59///
60/// # See also:
61///
62/// * [`greater_than()`]
63/// * [`greater_than_equal()`]
64/// * [`less_than()`]
65/// * [`less_than_equal()`]
66/// * [`not()`]
67/// * [`not_equal()`]
68pub fn equal<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> TVec<bool, D> {
69    x.zip_map(y, |x, y| x == y)
70}
71
72/// Component-wise `>` comparison.
73///
74/// # Examples:
75///
76/// ```
77/// # use nalgebra_glm as glm;
78/// assert_eq!(glm::vec2(false, true),
79///            glm::greater_than(&glm::vec2(1.0, 3.0),
80///                              &glm::vec2(1.0, 2.0)));
81/// ```
82///
83/// # See also:
84///
85/// * [`equal()`]
86/// * [`greater_than_equal()`]
87/// * [`less_than()`]
88/// * [`less_than_equal()`]
89/// * [`not()`]
90/// * [`not_equal()`]
91pub fn greater_than<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> TVec<bool, D> {
92    x.zip_map(y, |x, y| x > y)
93}
94
95/// Component-wise `>=` comparison.
96///
97/// # Examples:
98///
99/// ```
100/// # use nalgebra_glm as glm;
101/// assert_eq!(glm::vec3(true, true, false),
102///            glm::greater_than_equal(&glm::vec3(1.0, 3.0, 4.0),
103///                                    &glm::vec3(1.0, 2.0, 5.0)));
104/// ```
105///
106/// # See also:
107///
108/// * [`equal()`]
109/// * [`greater_than()`]
110/// * [`less_than()`]
111/// * [`less_than_equal()`]
112/// * [`not()`]
113/// * [`not_equal()`]
114pub fn greater_than_equal<T: Number, const D: usize>(
115    x: &TVec<T, D>,
116    y: &TVec<T, D>,
117) -> TVec<bool, D> {
118    x.zip_map(y, |x, y| x >= y)
119}
120
121/// Component-wise `<` comparison.
122///
123/// # Examples:
124///
125/// ```
126/// # use nalgebra_glm as glm;
127/// assert_eq!(glm::vec3(false, false, true),
128///            glm::less_than(&glm::vec3(1.0, 3.0, 4.0),
129///                           &glm::vec3(1.0, 2.0, 5.0)));
130/// ```
131///
132/// # See also:
133///
134/// * [`equal()`]
135/// * [`greater_than()`]
136/// * [`greater_than_equal()`]
137/// * [`less_than_equal()`]
138/// * [`not()`]
139/// * [`not_equal()`]
140pub fn less_than<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> TVec<bool, D> {
141    x.zip_map(y, |x, y| x < y)
142}
143
144/// Component-wise `<=` comparison.
145///
146/// # Examples:
147///
148/// ```
149/// # use nalgebra_glm as glm;
150/// assert_eq!(glm::vec3(true, false, true),
151///            glm::less_than_equal(&glm::vec3(1.0, 3.0, 4.0),
152///                                 &glm::vec3(1.0, 2.0, 5.0)));
153/// ```
154///
155/// # See also:
156///
157/// * [`equal()`]
158/// * [`greater_than()`]
159/// * [`greater_than_equal()`]
160/// * [`less_than()`]
161/// * [`not()`]
162/// * [`not_equal()`]
163pub fn less_than_equal<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> TVec<bool, D> {
164    x.zip_map(y, |x, y| x <= y)
165}
166
167/// Component-wise not `!`.
168///
169/// # Examples:
170///
171/// ```
172/// # use nalgebra_glm as glm;
173/// let vec = glm::vec2(true, false);
174/// assert_eq!(glm::vec2(false, true), glm::not(&vec));
175/// ```
176///
177/// # See also:
178///
179/// * [`all()`]
180/// * [`any()`]
181/// * [`equal()`]
182/// * [`greater_than()`]
183/// * [`greater_than_equal()`]
184/// * [`less_than()`]
185/// * [`less_than_equal()`]
186/// * [`not_equal()`]
187pub fn not<const D: usize>(v: &TVec<bool, D>) -> TVec<bool, D> {
188    v.map(|x| !x)
189}
190
191/// Component-wise not-equality `!=`.
192///
193/// # Examples:
194///
195/// ```
196/// # use nalgebra_glm as glm;
197/// assert_eq!(glm::vec2(false, true),
198///            glm::not_equal(&glm::vec2(1.0, 3.0),
199///                           &glm::vec2(1.0, 2.0)));
200/// ```
201///
202/// # See also:
203///
204/// * [`equal()`]
205/// * [`greater_than()`]
206/// * [`greater_than_equal()`]
207/// * [`less_than()`]
208/// * [`less_than_equal()`]
209/// * [`not()`]
210pub fn not_equal<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> TVec<bool, D> {
211    x.zip_map(y, |x, y| x != y)
212}