Skip to content

Commit 85a4a07

Browse files
committed
Implement insert_slice for SmallVec
1 parent a48ec67 commit 85a4a07

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

lib.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,16 @@ impl<A: Array> SmallVec<A> {
313313
self.set_len(len + 1);
314314
}
315315
}
316+
317+
fn insert_many<I: IntoIterator<Item=A::Item>>(&mut self, index: usize, iterable: I) {
318+
let iter = iterable.into_iter();
319+
let (lower_size_bound, _) = iter.size_hint();
320+
self.reserve(lower_size_bound);
321+
322+
for (off, elem) in iter.enumerate() {
323+
self.insert(index + off, elem);
324+
}
325+
}
316326
}
317327

318328
impl<A: Array> ops::Deref for SmallVec<A> {
@@ -421,19 +431,10 @@ impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
421431
}
422432

423433
impl<A: Array> Extend<A::Item> for SmallVec<A> {
434+
#[inline]
424435
fn extend<I: IntoIterator<Item=A::Item>>(&mut self, iterable: I) {
425-
let iter = iterable.into_iter();
426-
let (lower_size_bound, _) = iter.size_hint();
427-
428-
let target_len = self.len + lower_size_bound;
429-
430-
if target_len > self.capacity() {
431-
self.grow(target_len);
432-
}
433-
434-
for elem in iter {
435-
self.push(elem);
436-
}
436+
let len = self.len();
437+
self.insert_many(len, iterable);
437438
}
438439
}
439440

@@ -860,6 +861,17 @@ pub mod tests {
860861
assert_eq!(&v.iter().map(|v| **v).collect::<Vec<_>>(), &[0, 3, 2]);
861862
}
862863

864+
#[test]
865+
fn test_insert_many() {
866+
let mut v: SmallVec<[u8; 8]> = SmallVec::new();
867+
for x in 0..4 {
868+
v.push(x);
869+
}
870+
assert_eq!(v.len(), 4);
871+
v.insert_many(1, [5, 6].iter().cloned());
872+
assert_eq!(&v.iter().map(|v| *v).collect::<Vec<_>>(), &[0, 5, 6, 1, 2, 3]);
873+
}
874+
863875
#[test]
864876
#[should_panic]
865877
fn test_drop_panic_smallvec() {

0 commit comments

Comments
 (0)