Skip to content

Commit 367145a

Browse files
committed
Implement insert_slice for SmallVec
1 parent 1714fbd commit 367145a

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
@@ -315,6 +315,16 @@ impl<A: Array> SmallVec<A> {
315315
self.set_len(len + 1);
316316
}
317317
}
318+
319+
fn insert_many<I: IntoIterator<Item=A::Item>>(&mut self, index: usize, iterable: I) {
320+
let iter = iterable.into_iter();
321+
let (lower_size_bound, _) = iter.size_hint();
322+
self.reserve(lower_size_bound);
323+
324+
for (off, elem) in iter.enumerate() {
325+
self.insert(index + off, elem);
326+
}
327+
}
318328
}
319329

320330
impl<A: Array> ops::Deref for SmallVec<A> {
@@ -423,19 +433,10 @@ impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
423433
}
424434

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

@@ -869,6 +870,17 @@ pub mod tests {
869870
assert_eq!(&v.iter().map(|v| **v).collect::<Vec<_>>(), &[0, 3, 2]);
870871
}
871872

873+
#[test]
874+
fn test_insert_many() {
875+
let mut v: SmallVec<[u8; 8]> = SmallVec::new();
876+
for x in 0..4 {
877+
v.push(x);
878+
}
879+
assert_eq!(v.len(), 4);
880+
v.insert_many(1, [5, 6].iter().cloned());
881+
assert_eq!(&v.iter().map(|v| *v).collect::<Vec<_>>(), &[0, 5, 6, 1, 2, 3]);
882+
}
883+
872884
#[test]
873885
#[should_panic]
874886
fn test_drop_panic_smallvec() {

0 commit comments

Comments
 (0)