1 // Generated from vec_mask.rs.tera template. Edit the template, not the generated file.
2 
3 #[cfg(not(target_arch = "spirv"))]
4 use core::fmt;
5 use core::ops::*;
6 
7 use core::simd::*;
8 
9 #[repr(C)]
10 union UnionCast {
11     a: [u32; 4],
12     v: BVec4A,
13 }
14 
15 /// A 4-dimensional SIMD vector mask.
16 ///
17 /// This type is 16 byte aligned.
18 #[derive(Clone, Copy)]
19 #[repr(transparent)]
20 pub struct BVec4A(pub(crate) mask32x4);
21 
22 const MASK: [u32; 2] = [0, 0xff_ff_ff_ff];
23 
24 impl BVec4A {
25     /// All false.
26     pub const FALSE: Self = Self::splat(false);
27 
28     /// All true.
29     pub const TRUE: Self = Self::splat(true);
30 
31     /// Creates a new vector mask.
32     #[inline(always)]
33     #[must_use]
new(x: bool, y: bool, z: bool, w: bool) -> Self34     pub const fn new(x: bool, y: bool, z: bool, w: bool) -> Self {
35         unsafe {
36             UnionCast {
37                 a: [
38                     MASK[x as usize],
39                     MASK[y as usize],
40                     MASK[z as usize],
41                     MASK[w as usize],
42                 ],
43             }
44             .v
45         }
46     }
47 
48     /// Creates a vector with all elements set to `v`.
49     #[inline]
50     #[must_use]
splat(v: bool) -> Self51     pub const fn splat(v: bool) -> Self {
52         Self::new(v, v, v, v)
53     }
54 
55     /// Returns a bitmask with the lowest 4 bits set from the elements of `self`.
56     ///
57     /// A true element results in a `1` bit and a false element in a `0` bit.  Element `x` goes
58     /// into the first lowest bit, element `y` into the second, etc.
59     #[inline]
60     #[must_use]
bitmask(self) -> u3261     pub fn bitmask(self) -> u32 {
62         self.0.to_bitmask() as u32
63     }
64 
65     /// Returns true if any of the elements are true, false otherwise.
66     #[inline]
67     #[must_use]
any(self) -> bool68     pub fn any(self) -> bool {
69         self.bitmask() != 0
70     }
71 
72     /// Returns true if all the elements are true, false otherwise.
73     #[inline]
74     #[must_use]
all(self) -> bool75     pub fn all(self) -> bool {
76         self.bitmask() == 0xf
77     }
78 
79     /// Tests the value at `index`.
80     ///
81     /// Panics if `index` is greater than 3.
82     #[inline]
83     #[must_use]
test(&self, index: usize) -> bool84     pub fn test(&self, index: usize) -> bool {
85         self.0.test(index)
86     }
87 
88     /// Sets the element at `index`.
89     ///
90     /// Panics if `index` is greater than 3.
91     #[inline]
set(&mut self, index: usize, value: bool)92     pub fn set(&mut self, index: usize, value: bool) {
93         self.0.set(index, value)
94     }
95 
96     #[inline]
97     #[must_use]
into_bool_array(self) -> [bool; 4]98     fn into_bool_array(self) -> [bool; 4] {
99         let bitmask = self.bitmask();
100         [
101             (bitmask & 1) != 0,
102             (bitmask & 2) != 0,
103             (bitmask & 4) != 0,
104             (bitmask & 8) != 0,
105         ]
106     }
107 
108     #[inline]
109     #[must_use]
into_u32_array(self) -> [u32; 4]110     fn into_u32_array(self) -> [u32; 4] {
111         let bitmask = self.bitmask();
112         [
113             MASK[(bitmask & 1) as usize],
114             MASK[((bitmask >> 1) & 1) as usize],
115             MASK[((bitmask >> 2) & 1) as usize],
116             MASK[((bitmask >> 3) & 1) as usize],
117         ]
118     }
119 }
120 
121 impl Default for BVec4A {
122     #[inline]
default() -> Self123     fn default() -> Self {
124         Self::FALSE
125     }
126 }
127 
128 impl PartialEq for BVec4A {
129     #[inline]
eq(&self, rhs: &Self) -> bool130     fn eq(&self, rhs: &Self) -> bool {
131         self.bitmask().eq(&rhs.bitmask())
132     }
133 }
134 
135 impl Eq for BVec4A {}
136 
137 impl core::hash::Hash for BVec4A {
138     #[inline]
hash<H: core::hash::Hasher>(&self, state: &mut H)139     fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
140         self.bitmask().hash(state);
141     }
142 }
143 
144 impl BitAnd for BVec4A {
145     type Output = Self;
146     #[inline]
bitand(self, rhs: Self) -> Self147     fn bitand(self, rhs: Self) -> Self {
148         Self(self.0 & rhs.0)
149     }
150 }
151 
152 impl BitAndAssign for BVec4A {
153     #[inline]
bitand_assign(&mut self, rhs: Self)154     fn bitand_assign(&mut self, rhs: Self) {
155         *self = self.bitand(rhs);
156     }
157 }
158 
159 impl BitOr for BVec4A {
160     type Output = Self;
161     #[inline]
bitor(self, rhs: Self) -> Self162     fn bitor(self, rhs: Self) -> Self {
163         Self(self.0 | rhs.0)
164     }
165 }
166 
167 impl BitOrAssign for BVec4A {
168     #[inline]
bitor_assign(&mut self, rhs: Self)169     fn bitor_assign(&mut self, rhs: Self) {
170         *self = self.bitor(rhs);
171     }
172 }
173 
174 impl BitXor for BVec4A {
175     type Output = Self;
176     #[inline]
bitxor(self, rhs: Self) -> Self177     fn bitxor(self, rhs: Self) -> Self {
178         Self(self.0 ^ rhs.0)
179     }
180 }
181 
182 impl BitXorAssign for BVec4A {
183     #[inline]
bitxor_assign(&mut self, rhs: Self)184     fn bitxor_assign(&mut self, rhs: Self) {
185         *self = self.bitxor(rhs);
186     }
187 }
188 
189 impl Not for BVec4A {
190     type Output = Self;
191     #[inline]
not(self) -> Self192     fn not(self) -> Self {
193         Self(!self.0)
194     }
195 }
196 
197 impl From<BVec4A> for mask32x4 {
198     #[inline]
from(t: BVec4A) -> Self199     fn from(t: BVec4A) -> Self {
200         t.0
201     }
202 }
203 
204 #[cfg(not(target_arch = "spirv"))]
205 impl fmt::Debug for BVec4A {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result206     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
207         let arr = self.into_u32_array();
208         write!(
209             f,
210             "{}({:#x}, {:#x}, {:#x}, {:#x})",
211             stringify!(BVec4A),
212             arr[0],
213             arr[1],
214             arr[2],
215             arr[3]
216         )
217     }
218 }
219 
220 #[cfg(not(target_arch = "spirv"))]
221 impl fmt::Display for BVec4A {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result222     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
223         let arr = self.into_bool_array();
224         write!(f, "[{}, {}, {}, {}]", arr[0], arr[1], arr[2], arr[3])
225     }
226 }
227 
228 impl From<BVec4A> for [bool; 4] {
229     #[inline]
from(mask: BVec4A) -> Self230     fn from(mask: BVec4A) -> Self {
231         mask.into_bool_array()
232     }
233 }
234 
235 impl From<BVec4A> for [u32; 4] {
236     #[inline]
from(mask: BVec4A) -> Self237     fn from(mask: BVec4A) -> Self {
238         mask.into_u32_array()
239     }
240 }
241