Skip to content

Commit a9fc702

Browse files
committed
Implement insert_slice for SmallVec
Add benchmark for insert_many
1 parent 1714fbd commit a9fc702

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

lib.rs

Lines changed: 29 additions & 0 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+
pub 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> {
@@ -869,6 +879,17 @@ pub mod tests {
869879
assert_eq!(&v.iter().map(|v| **v).collect::<Vec<_>>(), &[0, 3, 2]);
870880
}
871881

882+
#[test]
883+
fn test_insert_many() {
884+
let mut v: SmallVec<[u8; 8]> = SmallVec::new();
885+
for x in 0..4 {
886+
v.push(x);
887+
}
888+
assert_eq!(v.len(), 4);
889+
v.insert_many(1, [5, 6].iter().cloned());
890+
assert_eq!(&v.iter().map(|v| *v).collect::<Vec<_>>(), &[0, 5, 6, 1, 2, 3]);
891+
}
892+
872893
#[test]
873894
#[should_panic]
874895
fn test_drop_panic_smallvec() {
@@ -1039,6 +1060,14 @@ mod bench {
10391060
});
10401061
}
10411062

1063+
#[bench]
1064+
fn bench_insert_many(b: &mut Bencher) {
1065+
b.iter(|| {
1066+
let mut vec: SmallVec<[u64; 16]> = SmallVec::new();
1067+
vec.insert_many(0, 0..100);
1068+
});
1069+
}
1070+
10421071
#[bench]
10431072
fn bench_extend(b: &mut Bencher) {
10441073
b.iter(|| {

0 commit comments

Comments
 (0)