@@ -7,11 +7,14 @@ use arrayvec::ArrayVec;
77use intern:: sym;
88use span:: Span ;
99
10- use crate :: { Ident , Leaf , MAX_GLUED_PUNCT_LEN , Punct , Spacing , Subtree , TokenTree , TokenTreesView } ;
10+ use crate :: {
11+ Ident , Leaf , MAX_GLUED_PUNCT_LEN , Punct , Spacing , Subtree , TokenTree , TokenTreesReprRef ,
12+ TokenTreesView , dispatch_ref,
13+ } ;
1114
1215#[ derive( Clone ) ]
1316pub struct TtIter < ' a > {
14- inner : std :: slice :: Iter < ' a , TokenTree > ,
17+ inner : TokenTreesView < ' a > ,
1518}
1619
1720impl fmt:: Debug for TtIter < ' _ > {
@@ -21,17 +24,17 @@ impl fmt::Debug for TtIter<'_> {
2124}
2225
2326#[ derive( Clone , Copy ) ]
24- pub struct TtIterSavepoint < ' a > ( & ' a [ TokenTree ] ) ;
27+ pub struct TtIterSavepoint < ' a > ( TokenTreesView < ' a > ) ;
2528
2629impl < ' a > TtIterSavepoint < ' a > {
2730 pub fn remaining ( self ) -> TokenTreesView < ' a > {
28- TokenTreesView :: new ( self . 0 )
31+ self . 0
2932 }
3033}
3134
3235impl < ' a > TtIter < ' a > {
33- pub ( crate ) fn new ( tt : & ' a [ TokenTree ] ) -> TtIter < ' a > {
34- TtIter { inner : tt. iter ( ) }
36+ pub ( crate ) fn new ( tt : TokenTreesView < ' a > ) -> TtIter < ' a > {
37+ TtIter { inner : tt }
3538 }
3639
3740 pub fn expect_char ( & mut self , char : char ) -> Result < ( ) , ( ) > {
@@ -141,8 +144,8 @@ impl<'a> TtIter<'a> {
141144 let _ = self . next ( ) . unwrap ( ) ;
142145 let _ = self . next ( ) . unwrap ( ) ;
143146 res. push ( first) ;
144- res. push ( * second) ;
145- res. push ( * third. unwrap ( ) ) ;
147+ res. push ( second) ;
148+ res. push ( third. unwrap ( ) ) ;
146149 }
147150 ( '-' | '!' | '*' | '/' | '&' | '%' | '^' | '+' | '<' | '=' | '>' | '|' , '=' , _)
148151 | ( '-' | '=' | '>' , '>' , _)
@@ -154,25 +157,29 @@ impl<'a> TtIter<'a> {
154157 | ( '|' , '|' , _) => {
155158 let _ = self . next ( ) . unwrap ( ) ;
156159 res. push ( first) ;
157- res. push ( * second) ;
160+ res. push ( second) ;
158161 }
159162 _ => res. push ( first) ,
160163 }
161164 Ok ( res)
162165 }
163166
164167 /// This method won't check for subtrees, so the nth token tree may not be the nth sibling of the current tree.
165- fn peek_n ( & self , n : usize ) -> Option < & ' a TokenTree > {
166- self . inner . as_slice ( ) . get ( n)
168+ fn peek_n ( & self , n : usize ) -> Option < TokenTree > {
169+ dispatch_ref ! {
170+ match self . inner. repr => tt => Some ( tt. get( n) ?. to_api( self . inner. span_parts) )
171+ }
167172 }
168173
169174 pub fn peek ( & self ) -> Option < TtElement < ' a > > {
170- match self . inner . as_slice ( ) . first ( ) ? {
171- TokenTree :: Leaf ( leaf) => Some ( TtElement :: Leaf ( leaf. clone ( ) ) ) ,
175+ match self . peek_n ( 0 ) ? {
176+ TokenTree :: Leaf ( leaf) => Some ( TtElement :: Leaf ( leaf) ) ,
172177 TokenTree :: Subtree ( subtree) => {
173- let nested_iter =
174- TtIter { inner : self . inner . as_slice ( ) [ 1 ..] [ ..subtree. usize_len ( ) ] . iter ( ) } ;
175- Some ( TtElement :: Subtree ( * subtree, nested_iter) )
178+ let nested_repr = self . inner . repr . get ( 1 ..subtree. usize_len ( ) + 1 ) . unwrap ( ) ;
179+ let nested_iter = TtIter {
180+ inner : TokenTreesView { repr : nested_repr, span_parts : self . inner . span_parts } ,
181+ } ;
182+ Some ( TtElement :: Subtree ( subtree, nested_iter) )
176183 }
177184 }
178185 }
@@ -183,26 +190,51 @@ impl<'a> TtIter<'a> {
183190 }
184191
185192 pub fn next_span ( & self ) -> Option < Span > {
186- Some ( self . inner . as_slice ( ) . first ( ) ?. first_span ( ) )
193+ Some ( self . peek ( ) ?. first_span ( ) )
187194 }
188195
189196 pub fn remaining ( & self ) -> TokenTreesView < ' a > {
190- TokenTreesView :: new ( self . inner . as_slice ( ) )
197+ self . inner
191198 }
192199
193200 /// **Warning**: This advances `skip` **flat** token trees, subtrees account for children+1!
194201 pub fn flat_advance ( & mut self , skip : usize ) {
195- self . inner = self . inner . as_slice ( ) [ skip..] . iter ( ) ;
202+ self . inner . repr = self . inner . repr . get ( skip..) . unwrap ( ) ;
196203 }
197204
198205 pub fn savepoint ( & self ) -> TtIterSavepoint < ' a > {
199- TtIterSavepoint ( self . inner . as_slice ( ) )
206+ TtIterSavepoint ( self . inner )
200207 }
201208
202209 pub fn from_savepoint ( & self , savepoint : TtIterSavepoint < ' a > ) -> TokenTreesView < ' a > {
203- let len = ( self . inner . as_slice ( ) . as_ptr ( ) as usize - savepoint. 0 . as_ptr ( ) as usize )
204- / size_of :: < TokenTree > ( ) ;
205- TokenTreesView :: new ( & savepoint. 0 [ ..len] )
210+ let len = match ( self . inner . repr , savepoint. 0 . repr ) {
211+ (
212+ TokenTreesReprRef :: SpanStorage32 ( this) ,
213+ TokenTreesReprRef :: SpanStorage32 ( savepoint) ,
214+ ) => {
215+ ( this. as_ptr ( ) as usize - savepoint. as_ptr ( ) as usize )
216+ / size_of :: < crate :: storage:: TokenTree < crate :: storage:: SpanStorage32 > > ( )
217+ }
218+ (
219+ TokenTreesReprRef :: SpanStorage64 ( this) ,
220+ TokenTreesReprRef :: SpanStorage64 ( savepoint) ,
221+ ) => {
222+ ( this. as_ptr ( ) as usize - savepoint. as_ptr ( ) as usize )
223+ / size_of :: < crate :: storage:: TokenTree < crate :: storage:: SpanStorage64 > > ( )
224+ }
225+ (
226+ TokenTreesReprRef :: SpanStorage96 ( this) ,
227+ TokenTreesReprRef :: SpanStorage96 ( savepoint) ,
228+ ) => {
229+ ( this. as_ptr ( ) as usize - savepoint. as_ptr ( ) as usize )
230+ / size_of :: < crate :: storage:: TokenTree < crate :: storage:: SpanStorage96 > > ( )
231+ }
232+ _ => panic ! ( "savepoint did not originate from this TtIter" ) ,
233+ } ;
234+ TokenTreesView {
235+ repr : savepoint. 0 . repr . get ( ..len) . unwrap ( ) ,
236+ span_parts : savepoint. 0 . span_parts ,
237+ }
206238 }
207239
208240 pub fn next_as_view ( & mut self ) -> Option < TokenTreesView < ' a > > {
@@ -242,14 +274,12 @@ impl TtElement<'_> {
242274impl < ' a > Iterator for TtIter < ' a > {
243275 type Item = TtElement < ' a > ;
244276 fn next ( & mut self ) -> Option < Self :: Item > {
245- match self . inner . next ( ) ? {
246- TokenTree :: Leaf ( leaf) => Some ( TtElement :: Leaf ( leaf. clone ( ) ) ) ,
247- TokenTree :: Subtree ( subtree) => {
248- let nested_iter =
249- TtIter { inner : self . inner . as_slice ( ) [ ..subtree. usize_len ( ) ] . iter ( ) } ;
250- self . inner = self . inner . as_slice ( ) [ subtree. usize_len ( ) ..] . iter ( ) ;
251- Some ( TtElement :: Subtree ( * subtree, nested_iter) )
252- }
253- }
277+ let result = self . peek ( ) ?;
278+ let skip = match & result {
279+ TtElement :: Leaf ( _) => 1 ,
280+ TtElement :: Subtree ( subtree, _) => subtree. usize_len ( ) + 1 ,
281+ } ;
282+ self . inner . repr = self . inner . repr . get ( skip..) . unwrap ( ) ;
283+ Some ( result)
254284 }
255285}
0 commit comments