diff --git a/src/liballoc/btree/map.rs b/src/liballoc/btree/map.rs index c604df7049e0c..18694c06e7227 100644 --- a/src/liballoc/btree/map.rs +++ b/src/liballoc/btree/map.rs @@ -1480,6 +1480,8 @@ impl<'a, K, V> Iterator for Range<'a, K, V> { unsafe { Some(self.next_unchecked()) } } } + + // FIXME(#49205): Add size_hint. } #[stable(feature = "map_values_mut", since = "1.10.0")] @@ -1612,6 +1614,8 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> { unsafe { Some(self.next_unchecked()) } } } + + // FIXME(#49205): Add size_hint. } impl<'a, K, V> RangeMut<'a, K, V> { @@ -2549,4 +2553,19 @@ impl> Iterator for MergeIter { } } } + + // Currently unused. However, BTreeMap::from_sorted_iter may some day be + // rewritten to pre-allocate the correct amount of nodes, in which case + // having this will be helpful. + fn size_hint(&self) -> (usize, Option) { + let (left_lower, left_upper) = self.left.size_hint(); + let (right_lower, right_upper) = self.right.size_hint(); + let lower = left_lower.saturating_add(right_lower); + let upper = match (left_upper, right_upper) { + (Some(left), Some(right)) => left.checked_add(right), + (_, None) => None, + (None, _) => None + }; + (lower, upper) + } } diff --git a/src/liballoc/btree/set.rs b/src/liballoc/btree/set.rs index 2aad476d3153a..ff22b82a5c251 100644 --- a/src/liballoc/btree/set.rs +++ b/src/liballoc/btree/set.rs @@ -987,6 +987,10 @@ impl<'a, T> Iterator for Range<'a, T> { fn next(&mut self) -> Option<&'a T> { self.iter.next().map(|(k, _)| k) } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } } #[stable(feature = "btree_range", since = "1.17.0")]