diff options
Diffstat (limited to 'vendor/hashbrown/src/table.rs')
-rw-r--r-- | vendor/hashbrown/src/table.rs | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/vendor/hashbrown/src/table.rs b/vendor/hashbrown/src/table.rs index bfb5dd989..a7bb5fcc9 100644 --- a/vendor/hashbrown/src/table.rs +++ b/vendor/hashbrown/src/table.rs @@ -1861,12 +1861,25 @@ impl<'a, T> Iterator for Iter<'a, T> { type Item = &'a T; fn next(&mut self) -> Option<Self::Item> { - self.inner.next().map(|bucket| unsafe { bucket.as_ref() }) + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some(bucket) => Some(unsafe { bucket.as_ref() }), + None => None, + } } fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() } + + fn fold<B, F>(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + self.inner + .fold(init, |acc, bucket| unsafe { f(acc, bucket.as_ref()) }) + } } impl<T> ExactSizeIterator for Iter<'_, T> { @@ -1894,12 +1907,25 @@ impl<'a, T> Iterator for IterMut<'a, T> { type Item = &'a mut T; fn next(&mut self) -> Option<Self::Item> { - self.inner.next().map(|bucket| unsafe { bucket.as_mut() }) + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some(bucket) => Some(unsafe { bucket.as_mut() }), + None => None, + } } fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() } + + fn fold<B, F>(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + self.inner + .fold(init, |acc, bucket| unsafe { f(acc, bucket.as_mut()) }) + } } impl<T> ExactSizeIterator for IterMut<'_, T> { @@ -1940,6 +1966,14 @@ where fn size_hint(&self) -> (usize, Option<usize>) { self.inner.size_hint() } + + fn fold<B, F>(self, init: B, f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + self.inner.fold(init, f) + } } impl<T, A> ExactSizeIterator for IntoIter<T, A> |