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::arch::wasm32::*;
8 
9 /// A 4-dimensional SIMD vector mask.
10 ///
11 /// This type is 16 byte aligned.
12 #[derive(Clone, Copy)]
13 #[repr(transparent)]
14 pub struct BVec4A(pub(crate) v128);
15 
16 const MASK: [u32; 2] = [0, 0xff_ff_ff_ff];
17 
18 impl BVec4A {
19     /// All false.
20     pub const FALSE: Self = Self::splat(false);
21 
22     /// All true.
23     pub const TRUE: Self = Self::splat(true);
24 
25     /// Creates a new vector mask.
26     #[inline(always)]
27     #[must_use]
new(x: bool, y: bool, z: bool, w: bool) -> Self28     pub const fn new(x: bool, y: bool, z: bool, w: bool) -> Self {
29         Self(u32x4(
30             MASK[x as usize],
31             MASK[y as usize],
32             MASK[z as usize],
33             MASK[w as usize],
34         ))
35     }
36 
37     /// Creates a vector with all elements set to `v`.
38     #[inline]
39     #[must_use]
splat(v: bool) -> Self40     pub const fn splat(v: bool) -> Self {
41         Self::new(v, v, v, v)
42     }
43 
44     /// Returns a bitmask with the lowest 4 bits set from the elements of `self`.
45     ///
46     /// A true element results in a `1` bit and a false element in a `0` bit.  Element `x` goes
47     /// into the first lowest bit, element `y` into the second, etc.
48     #[inline]
49     #[must_use]
bitmask(self) -> u3250     pub fn bitmask(self) -> u32 {
51         u32x4_bitmask(self.0) as u32
52     }
53 
54     /// Returns true if any of the elements are true, false otherwise.
55     #[inline]
56     #[must_use]
any(self) -> bool57     pub fn any(self) -> bool {
58         self.bitmask() != 0
59     }
60 
61     /// Returns true if all the elements are true, false otherwise.
62     #[inline]
63     #[must_use]
all(self) -> bool64     pub fn all(self) -> bool {
65         self.bitmask() == 0xf
66     }
67 
68     /// Tests the value at `index`.
69     ///
70     /// Panics if `index` is greater than 3.
71     #[inline]
72     #[must_use]
test(&self, index: usize) -> bool73     pub fn test(&self, index: usize) -> bool {
74         match index {
75             0 => (self.bitmask() & (1 << 0)) != 0,
76             1 => (self.bitmask() & (1 << 1)) != 0,
77             2 => (self.bitmask() & (1 << 2)) != 0,
78             3 => (self.bitmask() & (1 << 3)) != 0,
79             _ => panic!("index out of bounds"),
80         }
81     }
82 
83     /// Sets the element at `index`.
84     ///
85     /// Panics if `index` is greater than 3.
86     #[inline]
set(&mut self, index: usize, value: bool)87     pub fn set(&mut self, index: usize, value: bool) {
88         use crate::Vec4;
89         let mut v = Vec4(self.0);
90         v[index] = f32::from_bits(MASK[value as usize]);
91         *self = Self(v.0);
92     }
93 
94     #[inline]
95     #[must_use]
into_bool_array(self) -> [bool; 4]96     fn into_bool_array(self) -> [bool; 4] {
97         let bitmask = self.bitmask();
98         [
99             (bitmask & 1) != 0,
100             (bitmask & 2) != 0,
101             (bitmask & 4) != 0,
102             (bitmask & 8) != 0,
103         ]
104     }
105 
106     #[inline]
107     #[must_use]
into_u32_array(self) -> [u32; 4]108     fn into_u32_array(self) -> [u32; 4] {
109         let bitmask = self.bitmask();
110         [
111             MASK[(bitmask & 1) as usize],
112             MASK[((bitmask >> 1) & 1) as usize],
113             MASK[((bitmask >> 2) & 1) as usize],
114             MASK[((bitmask >> 3) & 1) as usize],
115         ]
116     }
117 }
118 
119 impl Default for BVec4A {
120     #[inline]
default() -> Self121     fn default() -> Self {
122         Self::FALSE
123     }
124 }
125 
126 impl PartialEq for BVec4A {
127     #[inline]
eq(&self, rhs: &Self) -> bool128     fn eq(&self, rhs: &Self) -> bool {
129         self.bitmask().eq(&rhs.bitmask())
130     }
131 }
132 
133 impl Eq for BVec4A {}
134 
135 impl core::hash::Hash for BVec4A {
136     #[inline]
hash<H: core::hash::Hasher>(&self, state: &mut H)137     fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
138         self.bitmask().hash(state);
139     }
140 }
141 
142 impl BitAnd for BVec4A {
143     type Output = Self;
144     #[inline]
bitand(self, rhs: Self) -> Self145     fn bitand(self, rhs: Self) -> Self {
146         Self(v128_and(self.0, rhs.0))
147     }
148 }
149 
150 impl BitAndAssign for BVec4A {
151     #[inline]
bitand_assign(&mut self, rhs: Self)152     fn bitand_assign(&mut self, rhs: Self) {
153         *self = self.bitand(rhs);
154     }
155 }
156 
157 impl BitOr for BVec4A {
158     type Output = Self;
159     #[inline]
bitor(self, rhs: Self) -> Self160     fn bitor(self, rhs: Self) -> Self {
161         Self(v128_or(self.0, rhs.0))
162     }
163 }
164 
165 impl BitOrAssign for BVec4A {
166     #[inline]
bitor_assign(&mut self, rhs: Self)167     fn bitor_assign(&mut self, rhs: Self) {
168         *self = self.bitor(rhs);
169     }
170 }
171 
172 impl BitXor for BVec4A {
173     type Output = Self;
174     #[inline]
bitxor(self, rhs: Self) -> Self175     fn bitxor(self, rhs: Self) -> Self {
176         Self(v128_xor(self.0, rhs.0))
177     }
178 }
179 
180 impl BitXorAssign for BVec4A {
181     #[inline]
bitxor_assign(&mut self, rhs: Self)182     fn bitxor_assign(&mut self, rhs: Self) {
183         *self = self.bitxor(rhs);
184     }
185 }
186 
187 impl Not for BVec4A {
188     type Output = Self;
189     #[inline]
not(self) -> Self190     fn not(self) -> Self {
191         Self(v128_not(self.0))
192     }
193 }
194 
195 impl From<BVec4A> for v128 {
196     #[inline]
from(t: BVec4A) -> Self197     fn from(t: BVec4A) -> Self {
198         t.0
199     }
200 }
201 
202 #[cfg(not(target_arch = "spirv"))]
203 impl fmt::Debug for BVec4A {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result204     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
205         let arr = self.into_u32_array();
206         write!(
207             f,
208             "{}({:#x}, {:#x}, {:#x}, {:#x})",
209             stringify!(BVec4A),
210             arr[0],
211             arr[1],
212             arr[2],
213             arr[3]
214         )
215     }
216 }
217 
218 #[cfg(not(target_arch = "spirv"))]
219 impl fmt::Display for BVec4A {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result220     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
221         let arr = self.into_bool_array();
222         write!(f, "[{}, {}, {}, {}]", arr[0], arr[1], arr[2], arr[3])
223     }
224 }
225 
226 impl From<BVec4A> for [bool; 4] {
227     #[inline]
from(mask: BVec4A) -> Self228     fn from(mask: BVec4A) -> Self {
229         mask.into_bool_array()
230     }
231 }
232 
233 impl From<BVec4A> for [u32; 4] {
234     #[inline]
from(mask: BVec4A) -> Self235     fn from(mask: BVec4A) -> Self {
236         mask.into_u32_array()
237     }
238 }
239