1
1
use crate :: alloc:: Allocator ;
2
2
use crate :: vec;
3
- use core:: iter:: { ByRefSized , TrustedLen } ;
3
+ use core:: iter:: TrustedLen ;
4
4
use core:: slice;
5
5
6
6
use super :: VecDeque ;
@@ -20,28 +20,30 @@ where
20
20
// for item in iter {
21
21
// self.push_back(item);
22
22
// }
23
- loop {
24
- let lower_bound = iter. size_hint ( ) . 0 ;
25
- if lower_bound != 0 {
26
- self . reserve ( lower_bound) ;
27
- }
28
23
29
- match iter. next ( ) {
30
- Some ( val) => self . push_back ( val) ,
31
- None => break ,
32
- }
24
+ // May only be called if `deque.len() < deque.capacity()`
25
+ unsafe fn push_unchecked < T , A : Allocator > ( deque : & mut VecDeque < T , A > , element : T ) {
26
+ // SAFETY: Because of the precondition, it's guaranteed that there is space
27
+ // in the logical array after the last element.
28
+ unsafe { deque. buffer_write ( deque. to_physical_idx ( deque. len ) , element) } ;
29
+ // This can't overflow because `deque.len() < deque.capacity() <= usize::MAX`.
30
+ deque. len += 1 ;
31
+ }
32
+
33
+ while let Some ( element) = iter. next ( ) {
34
+ let ( lower, _) = iter. size_hint ( ) ;
35
+ self . reserve ( lower. saturating_add ( 1 ) ) ;
36
+
37
+ // SAFETY: We just reserved space for at least one element.
38
+ unsafe { push_unchecked ( self , element) } ;
33
39
34
- let room = self . capacity ( ) - self . len ;
35
- unsafe {
36
- // Safety:
37
- // The iter is at most `room` items long,
38
- // and `room == self.capacity() - self.len`
39
- // => `self.len + room <= self.capacity()`
40
- self . write_iter_wrapping (
41
- self . to_physical_idx ( self . len ) ,
42
- ByRefSized ( & mut iter) . take ( room) ,
43
- room,
44
- ) ;
40
+ // Inner loop to avoid repeatedly calling `reserve`.
41
+ while self . len < self . capacity ( ) {
42
+ let Some ( element) = iter. next ( ) else {
43
+ return ;
44
+ } ;
45
+ // SAFETY: The loop condition guarantees that `self.len() < self.capacity()`.
46
+ unsafe { push_unchecked ( self , element) } ;
45
47
}
46
48
}
47
49
}
0 commit comments