Skip to content

Commit a092fe1

Browse files
author
Markus Westerlind
committed
Avoid a closure in Vec::extend_desugared
1 parent 824151e commit a092fe1

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/liballoc/vec.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,6 +2121,21 @@ where
21212121
}
21222122
}
21232123

2124+
fn extend_fold<T>(self_: &mut Vec<T>) -> impl FnMut((), T) -> Result<(), T> + '_ {
2125+
move |(), element| {
2126+
let len = self_.len();
2127+
if len < self_.capacity() {
2128+
unsafe {
2129+
ptr::write(self_.get_unchecked_mut(len), element);
2130+
self_.set_len(len + 1);
2131+
Ok(())
2132+
}
2133+
} else {
2134+
Err(element)
2135+
}
2136+
}
2137+
}
2138+
21242139
impl<T> Vec<T> {
21252140
fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
21262141
// This is the case for a general iterator.
@@ -2133,21 +2148,8 @@ impl<T> Vec<T> {
21332148
let (lower, _) = iterator.size_hint();
21342149
self.reserve(lower);
21352150
loop {
2136-
let cap = self.capacity();
2137-
let result = iterator.try_fold((), |(), element| {
2138-
let len = self.len();
2139-
if len == cap {
2140-
Err(element)
2141-
} else {
2142-
unsafe {
2143-
ptr::write(self.get_unchecked_mut(len), element);
2144-
self.set_len(len + 1);
2145-
Ok(())
2146-
}
2147-
}
2148-
});
2149-
match result {
2150-
Ok(()) => return,
2151+
match iterator.try_fold((), extend_fold(self)) {
2152+
Ok(_) => return,
21512153
Err(element) => {
21522154
let (lower, _) = iterator.size_hint();
21532155
self.reserve(lower.saturating_add(1));

0 commit comments

Comments
 (0)