1
1
use core:: fmt;
2
2
use core:: iter:: { FusedIterator , TrustedLen , TrustedRandomAccess , TrustedRandomAccessNoCoerce } ;
3
- use core:: marker:: PhantomData ;
4
3
use core:: mem:: MaybeUninit ;
5
4
use core:: ops:: Try ;
6
- use core:: ptr:: NonNull ;
7
5
8
6
use super :: { count, wrap_index, RingSlices } ;
9
7
@@ -15,53 +13,38 @@ use super::{count, wrap_index, RingSlices};
15
13
/// [`iter`]: super::VecDeque::iter
16
14
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
17
15
pub struct Iter < ' a , T : ' a > {
18
- ring : NonNull < [ T ] > ,
16
+ ring : & ' a [ MaybeUninit < T > ] ,
19
17
tail : usize ,
20
18
head : usize ,
21
- _marker : PhantomData < & ' a T > ,
22
19
}
23
20
24
21
impl < ' a , T > Iter < ' a , T > {
25
22
pub ( super ) fn new ( ring : & ' a [ MaybeUninit < T > ] , tail : usize , head : usize ) -> Self {
26
- Iter {
27
- ring : unsafe { NonNull :: new_unchecked ( ring as * const [ MaybeUninit < T > ] as * mut _ ) } ,
28
- tail,
29
- head,
30
- _marker : PhantomData ,
31
- }
32
- }
33
-
34
- unsafe fn ring ( & self ) -> & ' a [ MaybeUninit < T > ] {
35
- unsafe {
36
- core:: slice:: from_raw_parts (
37
- self . ring . as_ptr ( ) as * const MaybeUninit < T > ,
38
- self . ring . len ( ) ,
39
- )
40
- }
23
+ Iter { ring, tail, head }
41
24
}
42
25
}
43
26
44
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
45
- unsafe impl < T : Sync > Sync for Iter < ' _ , T > { }
46
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
47
- unsafe impl < T : Sync > Send for Iter < ' _ , T > { }
48
-
49
27
#[ stable( feature = "collection_debug" , since = "1.17.0" ) ]
50
28
impl < T : fmt:: Debug > fmt:: Debug for Iter < ' _ , T > {
51
29
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
52
- let ( front, back) = unsafe { RingSlices :: ring_slices ( self . ring ( ) , self . head , self . tail ) } ;
30
+ let ( front, back) = RingSlices :: ring_slices ( self . ring , self . head , self . tail ) ;
53
31
// Safety:
54
32
// - `self.head` and `self.tail` in a ring buffer are always valid indices.
55
33
// - `RingSlices::ring_slices` guarantees that the slices split according to `self.head` and `self.tail` are initialized.
56
- f. debug_tuple ( "Iter" ) . field ( & front) . field ( & back) . finish ( )
34
+ unsafe {
35
+ f. debug_tuple ( "Iter" )
36
+ . field ( & MaybeUninit :: slice_assume_init_ref ( front) )
37
+ . field ( & MaybeUninit :: slice_assume_init_ref ( back) )
38
+ . finish ( )
39
+ }
57
40
}
58
41
}
59
42
60
43
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
61
44
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
62
45
impl < T > Clone for Iter < ' _ , T > {
63
46
fn clone ( & self ) -> Self {
64
- Iter { ring : self . ring , tail : self . tail , head : self . head , _marker : PhantomData }
47
+ Iter { ring : self . ring , tail : self . tail , head : self . head }
65
48
}
66
49
}
67
50
@@ -79,7 +62,7 @@ impl<'a, T> Iterator for Iter<'a, T> {
79
62
// Safety:
80
63
// - `self.tail` in a ring buffer is always a valid index.
81
64
// - `self.head` and `self.tail` equality is checked above.
82
- unsafe { Some ( self . ring ( ) . get_unchecked ( tail) . assume_init_ref ( ) ) }
65
+ unsafe { Some ( self . ring . get_unchecked ( tail) . assume_init_ref ( ) ) }
83
66
}
84
67
85
68
#[ inline]
@@ -92,11 +75,11 @@ impl<'a, T> Iterator for Iter<'a, T> {
92
75
where
93
76
F : FnMut ( Acc , Self :: Item ) -> Acc ,
94
77
{
78
+ let ( front, back) = RingSlices :: ring_slices ( self . ring , self . head , self . tail ) ;
95
79
// Safety:
96
80
// - `self.head` and `self.tail` in a ring buffer are always valid indices.
97
81
// - `RingSlices::ring_slices` guarantees that the slices split according to `self.head` and `self.tail` are initialized.
98
82
unsafe {
99
- let ( front, back) = RingSlices :: ring_slices ( self . ring ( ) , self . head , self . tail ) ;
100
83
accum = MaybeUninit :: slice_assume_init_ref ( front) . iter ( ) . fold ( accum, & mut f) ;
101
84
MaybeUninit :: slice_assume_init_ref ( back) . iter ( ) . fold ( accum, & mut f)
102
85
}
@@ -111,13 +94,12 @@ impl<'a, T> Iterator for Iter<'a, T> {
111
94
let ( mut iter, final_res) ;
112
95
if self . tail <= self . head {
113
96
// Safety: single slice self.ring[self.tail..self.head] is initialized.
114
- iter =
115
- unsafe { MaybeUninit :: slice_assume_init_ref ( & self . ring ( ) [ self . tail ..self . head ] ) }
116
- . iter ( ) ;
97
+ iter = unsafe { MaybeUninit :: slice_assume_init_ref ( & self . ring [ self . tail ..self . head ] ) }
98
+ . iter ( ) ;
117
99
final_res = iter. try_fold ( init, & mut f) ;
118
100
} else {
119
- // Safety: two slices: self.ring() [self.tail..], self.ring() [..self.head] both are initialized.
120
- let ( front, back) = unsafe { self . ring ( ) . split_at ( self . tail ) } ;
101
+ // Safety: two slices: self.ring[self.tail..], self.ring[..self.head] both are initialized.
102
+ let ( front, back) = self . ring . split_at ( self . tail ) ;
121
103
122
104
let mut back_iter = unsafe { MaybeUninit :: slice_assume_init_ref ( back) . iter ( ) } ;
123
105
let res = back_iter. try_fold ( init, & mut f) ;
@@ -151,7 +133,7 @@ impl<'a, T> Iterator for Iter<'a, T> {
151
133
// that is in bounds.
152
134
unsafe {
153
135
let idx = wrap_index ( self . tail . wrapping_add ( idx) , self . ring . len ( ) ) ;
154
- self . ring ( ) . get_unchecked ( idx) . assume_init_ref ( )
136
+ self . ring . get_unchecked ( idx) . assume_init_ref ( )
155
137
}
156
138
}
157
139
}
@@ -167,18 +149,18 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
167
149
// Safety:
168
150
// - `self.head` in a ring buffer is always a valid index.
169
151
// - `self.head` and `self.tail` equality is checked above.
170
- unsafe { Some ( self . ring ( ) . get_unchecked ( self . head ) . assume_init_ref ( ) ) }
152
+ unsafe { Some ( self . ring . get_unchecked ( self . head ) . assume_init_ref ( ) ) }
171
153
}
172
154
173
155
fn rfold < Acc , F > ( self , mut accum : Acc , mut f : F ) -> Acc
174
156
where
175
157
F : FnMut ( Acc , Self :: Item ) -> Acc ,
176
158
{
159
+ let ( front, back) = RingSlices :: ring_slices ( self . ring , self . head , self . tail ) ;
177
160
// Safety:
178
161
// - `self.head` and `self.tail` in a ring buffer are always valid indices.
179
162
// - `RingSlices::ring_slices` guarantees that the slices split according to `self.head` and `self.tail` are initialized.
180
163
unsafe {
181
- let ( front, back) = RingSlices :: ring_slices ( self . ring ( ) , self . head , self . tail ) ;
182
164
accum = MaybeUninit :: slice_assume_init_ref ( back) . iter ( ) . rfold ( accum, & mut f) ;
183
165
MaybeUninit :: slice_assume_init_ref ( front) . iter ( ) . rfold ( accum, & mut f)
184
166
}
@@ -192,14 +174,14 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
192
174
{
193
175
let ( mut iter, final_res) ;
194
176
if self . tail <= self . head {
195
- // Safety: single slice self.ring() [self.tail..self.head] is initialized.
177
+ // Safety: single slice self.ring[self.tail..self.head] is initialized.
196
178
iter = unsafe {
197
- MaybeUninit :: slice_assume_init_ref ( & self . ring ( ) [ self . tail ..self . head ] ) . iter ( )
179
+ MaybeUninit :: slice_assume_init_ref ( & self . ring [ self . tail ..self . head ] ) . iter ( )
198
180
} ;
199
181
final_res = iter. try_rfold ( init, & mut f) ;
200
182
} else {
201
- // Safety: two slices: self.ring() [self.tail..], self.ring() [..self.head] both are initialized.
202
- let ( front, back) = unsafe { self . ring ( ) . split_at ( self . tail ) } ;
183
+ // Safety: two slices: self.ring[self.tail..], self.ring[..self.head] both are initialized.
184
+ let ( front, back) = self . ring . split_at ( self . tail ) ;
203
185
204
186
let mut front_iter =
205
187
unsafe { MaybeUninit :: slice_assume_init_ref ( & front[ ..self . head ] ) . iter ( ) } ;
0 commit comments