summaryrefslogtreecommitdiffstats
path: root/vendor/hashbrown/src/table.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/hashbrown/src/table.rs')
-rw-r--r--vendor/hashbrown/src/table.rs38
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>