| use crate::iter::TrustedLen; |
| |
| /// [`TrustedLen`] cannot have methods, so this allows augmenting it. |
| /// |
| /// It currently requires `TrustedLen` because it's unclear whether it's |
| /// reasonably possible to depend on the `size_hint` of anything else. |
| pub(crate) trait UncheckedIterator: TrustedLen { |
| /// Gets the next item from a non-empty iterator. |
| /// |
| /// Because there's always a value to return, that means it can return |
| /// the `Item` type directly, without wrapping it in an `Option`. |
| /// |
| /// # Safety |
| /// |
| /// This can only be called if `size_hint().0 != 0`, guaranteeing that |
| /// there's at least one item available. |
| /// |
| /// Otherwise (aka when `size_hint().1 == Some(0)`), this is UB. |
| /// |
| /// # Note to Implementers |
| /// |
| /// This has a default implementation using [`Option::unwrap_unchecked`]. |
| /// That's probably sufficient if your `next` *always* returns `Some`, |
| /// such as for infinite iterators. In more complicated situations, however, |
| /// sometimes there can still be `insertvalue`/`assume`/`extractvalue` |
| /// instructions remaining in the IR from the `Option` handling, at which |
| /// point you might want to implement this manually instead. |
| #[unstable(feature = "trusted_len_next_unchecked", issue = "37572")] |
| #[inline] |
| unsafe fn next_unchecked(&mut self) -> Self::Item { |
| let opt = self.next(); |
| // SAFETY: The caller promised that we're not empty, and |
| // `Self: TrustedLen` so we can actually trust the `size_hint`. |
| unsafe { opt.unwrap_unchecked() } |
| } |
| } |