(&mut self, n: usize)
| 269 | /// allocation failure. |
| 270 | #[inline] |
| 271 | pub fn try_ensure_capacity(&mut self, n: usize) -> Result<(), OutOfMemory> { |
| 272 | // Subtract one from the capacity to get the maximum bit that we might |
| 273 | // set. If `n` is 0 then nothing need be done as no capacity needs to be |
| 274 | // allocated. |
| 275 | let (word, _bit) = Self::word_and_bit(match n.checked_sub(1) { |
| 276 | None => return Ok(()), |
| 277 | Some(n) => n, |
| 278 | }); |
| 279 | |
| 280 | if word < self.elems.len() { |
| 281 | // Already have capacity. |
| 282 | return Ok(()); |
| 283 | } |
| 284 | |
| 285 | // Need to allocate additional capacity. |
| 286 | |
| 287 | assert!(word < usize::try_from(isize::MAX).unwrap()); |
| 288 | |
| 289 | let delta = word - self.elems.len(); |
| 290 | let to_grow = delta + 1; |
| 291 | |
| 292 | // Amortize the cost of growing by at least growing another |
| 293 | // `self.elems.len()`, so the new length is double the old length. |
| 294 | let to_grow = cmp::max(to_grow, self.elems.len()); |
| 295 | // Don't make ridiculously small allocations. |
| 296 | let to_grow = cmp::max(to_grow, 4); |
| 297 | |
| 298 | let mut new_elems = TryVec::from(mem::take(&mut self.elems)); |
| 299 | new_elems.reserve_exact(to_grow)?; |
| 300 | new_elems.try_extend(iter::repeat(ScalarBitSet::new()).take(to_grow))?; |
| 301 | self.elems = new_elems.into_boxed_slice()?; |
| 302 | Ok(()) |
| 303 | } |
| 304 | |
| 305 | /// Insert `i` into this bitset. |
| 306 | /// |
no test coverage detected