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 3-dimensional SIMD vector mask. 10 /// 11 /// This type is 16 byte aligned. 12 #[derive(Clone, Copy)] 13 #[repr(transparent)] 14 pub struct BVec3A(pub(crate) v128); 15 16 const MASK: [u32; 2] = [0, 0xff_ff_ff_ff]; 17 18 impl BVec3A { 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) -> Self28 pub const fn new(x: bool, y: bool, z: bool) -> Self { 29 Self(u32x4( 30 MASK[x as usize], 31 MASK[y as usize], 32 MASK[z as usize], 33 0, 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) 42 } 43 44 /// Returns a bitmask with the lowest 3 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) & 0x7) 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() == 0x7 66 } 67 68 /// Tests the value at `index`. 69 /// 70 /// Panics if `index` is greater than 2. 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 _ => panic!("index out of bounds"), 79 } 80 } 81 82 /// Sets the element at `index`. 83 /// 84 /// Panics if `index` is greater than 2. 85 #[inline] set(&mut self, index: usize, value: bool)86 pub fn set(&mut self, index: usize, value: bool) { 87 use crate::Vec3A; 88 let mut v = Vec3A(self.0); 89 v[index] = f32::from_bits(MASK[value as usize]); 90 *self = Self(v.0); 91 } 92 93 #[inline] 94 #[must_use] into_bool_array(self) -> [bool; 3]95 fn into_bool_array(self) -> [bool; 3] { 96 let bitmask = self.bitmask(); 97 [(bitmask & 1) != 0, (bitmask & 2) != 0, (bitmask & 4) != 0] 98 } 99 100 #[inline] 101 #[must_use] into_u32_array(self) -> [u32; 3]102 fn into_u32_array(self) -> [u32; 3] { 103 let bitmask = self.bitmask(); 104 [ 105 MASK[(bitmask & 1) as usize], 106 MASK[((bitmask >> 1) & 1) as usize], 107 MASK[((bitmask >> 2) & 1) as usize], 108 ] 109 } 110 } 111 112 impl Default for BVec3A { 113 #[inline] default() -> Self114 fn default() -> Self { 115 Self::FALSE 116 } 117 } 118 119 impl PartialEq for BVec3A { 120 #[inline] eq(&self, rhs: &Self) -> bool121 fn eq(&self, rhs: &Self) -> bool { 122 self.bitmask().eq(&rhs.bitmask()) 123 } 124 } 125 126 impl Eq for BVec3A {} 127 128 impl core::hash::Hash for BVec3A { 129 #[inline] hash<H: core::hash::Hasher>(&self, state: &mut H)130 fn hash<H: core::hash::Hasher>(&self, state: &mut H) { 131 self.bitmask().hash(state); 132 } 133 } 134 135 impl BitAnd for BVec3A { 136 type Output = Self; 137 #[inline] bitand(self, rhs: Self) -> Self138 fn bitand(self, rhs: Self) -> Self { 139 Self(v128_and(self.0, rhs.0)) 140 } 141 } 142 143 impl BitAndAssign for BVec3A { 144 #[inline] bitand_assign(&mut self, rhs: Self)145 fn bitand_assign(&mut self, rhs: Self) { 146 *self = self.bitand(rhs); 147 } 148 } 149 150 impl BitOr for BVec3A { 151 type Output = Self; 152 #[inline] bitor(self, rhs: Self) -> Self153 fn bitor(self, rhs: Self) -> Self { 154 Self(v128_or(self.0, rhs.0)) 155 } 156 } 157 158 impl BitOrAssign for BVec3A { 159 #[inline] bitor_assign(&mut self, rhs: Self)160 fn bitor_assign(&mut self, rhs: Self) { 161 *self = self.bitor(rhs); 162 } 163 } 164 165 impl BitXor for BVec3A { 166 type Output = Self; 167 #[inline] bitxor(self, rhs: Self) -> Self168 fn bitxor(self, rhs: Self) -> Self { 169 Self(v128_xor(self.0, rhs.0)) 170 } 171 } 172 173 impl BitXorAssign for BVec3A { 174 #[inline] bitxor_assign(&mut self, rhs: Self)175 fn bitxor_assign(&mut self, rhs: Self) { 176 *self = self.bitxor(rhs); 177 } 178 } 179 180 impl Not for BVec3A { 181 type Output = Self; 182 #[inline] not(self) -> Self183 fn not(self) -> Self { 184 Self(v128_not(self.0)) 185 } 186 } 187 188 impl From<BVec3A> for v128 { 189 #[inline] from(t: BVec3A) -> Self190 fn from(t: BVec3A) -> Self { 191 t.0 192 } 193 } 194 195 #[cfg(not(target_arch = "spirv"))] 196 impl fmt::Debug for BVec3A { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result197 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 198 let arr = self.into_u32_array(); 199 write!( 200 f, 201 "{}({:#x}, {:#x}, {:#x})", 202 stringify!(BVec3A), 203 arr[0], 204 arr[1], 205 arr[2] 206 ) 207 } 208 } 209 210 #[cfg(not(target_arch = "spirv"))] 211 impl fmt::Display for BVec3A { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result212 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 213 let arr = self.into_bool_array(); 214 write!(f, "[{}, {}, {}]", arr[0], arr[1], arr[2]) 215 } 216 } 217 218 impl From<BVec3A> for [bool; 3] { 219 #[inline] from(mask: BVec3A) -> Self220 fn from(mask: BVec3A) -> Self { 221 mask.into_bool_array() 222 } 223 } 224 225 impl From<BVec3A> for [u32; 3] { 226 #[inline] from(mask: BVec3A) -> Self227 fn from(mask: BVec3A) -> Self { 228 mask.into_u32_array() 229 } 230 } 231