Skip to content

Commit ca52f03

Browse files

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/lib.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,10 +1120,8 @@ impl<A: Array> SmallVec<A> {
11201120
unsafe {
11211121
let (mut ptr, mut len, cap) = self.triple_mut();
11221122
if *len == cap {
1123-
self.reserve(1);
1124-
let (heap_ptr, heap_len) = self.data.heap_mut();
1125-
ptr = heap_ptr;
1126-
len = heap_len;
1123+
self.reserve_one_unchecked();
1124+
(ptr, len) = self.data.heap_mut();
11271125
}
11281126
ptr::write(ptr.as_ptr().add(*len), value);
11291127
*len += 1;
@@ -1225,13 +1223,23 @@ impl<A: Array> SmallVec<A> {
12251223
infallible(self.try_reserve(additional))
12261224
}
12271225

1226+
/// Internal method used to grow in push() and insert(), where we know already we have to grow.
1227+
#[cold]
1228+
fn reserve_one_unchecked(&mut self) {
1229+
debug_assert_eq!(self.len(), self.capacity());
1230+
let new_cap = self.len()
1231+
.checked_add(1)
1232+
.and_then(usize::checked_next_power_of_two)
1233+
.expect("capacity overflow");
1234+
infallible(self.try_grow(new_cap))
1235+
}
1236+
12281237
/// Reserve capacity for `additional` more elements to be inserted.
12291238
///
12301239
/// May reserve more space to avoid frequent reallocations.
12311240
pub fn try_reserve(&mut self, additional: usize) -> Result<(), CollectionAllocErr> {
1232-
// prefer triple_mut() even if triple() would work
1233-
// so that the optimizer removes duplicated calls to it
1234-
// from callers like insert()
1241+
// prefer triple_mut() even if triple() would work so that the optimizer removes duplicated
1242+
// calls to it from callers.
12351243
let (_, &mut len, cap) = self.triple_mut();
12361244
if cap - len >= additional {
12371245
return Ok(());
@@ -1357,10 +1365,12 @@ impl<A: Array> SmallVec<A> {
13571365
///
13581366
/// Panics if `index > len`.
13591367
pub fn insert(&mut self, index: usize, element: A::Item) {
1360-
self.reserve(1);
1361-
13621368
unsafe {
1363-
let (ptr, len_ptr, _) = self.triple_mut();
1369+
let (mut ptr, mut len_ptr, cap) = self.triple_mut();
1370+
if *len_ptr == cap {
1371+
self.reserve_one_unchecked();
1372+
(ptr, len_ptr) = self.data.heap_mut();
1373+
}
13641374
let mut ptr = ptr.as_ptr();
13651375
let len = *len_ptr;
13661376
ptr = ptr.add(index);

0 commit comments

Comments
 (0)