@@ -125,9 +125,8 @@ impl fmt::Display for Token {
125125 }
126126}
127127
128- fn buf_str ( toks : & [ Token ] , szs : & [ isize ] , left : usize , right : usize , lim : usize ) -> String {
129- let n = toks. len ( ) ;
130- assert_eq ! ( n, szs. len( ) ) ;
128+ fn buf_str ( buf : & [ BufEntry ] , left : usize , right : usize , lim : usize ) -> String {
129+ let n = buf. len ( ) ;
131130 let mut i = left;
132131 let mut l = lim;
133132 let mut s = String :: from ( "[" ) ;
@@ -136,7 +135,7 @@ fn buf_str(toks: &[Token], szs: &[isize], left: usize, right: usize, lim: usize)
136135 if i != left {
137136 s. push_str ( ", " ) ;
138137 }
139- s. push_str ( & format ! ( "{}={}" , szs [ i] , & toks [ i] ) ) ;
138+ s. push_str ( & format ! ( "{}={}" , buf [ i] . size , & buf [ i] . token ) ) ;
140139 i += 1 ;
141140 i %= n;
142141 }
@@ -159,25 +158,20 @@ pub struct PrintStackElem {
159158const SIZE_INFINITY : isize = 0xffff ;
160159
161160pub fn mk_printer < ' a > ( out : Box < io:: Write +' a > , linewidth : usize ) -> Printer < ' a > {
162- // Yes 55, it makes the ring buffers big enough to never
163- // fall behind.
161+ // Yes 55, it makes the ring buffers big enough to never fall behind.
164162 let n: usize = 55 * linewidth;
165163 debug ! ( "mk_printer {}" , linewidth) ;
166- let token = vec ! [ Token :: Eof ; n] ;
167- let size = vec ! [ 0 ; n] ;
168- let scan_stack = VecDeque :: with_capacity ( n) ;
169164 Printer {
170165 out : out,
171166 buf_len : n,
172167 margin : linewidth as isize ,
173168 space : linewidth as isize ,
174169 left : 0 ,
175170 right : 0 ,
176- token : token,
177- size : size,
171+ buf : vec ! [ BufEntry { token: Token :: Eof , size: 0 } ; n] ,
178172 left_total : 0 ,
179173 right_total : 0 ,
180- scan_stack : scan_stack ,
174+ scan_stack : VecDeque :: new ( ) ,
181175 print_stack : Vec :: new ( ) ,
182176 pending_indentation : 0
183177 }
@@ -269,10 +263,8 @@ pub struct Printer<'a> {
269263 left : usize ,
270264 /// Index of right side of input stream
271265 right : usize ,
272- /// Ring-buffer stream goes through
273- token : Vec < Token > ,
274- /// Ring-buffer of calculated sizes
275- size : Vec < isize > ,
266+ /// Ring-buffer of tokens and calculated sizes
267+ buf : Vec < BufEntry > ,
276268 /// Running size of stream "...left"
277269 left_total : isize ,
278270 /// Running size of stream "...right"
@@ -283,20 +275,26 @@ pub struct Printer<'a> {
283275 /// Begin (if there is any) on top of it. Stuff is flushed off the
284276 /// bottom as it becomes irrelevant due to the primary ring-buffer
285277 /// advancing.
286- scan_stack : VecDeque < usize > ,
278+ scan_stack : VecDeque < usize > ,
287279 /// Stack of blocks-in-progress being flushed by print
288280 print_stack : Vec < PrintStackElem > ,
289281 /// Buffered indentation to avoid writing trailing whitespace
290282 pending_indentation : isize ,
291283}
292284
285+ #[ derive( Clone ) ]
286+ struct BufEntry {
287+ token : Token ,
288+ size : isize ,
289+ }
290+
293291impl < ' a > Printer < ' a > {
294292 pub fn last_token ( & mut self ) -> Token {
295- self . token [ self . right ] . clone ( )
293+ self . buf [ self . right ] . token . clone ( )
296294 }
297295 // be very careful with this!
298296 pub fn replace_last_token ( & mut self , t : Token ) {
299- self . token [ self . right ] = t;
297+ self . buf [ self . right ] . token = t;
300298 }
301299 pub fn pretty_print ( & mut self , token : Token ) -> io:: Result < ( ) > {
302300 debug ! ( "pp Vec<{},{}>" , self . left, self . right) ;
@@ -318,8 +316,7 @@ impl<'a> Printer<'a> {
318316 } else { self . advance_right ( ) ; }
319317 debug ! ( "pp Begin({})/buffer Vec<{},{}>" ,
320318 b. offset, self . left, self . right) ;
321- self . token [ self . right ] = token;
322- self . size [ self . right ] = -self . right_total ;
319+ self . buf [ self . right ] = BufEntry { token : token, size : -self . right_total } ;
323320 let right = self . right ;
324321 self . scan_push ( right) ;
325322 Ok ( ( ) )
@@ -331,8 +328,7 @@ impl<'a> Printer<'a> {
331328 } else {
332329 debug ! ( "pp End/buffer Vec<{},{}>" , self . left, self . right) ;
333330 self . advance_right ( ) ;
334- self . token [ self . right ] = token;
335- self . size [ self . right ] = -1 ;
331+ self . buf [ self . right ] = BufEntry { token : token, size : -1 } ;
336332 let right = self . right ;
337333 self . scan_push ( right) ;
338334 Ok ( ( ) )
@@ -350,8 +346,7 @@ impl<'a> Printer<'a> {
350346 self . check_stack ( 0 ) ;
351347 let right = self . right ;
352348 self . scan_push ( right) ;
353- self . token [ self . right ] = token;
354- self . size [ self . right ] = -self . right_total ;
349+ self . buf [ self . right ] = BufEntry { token : token, size : -self . right_total } ;
355350 self . right_total += b. blank_space ;
356351 Ok ( ( ) )
357352 }
@@ -364,8 +359,7 @@ impl<'a> Printer<'a> {
364359 debug ! ( "pp String('{}')/buffer Vec<{},{}>" ,
365360 s, self . left, self . right) ;
366361 self . advance_right ( ) ;
367- self . token [ self . right ] = Token :: String ( s, len) ;
368- self . size [ self . right ] = len;
362+ self . buf [ self . right ] = BufEntry { token : Token :: String ( s, len) , size : len } ;
369363 self . right_total += len;
370364 self . check_stream ( )
371365 }
@@ -381,7 +375,7 @@ impl<'a> Printer<'a> {
381375 if Some ( & self . left ) == self . scan_stack . back ( ) {
382376 debug ! ( "setting {} to infinity and popping" , self . left) ;
383377 let scanned = self . scan_pop_bottom ( ) ;
384- self . size [ scanned] = SIZE_INFINITY ;
378+ self . buf [ scanned] . size = SIZE_INFINITY ;
385379 }
386380 self . advance_left ( ) ?;
387381 if self . left != self . right {
@@ -410,12 +404,12 @@ impl<'a> Printer<'a> {
410404 }
411405 pub fn advance_left ( & mut self ) -> io:: Result < ( ) > {
412406 debug ! ( "advance_left Vec<{},{}>, sizeof({})={}" , self . left, self . right,
413- self . left, self . size [ self . left] ) ;
407+ self . left, self . buf [ self . left] . size ) ;
414408
415- let mut left_size = self . size [ self . left ] ;
409+ let mut left_size = self . buf [ self . left ] . size ;
416410
417411 while left_size >= 0 {
418- let left = self . token [ self . left ] . clone ( ) ;
412+ let left = self . buf [ self . left ] . token . clone ( ) ;
419413
420414 let len = match left {
421415 Token :: Break ( b) => b. blank_space ,
@@ -437,31 +431,31 @@ impl<'a> Printer<'a> {
437431 self . left += 1 ;
438432 self . left %= self . buf_len ;
439433
440- left_size = self . size [ self . left ] ;
434+ left_size = self . buf [ self . left ] . size ;
441435 }
442436
443437 Ok ( ( ) )
444438 }
445439 pub fn check_stack ( & mut self , k : isize ) {
446440 if !self . scan_stack . is_empty ( ) {
447441 let x = self . scan_top ( ) ;
448- match self . token [ x] {
442+ match self . buf [ x] . token {
449443 Token :: Begin ( _) => {
450444 if k > 0 {
451445 let popped = self . scan_pop ( ) ;
452- self . size [ popped] = self . size [ x] + self . right_total ;
446+ self . buf [ popped] . size = self . buf [ x] . size + self . right_total ;
453447 self . check_stack ( k - 1 ) ;
454448 }
455449 }
456450 Token :: End => {
457451 // paper says + not =, but that makes no sense.
458452 let popped = self . scan_pop ( ) ;
459- self . size [ popped] = 1 ;
453+ self . buf [ popped] . size = 1 ;
460454 self . check_stack ( k + 1 ) ;
461455 }
462456 _ => {
463457 let popped = self . scan_pop ( ) ;
464- self . size [ popped] = self . size [ x] + self . right_total ;
458+ self . buf [ popped] . size = self . buf [ x] . size + self . right_total ;
465459 if k > 0 {
466460 self . check_stack ( k) ;
467461 }
@@ -499,8 +493,7 @@ impl<'a> Printer<'a> {
499493 pub fn print ( & mut self , token : Token , l : isize ) -> io:: Result < ( ) > {
500494 debug ! ( "print {} {} (remaining line space={})" , token, l,
501495 self . space) ;
502- debug ! ( "{}" , buf_str( & self . token,
503- & self . size,
496+ debug ! ( "{}" , buf_str( & self . buf,
504497 self . left,
505498 self . right,
506499 6 ) ) ;
0 commit comments