11use core:: fmt;
22use core:: iter:: { FusedIterator , TrustedLen , TrustedRandomAccess , TrustedRandomAccessNoCoerce } ;
3- use core:: marker:: PhantomData ;
43use core:: mem:: MaybeUninit ;
54use core:: ops:: Try ;
6- use core:: ptr:: NonNull ;
75
86use super :: { count, wrap_index, RingSlices } ;
97
@@ -15,53 +13,38 @@ use super::{count, wrap_index, RingSlices};
1513/// [`iter`]: super::VecDeque::iter
1614#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1715pub struct Iter < ' a , T : ' a > {
18- ring : NonNull < [ T ] > ,
16+ ring : & ' a [ MaybeUninit < T > ] ,
1917 tail : usize ,
2018 head : usize ,
21- _marker : PhantomData < & ' a T > ,
2219}
2320
2421impl < ' a , T > Iter < ' a , T > {
2522 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 }
4124 }
4225}
4326
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-
4927#[ stable( feature = "collection_debug" , since = "1.17.0" ) ]
5028impl < T : fmt:: Debug > fmt:: Debug for Iter < ' _ , T > {
5129 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 ) ;
5331 // Safety:
5432 // - `self.head` and `self.tail` in a ring buffer are always valid indices.
5533 // - `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+ }
5740 }
5841}
5942
6043// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
6144#[ stable( feature = "rust1" , since = "1.0.0" ) ]
6245impl < T > Clone for Iter < ' _ , T > {
6346 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 }
6548 }
6649}
6750
@@ -79,7 +62,7 @@ impl<'a, T> Iterator for Iter<'a, T> {
7962 // Safety:
8063 // - `self.tail` in a ring buffer is always a valid index.
8164 // - `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 ( ) ) }
8366 }
8467
8568 #[ inline]
@@ -92,11 +75,11 @@ impl<'a, T> Iterator for Iter<'a, T> {
9275 where
9376 F : FnMut ( Acc , Self :: Item ) -> Acc ,
9477 {
78+ let ( front, back) = RingSlices :: ring_slices ( self . ring , self . head , self . tail ) ;
9579 // Safety:
9680 // - `self.head` and `self.tail` in a ring buffer are always valid indices.
9781 // - `RingSlices::ring_slices` guarantees that the slices split according to `self.head` and `self.tail` are initialized.
9882 unsafe {
99- let ( front, back) = RingSlices :: ring_slices ( self . ring ( ) , self . head , self . tail ) ;
10083 accum = MaybeUninit :: slice_assume_init_ref ( front) . iter ( ) . fold ( accum, & mut f) ;
10184 MaybeUninit :: slice_assume_init_ref ( back) . iter ( ) . fold ( accum, & mut f)
10285 }
@@ -111,13 +94,12 @@ impl<'a, T> Iterator for Iter<'a, T> {
11194 let ( mut iter, final_res) ;
11295 if self . tail <= self . head {
11396 // 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 ( ) ;
11799 final_res = iter. try_fold ( init, & mut f) ;
118100 } 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 ) ;
121103
122104 let mut back_iter = unsafe { MaybeUninit :: slice_assume_init_ref ( back) . iter ( ) } ;
123105 let res = back_iter. try_fold ( init, & mut f) ;
@@ -151,7 +133,7 @@ impl<'a, T> Iterator for Iter<'a, T> {
151133 // that is in bounds.
152134 unsafe {
153135 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 ( )
155137 }
156138 }
157139}
@@ -167,18 +149,18 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
167149 // Safety:
168150 // - `self.head` in a ring buffer is always a valid index.
169151 // - `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 ( ) ) }
171153 }
172154
173155 fn rfold < Acc , F > ( self , mut accum : Acc , mut f : F ) -> Acc
174156 where
175157 F : FnMut ( Acc , Self :: Item ) -> Acc ,
176158 {
159+ let ( front, back) = RingSlices :: ring_slices ( self . ring , self . head , self . tail ) ;
177160 // Safety:
178161 // - `self.head` and `self.tail` in a ring buffer are always valid indices.
179162 // - `RingSlices::ring_slices` guarantees that the slices split according to `self.head` and `self.tail` are initialized.
180163 unsafe {
181- let ( front, back) = RingSlices :: ring_slices ( self . ring ( ) , self . head , self . tail ) ;
182164 accum = MaybeUninit :: slice_assume_init_ref ( back) . iter ( ) . rfold ( accum, & mut f) ;
183165 MaybeUninit :: slice_assume_init_ref ( front) . iter ( ) . rfold ( accum, & mut f)
184166 }
@@ -192,14 +174,14 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
192174 {
193175 let ( mut iter, final_res) ;
194176 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.
196178 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 ( )
198180 } ;
199181 final_res = iter. try_rfold ( init, & mut f) ;
200182 } 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 ) ;
203185
204186 let mut front_iter =
205187 unsafe { MaybeUninit :: slice_assume_init_ref ( & front[ ..self . head ] ) . iter ( ) } ;
0 commit comments