|
21 | 21 |
|
22 | 22 |
|
23 | 23 | #[cfg(not(feature = "std"))]
|
24 |
| -#[cfg_attr(test, macro_use)] |
| 24 | +#[macro_use] |
25 | 25 | extern crate alloc;
|
26 | 26 |
|
27 | 27 | #[cfg(not(feature = "std"))]
|
@@ -637,6 +637,10 @@ impl<A: Array> SmallVec<A> {
|
637 | 637 | /// back.
|
638 | 638 | pub fn insert_many<I: IntoIterator<Item=A::Item>>(&mut self, index: usize, iterable: I) {
|
639 | 639 | let iter = iterable.into_iter();
|
| 640 | + if index == self.len() { |
| 641 | + return self.extend(iter); |
| 642 | + } |
| 643 | + |
640 | 644 | let (lower_size_bound, _) = iter.size_hint();
|
641 | 645 | assert!(lower_size_bound <= std::isize::MAX as usize); // Ensure offset is indexable
|
642 | 646 | assert!(index + lower_size_bound >= index); // Protect against overflow
|
@@ -805,9 +809,23 @@ impl<A: Array> SmallVec<A> where A::Item: Clone {
|
805 | 809 | /// assert_eq!(v, SmallVec::from_buf(['d', 'd']));
|
806 | 810 | /// ```
|
807 | 811 | pub fn from_elem(elem: A::Item, n: usize) -> Self {
|
808 |
| - let mut v = SmallVec::with_capacity(n); |
809 |
| - v.insert_many(0, (0..n).map(|_| elem.clone())); |
810 |
| - v |
| 812 | + if n > A::size() { |
| 813 | + vec![elem; n].into() |
| 814 | + } else { |
| 815 | + unsafe { |
| 816 | + let mut arr: A = ::std::mem::uninitialized(); |
| 817 | + let ptr = arr.ptr_mut(); |
| 818 | + |
| 819 | + for i in 0..n as isize { |
| 820 | + ::std::ptr::write(ptr.offset(i), elem.clone()); |
| 821 | + } |
| 822 | + |
| 823 | + SmallVec { |
| 824 | + data: Inline { array: arr }, |
| 825 | + len: n, |
| 826 | + } |
| 827 | + } |
| 828 | + } |
811 | 829 | }
|
812 | 830 | }
|
813 | 831 |
|
@@ -1001,13 +1019,30 @@ impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
|
1001 | 1019 |
|
1002 | 1020 | impl<A: Array> Extend<A::Item> for SmallVec<A> {
|
1003 | 1021 | fn extend<I: IntoIterator<Item=A::Item>>(&mut self, iterable: I) {
|
1004 |
| - let iter = iterable.into_iter(); |
| 1022 | + let mut iter = iterable.into_iter(); |
1005 | 1023 | let (lower_size_bound, _) = iter.size_hint();
|
1006 | 1024 |
|
1007 | 1025 | let target_len = self.len + lower_size_bound;
|
1008 | 1026 |
|
1009 | 1027 | if target_len > self.capacity() {
|
1010 |
| - self.grow(target_len); |
| 1028 | + self.grow(target_len); |
| 1029 | + } |
| 1030 | + |
| 1031 | + unsafe { |
| 1032 | + let ptr = self.as_mut_ptr().offset(self.len() as isize); |
| 1033 | + |
| 1034 | + let len = self.len(); |
| 1035 | + let mut count = 0; |
| 1036 | + for p in 0..lower_size_bound as isize { |
| 1037 | + if let Some(out) = iter.next() { |
| 1038 | + ::std::ptr::write(ptr.offset(p), out); |
| 1039 | + count += 1; |
| 1040 | + } else { |
| 1041 | + break; |
| 1042 | + } |
| 1043 | + } |
| 1044 | + |
| 1045 | + self.set_len(len + count); |
1011 | 1046 | }
|
1012 | 1047 |
|
1013 | 1048 | for elem in iter {
|
|
0 commit comments