@@ -125,9 +125,8 @@ impl fmt::Display for Token {
125
125
}
126
126
}
127
127
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 ( ) ;
131
130
let mut i = left;
132
131
let mut l = lim;
133
132
let mut s = String :: from ( "[" ) ;
@@ -136,7 +135,7 @@ fn buf_str(toks: &[Token], szs: &[isize], left: usize, right: usize, lim: usize)
136
135
if i != left {
137
136
s. push_str ( ", " ) ;
138
137
}
139
- s. push_str ( & format ! ( "{}={}" , szs [ i] , & toks [ i] ) ) ;
138
+ s. push_str ( & format ! ( "{}={}" , buf [ i] . size , & buf [ i] . token ) ) ;
140
139
i += 1 ;
141
140
i %= n;
142
141
}
@@ -159,25 +158,20 @@ pub struct PrintStackElem {
159
158
const SIZE_INFINITY : isize = 0xffff ;
160
159
161
160
pub 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.
164
162
let n: usize = 55 * linewidth;
165
163
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) ;
169
164
Printer {
170
165
out : out,
171
166
buf_len : n,
172
167
margin : linewidth as isize ,
173
168
space : linewidth as isize ,
174
169
left : 0 ,
175
170
right : 0 ,
176
- token : token,
177
- size : size,
171
+ buf : vec ! [ BufEntry { token: Token :: Eof , size: 0 } ; n] ,
178
172
left_total : 0 ,
179
173
right_total : 0 ,
180
- scan_stack : scan_stack ,
174
+ scan_stack : VecDeque :: new ( ) ,
181
175
print_stack : Vec :: new ( ) ,
182
176
pending_indentation : 0
183
177
}
@@ -269,10 +263,8 @@ pub struct Printer<'a> {
269
263
left : usize ,
270
264
/// Index of right side of input stream
271
265
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 > ,
276
268
/// Running size of stream "...left"
277
269
left_total : isize ,
278
270
/// Running size of stream "...right"
@@ -283,20 +275,26 @@ pub struct Printer<'a> {
283
275
/// Begin (if there is any) on top of it. Stuff is flushed off the
284
276
/// bottom as it becomes irrelevant due to the primary ring-buffer
285
277
/// advancing.
286
- scan_stack : VecDeque < usize > ,
278
+ scan_stack : VecDeque < usize > ,
287
279
/// Stack of blocks-in-progress being flushed by print
288
280
print_stack : Vec < PrintStackElem > ,
289
281
/// Buffered indentation to avoid writing trailing whitespace
290
282
pending_indentation : isize ,
291
283
}
292
284
285
+ #[ derive( Clone ) ]
286
+ struct BufEntry {
287
+ token : Token ,
288
+ size : isize ,
289
+ }
290
+
293
291
impl < ' a > Printer < ' a > {
294
292
pub fn last_token ( & mut self ) -> Token {
295
- self . token [ self . right ] . clone ( )
293
+ self . buf [ self . right ] . token . clone ( )
296
294
}
297
295
// be very careful with this!
298
296
pub fn replace_last_token ( & mut self , t : Token ) {
299
- self . token [ self . right ] = t;
297
+ self . buf [ self . right ] . token = t;
300
298
}
301
299
pub fn pretty_print ( & mut self , token : Token ) -> io:: Result < ( ) > {
302
300
debug ! ( "pp Vec<{},{}>" , self . left, self . right) ;
@@ -318,8 +316,7 @@ impl<'a> Printer<'a> {
318
316
} else { self . advance_right ( ) ; }
319
317
debug ! ( "pp Begin({})/buffer Vec<{},{}>" ,
320
318
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 } ;
323
320
let right = self . right ;
324
321
self . scan_push ( right) ;
325
322
Ok ( ( ) )
@@ -331,8 +328,7 @@ impl<'a> Printer<'a> {
331
328
} else {
332
329
debug ! ( "pp End/buffer Vec<{},{}>" , self . left, self . right) ;
333
330
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 } ;
336
332
let right = self . right ;
337
333
self . scan_push ( right) ;
338
334
Ok ( ( ) )
@@ -350,8 +346,7 @@ impl<'a> Printer<'a> {
350
346
self . check_stack ( 0 ) ;
351
347
let right = self . right ;
352
348
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 } ;
355
350
self . right_total += b. blank_space ;
356
351
Ok ( ( ) )
357
352
}
@@ -364,8 +359,7 @@ impl<'a> Printer<'a> {
364
359
debug ! ( "pp String('{}')/buffer Vec<{},{}>" ,
365
360
s, self . left, self . right) ;
366
361
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 } ;
369
363
self . right_total += len;
370
364
self . check_stream ( )
371
365
}
@@ -381,7 +375,7 @@ impl<'a> Printer<'a> {
381
375
if Some ( & self . left ) == self . scan_stack . back ( ) {
382
376
debug ! ( "setting {} to infinity and popping" , self . left) ;
383
377
let scanned = self . scan_pop_bottom ( ) ;
384
- self . size [ scanned] = SIZE_INFINITY ;
378
+ self . buf [ scanned] . size = SIZE_INFINITY ;
385
379
}
386
380
self . advance_left ( ) ?;
387
381
if self . left != self . right {
@@ -410,12 +404,12 @@ impl<'a> Printer<'a> {
410
404
}
411
405
pub fn advance_left ( & mut self ) -> io:: Result < ( ) > {
412
406
debug ! ( "advance_left Vec<{},{}>, sizeof({})={}" , self . left, self . right,
413
- self . left, self . size [ self . left] ) ;
407
+ self . left, self . buf [ self . left] . size ) ;
414
408
415
- let mut left_size = self . size [ self . left ] ;
409
+ let mut left_size = self . buf [ self . left ] . size ;
416
410
417
411
while left_size >= 0 {
418
- let left = self . token [ self . left ] . clone ( ) ;
412
+ let left = self . buf [ self . left ] . token . clone ( ) ;
419
413
420
414
let len = match left {
421
415
Token :: Break ( b) => b. blank_space ,
@@ -437,31 +431,31 @@ impl<'a> Printer<'a> {
437
431
self . left += 1 ;
438
432
self . left %= self . buf_len ;
439
433
440
- left_size = self . size [ self . left ] ;
434
+ left_size = self . buf [ self . left ] . size ;
441
435
}
442
436
443
437
Ok ( ( ) )
444
438
}
445
439
pub fn check_stack ( & mut self , k : isize ) {
446
440
if !self . scan_stack . is_empty ( ) {
447
441
let x = self . scan_top ( ) ;
448
- match self . token [ x] {
442
+ match self . buf [ x] . token {
449
443
Token :: Begin ( _) => {
450
444
if k > 0 {
451
445
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 ;
453
447
self . check_stack ( k - 1 ) ;
454
448
}
455
449
}
456
450
Token :: End => {
457
451
// paper says + not =, but that makes no sense.
458
452
let popped = self . scan_pop ( ) ;
459
- self . size [ popped] = 1 ;
453
+ self . buf [ popped] . size = 1 ;
460
454
self . check_stack ( k + 1 ) ;
461
455
}
462
456
_ => {
463
457
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 ;
465
459
if k > 0 {
466
460
self . check_stack ( k) ;
467
461
}
@@ -499,8 +493,7 @@ impl<'a> Printer<'a> {
499
493
pub fn print ( & mut self , token : Token , l : isize ) -> io:: Result < ( ) > {
500
494
debug ! ( "print {} {} (remaining line space={})" , token, l,
501
495
self . space) ;
502
- debug ! ( "{}" , buf_str( & self . token,
503
- & self . size,
496
+ debug ! ( "{}" , buf_str( & self . buf,
504
497
self . left,
505
498
self . right,
506
499
6 ) ) ;
0 commit comments