/rust/registry/src/index.crates.io-6f17d22bba15001f/enumset-1.1.5/src/repr/primitive.rs
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | use crate::repr::EnumSetTypeRepr; | 
| 2 |  |  | 
| 3 |  | macro_rules! prim { | 
| 4 |  |     ($name:ty, $width:expr, $preferred_array_len:expr) => { | 
| 5 |  |         const _: () = { | 
| 6 |  |             fn lo(v: $name) -> u64 { | 
| 7 |  |                 v as u64 | 
| 8 |  |             } | 
| 9 |  |             fn hi(v: $name) -> u64 { | 
| 10 |  |                 ((v as u128) >> 64) as u64 | 
| 11 |  |             } | 
| 12 |  |  | 
| 13 |  |             impl EnumSetTypeRepr for $name { | 
| 14 |  |                 const PREFERRED_ARRAY_LEN: usize = $preferred_array_len; | 
| 15 |  |                 const WIDTH: u32 = $width; | 
| 16 |  |                 const EMPTY: Self = 0; | 
| 17 |  |  | 
| 18 |  |                 #[inline(always)] | 
| 19 | 2.11M |                 fn is_empty(&self) -> bool { | 
| 20 | 2.11M |                     *self == 0 | 
| 21 | 2.11M |                 } | 
| 22 |  |  | 
| 23 |  |                 #[inline(always)] | 
| 24 | 532k |                 fn add_bit(&mut self, bit: u32) { | 
| 25 | 532k |                     *self |= 1 << bit as $name; | 
| 26 | 532k |                 } | 
| 27 |  |                 #[inline(always)] | 
| 28 | 1.88M |                 fn remove_bit(&mut self, bit: u32) { | 
| 29 | 1.88M |                     *self &= !(1 << bit as $name); | 
| 30 | 1.88M |                 } | 
| 31 |  |                 #[inline(always)] | 
| 32 | 1.40M |                 fn has_bit(&self, bit: u32) -> bool { | 
| 33 | 1.40M |                     (self & (1 << bit as $name)) != 0 | 
| 34 | 1.40M |                 } | 
| 35 |  |  | 
| 36 |  |                 #[inline(always)] | 
| 37 | 171k |                 fn count_ones(&self) -> u32 { | 
| 38 | 171k |                     (*self).count_ones() | 
| 39 | 171k |                 } | 
| 40 |  |                 #[inline(always)] | 
| 41 |  |                 fn leading_zeros(&self) -> u32 { | 
| 42 |  |                     (*self).leading_zeros() | 
| 43 |  |                 } | 
| 44 |  |                 #[inline(always)] | 
| 45 | 1.88M |                 fn trailing_zeros(&self) -> u32 { | 
| 46 | 1.88M |                     (*self).trailing_zeros() | 
| 47 | 1.88M |                 } | 
| 48 |  |  | 
| 49 |  |                 #[inline(always)] | 
| 50 | 54.8k |                 fn and_not(&self, other: Self) -> Self { | 
| 51 | 54.8k |                     (*self) & !other | 
| 52 | 54.8k |                 } | 
| 53 |  |  | 
| 54 |  |                 type Iter = PrimitiveIter<Self>; | 
| 55 |  |                 #[inline] | 
| 56 | 171k |                 fn iter(self) -> Self::Iter { | 
| 57 | 171k |                     PrimitiveIter(self) | 
| 58 | 171k |                 } <u16 as enumset::repr::EnumSetTypeRepr>::iter| Line | Count | Source |  | 56 | 171k |                 fn iter(self) -> Self::Iter { |  | 57 | 171k |                     PrimitiveIter(self) |  | 58 | 171k |                 } | 
Unexecuted instantiation: <u16 as enumset::repr::EnumSetTypeRepr>::iterUnexecuted instantiation: <u16 as enumset::repr::EnumSetTypeRepr>::iterUnexecuted instantiation: <u16 as enumset::repr::EnumSetTypeRepr>::iterUnexecuted instantiation: <u16 as enumset::repr::EnumSetTypeRepr>::iter | 
| 59 |  |  | 
| 60 |  |                 #[inline(always)] | 
| 61 |  |                 fn from_u8(v: u8) -> Self { | 
| 62 |  |                     v as $name | 
| 63 |  |                 } | 
| 64 |  |                 #[inline(always)] | 
| 65 |  |                 fn from_u16(v: u16) -> Self { | 
| 66 |  |                     v as $name | 
| 67 |  |                 } | 
| 68 |  |                 #[inline(always)] | 
| 69 |  |                 fn from_u32(v: u32) -> Self { | 
| 70 |  |                     v as $name | 
| 71 |  |                 } | 
| 72 |  |                 #[inline(always)] | 
| 73 |  |                 fn from_u64(v: u64) -> Self { | 
| 74 |  |                     v as $name | 
| 75 |  |                 } | 
| 76 |  |                 #[inline(always)] | 
| 77 |  |                 fn from_u128(v: u128) -> Self { | 
| 78 |  |                     v as $name | 
| 79 |  |                 } | 
| 80 |  |                 #[inline(always)] | 
| 81 |  |                 fn from_usize(v: usize) -> Self { | 
| 82 |  |                     v as $name | 
| 83 |  |                 } | 
| 84 |  |  | 
| 85 |  |                 #[inline(always)] | 
| 86 |  |                 fn to_u8(&self) -> u8 { | 
| 87 |  |                     (*self) as u8 | 
| 88 |  |                 } | 
| 89 |  |                 #[inline(always)] | 
| 90 |  |                 fn to_u16(&self) -> u16 { | 
| 91 |  |                     (*self) as u16 | 
| 92 |  |                 } | 
| 93 |  |                 #[inline(always)] | 
| 94 |  |                 fn to_u32(&self) -> u32 { | 
| 95 |  |                     (*self) as u32 | 
| 96 |  |                 } | 
| 97 |  |                 #[inline(always)] | 
| 98 |  |                 fn to_u64(&self) -> u64 { | 
| 99 |  |                     (*self) as u64 | 
| 100 |  |                 } | 
| 101 |  |                 #[inline(always)] | 
| 102 |  |                 fn to_u128(&self) -> u128 { | 
| 103 |  |                     (*self) as u128 | 
| 104 |  |                 } | 
| 105 |  |                 #[inline(always)] | 
| 106 | 0 |                 fn to_usize(&self) -> usize { | 
| 107 | 0 |                     (*self) as usize | 
| 108 | 0 |                 } | 
| 109 |  |  | 
| 110 |  |                 #[inline(always)] | 
| 111 |  |                 fn from_u8_opt(v: u8) -> Option<Self> { | 
| 112 |  |                     v.try_into().ok() | 
| 113 |  |                 } | 
| 114 |  |                 #[inline(always)] | 
| 115 |  |                 fn from_u16_opt(v: u16) -> Option<Self> { | 
| 116 |  |                     v.try_into().ok() | 
| 117 |  |                 } | 
| 118 |  |                 #[inline(always)] | 
| 119 |  |                 fn from_u32_opt(v: u32) -> Option<Self> { | 
| 120 |  |                     v.try_into().ok() | 
| 121 |  |                 } | 
| 122 |  |                 #[inline(always)] | 
| 123 | 54.8k |                 fn from_u64_opt(v: u64) -> Option<Self> { | 
| 124 | 54.8k |                     v.try_into().ok() | 
| 125 | 54.8k |                 } | 
| 126 |  |                 #[inline(always)] | 
| 127 |  |                 fn from_u128_opt(v: u128) -> Option<Self> { | 
| 128 |  |                     v.try_into().ok() | 
| 129 |  |                 } | 
| 130 |  |                 #[inline(always)] | 
| 131 |  |                 fn from_usize_opt(v: usize) -> Option<Self> { | 
| 132 |  |                     v.try_into().ok() | 
| 133 |  |                 } | 
| 134 |  |  | 
| 135 |  |                 #[inline(always)] | 
| 136 |  |                 fn to_u8_opt(&self) -> Option<u8> { | 
| 137 |  |                     (*self).try_into().ok() | 
| 138 |  |                 } | 
| 139 |  |                 #[inline(always)] | 
| 140 |  |                 fn to_u16_opt(&self) -> Option<u16> { | 
| 141 |  |                     (*self).try_into().ok() | 
| 142 |  |                 } | 
| 143 |  |                 #[inline(always)] | 
| 144 |  |                 fn to_u32_opt(&self) -> Option<u32> { | 
| 145 |  |                     (*self).try_into().ok() | 
| 146 |  |                 } | 
| 147 |  |                 #[inline(always)] | 
| 148 | 42.4k |                 fn to_u64_opt(&self) -> Option<u64> { | 
| 149 | 42.4k |                     (*self).try_into().ok() | 
| 150 | 42.4k |                 } | 
| 151 |  |                 #[inline(always)] | 
| 152 |  |                 fn to_u128_opt(&self) -> Option<u128> { | 
| 153 |  |                     (*self).try_into().ok() | 
| 154 |  |                 } | 
| 155 |  |                 #[inline(always)] | 
| 156 |  |                 fn to_usize_opt(&self) -> Option<usize> { | 
| 157 |  |                     (*self).try_into().ok() | 
| 158 |  |                 } | 
| 159 |  |  | 
| 160 |  |                 #[inline(always)] | 
| 161 |  |                 fn to_u64_array<const O: usize>(&self) -> [u64; O] { | 
| 162 |  |                     let mut array = [0; O]; | 
| 163 |  |                     if O > 0 { | 
| 164 |  |                         array[0] = lo(*self); | 
| 165 |  |                     } | 
| 166 |  |                     if O > 1 && $preferred_array_len == 2 { | 
| 167 |  |                         array[1] = hi(*self); | 
| 168 |  |                     } | 
| 169 |  |                     array | 
| 170 |  |                 } | 
| 171 |  |                 #[inline(always)] | 
| 172 |  |                 fn to_u64_array_opt<const O: usize>(&self) -> Option<[u64; O]> { | 
| 173 |  |                     if O == 0 && *self != 0 { | 
| 174 |  |                         None | 
| 175 |  |                     } else if O == 1 && hi(*self) != 0 { | 
| 176 |  |                         None | 
| 177 |  |                     } else { | 
| 178 |  |                         Some(self.to_u64_array()) | 
| 179 |  |                     } | 
| 180 |  |                 } | 
| 181 |  |  | 
| 182 |  |                 #[inline(always)] | 
| 183 |  |                 fn from_u64_array<const O: usize>(v: [u64; O]) -> Self { | 
| 184 |  |                     if O == 0 { | 
| 185 |  |                         0 | 
| 186 |  |                     } else if O > 1 && $preferred_array_len == 2 { | 
| 187 |  |                         Self::from_u128(v[0] as u128 | ((v[1] as u128) << 64)) | 
| 188 |  |                     } else { | 
| 189 |  |                         Self::from_u64(v[0]) | 
| 190 |  |                     } | 
| 191 |  |                 } | 
| 192 |  |                 #[inline(always)] | 
| 193 |  |                 fn from_u64_array_opt<const O: usize>(v: [u64; O]) -> Option<Self> { | 
| 194 |  |                     if O == 0 { | 
| 195 |  |                         Some(0) | 
| 196 |  |                     } else if O == 1 { | 
| 197 |  |                         Self::from_u64_opt(v[0]) | 
| 198 |  |                     } else { | 
| 199 |  |                         for i in 2..O { | 
| 200 |  |                             if v[i] != 0 { | 
| 201 |  |                                 return None; | 
| 202 |  |                             } | 
| 203 |  |                         } | 
| 204 |  |                         Self::from_u128_opt(v[0] as u128 | ((v[1] as u128) << 64)) | 
| 205 |  |                     } | 
| 206 |  |                 } | 
| 207 |  |  | 
| 208 |  |                 #[inline(always)] | 
| 209 |  |                 fn to_u64_slice(&self, out: &mut [u64]) { | 
| 210 |  |                     if out.len() > 0 { | 
| 211 |  |                         out[0] = lo(*self); | 
| 212 |  |                     } | 
| 213 |  |                     if out.len() > 1 && $preferred_array_len == 2 { | 
| 214 |  |                         out[1] = hi(*self); | 
| 215 |  |                     } | 
| 216 |  |                     for i in $preferred_array_len..out.len() { | 
| 217 |  |                         out[i] = 0; | 
| 218 |  |                     } | 
| 219 |  |                 } | 
| 220 |  |                 #[inline(always)] | 
| 221 |  |                 #[must_use] | 
| 222 |  |                 fn to_u64_slice_opt(&self, out: &mut [u64]) -> Option<()> { | 
| 223 |  |                     if out.len() == 0 && *self != 0 { | 
| 224 |  |                         None | 
| 225 |  |                     } else if out.len() == 1 && hi(*self) != 0 { | 
| 226 |  |                         None | 
| 227 |  |                     } else { | 
| 228 |  |                         self.to_u64_slice(out); | 
| 229 |  |                         Some(()) | 
| 230 |  |                     } | 
| 231 |  |                 } | 
| 232 |  |  | 
| 233 |  |                 #[inline(always)] | 
| 234 |  |                 fn from_u64_slice(v: &[u64]) -> Self { | 
| 235 |  |                     if v.len() == 0 { | 
| 236 |  |                         0 | 
| 237 |  |                     } else if v.len() > 1 && $preferred_array_len == 2 { | 
| 238 |  |                         Self::from_u128(v[0] as u128 | ((v[1] as u128) << 64)) | 
| 239 |  |                     } else { | 
| 240 |  |                         Self::from_u64(v[0]) | 
| 241 |  |                     } | 
| 242 |  |                 } | 
| 243 |  |                 #[inline(always)] | 
| 244 |  |                 fn from_u64_slice_opt(v: &[u64]) -> Option<Self> { | 
| 245 |  |                     if v.len() == 0 { | 
| 246 |  |                         Some(0) | 
| 247 |  |                     } else if v.len() == 1 { | 
| 248 |  |                         Self::from_u64_opt(v[0]) | 
| 249 |  |                     } else { | 
| 250 |  |                         for i in 2..v.len() { | 
| 251 |  |                             if v[i] != 0 { | 
| 252 |  |                                 return None; | 
| 253 |  |                             } | 
| 254 |  |                         } | 
| 255 |  |                         Self::from_u128_opt(v[0] as u128 | ((v[1] as u128) << 64)) | 
| 256 |  |                     } | 
| 257 |  |                 } | 
| 258 |  |             } | 
| 259 |  |         }; | 
| 260 |  |     }; | 
| 261 |  | } | 
| 262 |  | prim!(u8, 8, 1); | 
| 263 |  | prim!(u16, 16, 1); | 
| 264 |  | prim!(u32, 32, 1); | 
| 265 |  | prim!(u64, 64, 1); | 
| 266 |  | prim!(u128, 128, 2); | 
| 267 |  |  | 
| 268 |  | #[derive(Copy, Clone, Debug)] | 
| 269 |  | #[repr(transparent)] | 
| 270 |  | pub struct PrimitiveIter<T: EnumSetTypeRepr>(pub T); | 
| 271 |  |  | 
| 272 |  | impl<T: EnumSetTypeRepr> Iterator for PrimitiveIter<T> { | 
| 273 |  |     type Item = u32; | 
| 274 |  |  | 
| 275 | 2.06M |     fn next(&mut self) -> Option<Self::Item> { | 
| 276 | 2.06M |         if self.0.is_empty() { | 
| 277 | 171k |             None | 
| 278 |  |         } else { | 
| 279 | 1.88M |             let bit = self.0.trailing_zeros(); | 
| 280 | 1.88M |             self.0.remove_bit(bit); | 
| 281 | 1.88M |             Some(bit) | 
| 282 |  |         } | 
| 283 | 2.06M |     } <enumset::repr::primitive::PrimitiveIter<u16> as core::iter::traits::iterator::Iterator>::next| Line | Count | Source |  | 275 | 2.06M |     fn next(&mut self) -> Option<Self::Item> { |  | 276 | 2.06M |         if self.0.is_empty() { |  | 277 | 171k |             None |  | 278 |  |         } else { |  | 279 | 1.88M |             let bit = self.0.trailing_zeros(); |  | 280 | 1.88M |             self.0.remove_bit(bit); |  | 281 | 1.88M |             Some(bit) |  | 282 |  |         } |  | 283 | 2.06M |     } | 
Unexecuted instantiation: <enumset::repr::primitive::PrimitiveIter<u16> as core::iter::traits::iterator::Iterator>::nextUnexecuted instantiation: <enumset::repr::primitive::PrimitiveIter<u16> as core::iter::traits::iterator::Iterator>::nextUnexecuted instantiation: <enumset::repr::primitive::PrimitiveIter<u16> as core::iter::traits::iterator::Iterator>::nextUnexecuted instantiation: <enumset::repr::primitive::PrimitiveIter<u16> as core::iter::traits::iterator::Iterator>::next | 
| 284 |  |  | 
| 285 | 171k |     fn size_hint(&self) -> (usize, Option<usize>) { | 
| 286 | 171k |         let left = self.0.count_ones() as usize; | 
| 287 | 171k |         (left, Some(left)) | 
| 288 | 171k |     } | 
| 289 |  | } | 
| 290 |  |  | 
| 291 |  | impl<T: EnumSetTypeRepr> DoubleEndedIterator for PrimitiveIter<T> { | 
| 292 |  |     fn next_back(&mut self) -> Option<Self::Item> { | 
| 293 |  |         if self.0.is_empty() { | 
| 294 |  |             None | 
| 295 |  |         } else { | 
| 296 |  |             let bit = T::WIDTH - 1 - self.0.leading_zeros(); | 
| 297 |  |             self.0.remove_bit(bit); | 
| 298 |  |             Some(bit) | 
| 299 |  |         } | 
| 300 |  |     } | 
| 301 |  | } |