@@ -137,7 +137,7 @@ mod ring;
137
137
use ring:: RingBuffer ;
138
138
use std:: borrow:: Cow ;
139
139
use std:: collections:: VecDeque ;
140
- use std:: fmt ;
140
+ use std:: iter ;
141
141
142
142
/// How to break. Described in more detail in the module docs.
143
143
#[ derive( Clone , Copy , PartialEq ) ]
@@ -175,27 +175,10 @@ impl Token {
175
175
}
176
176
}
177
177
178
- impl fmt:: Display for Token {
179
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
180
- match * self {
181
- Token :: String ( ref s) => write ! ( f, "STR({},{})" , s, s. len( ) ) ,
182
- Token :: Break ( _) => f. write_str ( "BREAK" ) ,
183
- Token :: Begin ( _) => f. write_str ( "BEGIN" ) ,
184
- Token :: End => f. write_str ( "END" ) ,
185
- }
186
- }
187
- }
188
-
189
178
#[ derive( Copy , Clone ) ]
190
- enum PrintStackBreak {
179
+ enum PrintFrame {
191
180
Fits ,
192
- Broken ( Breaks ) ,
193
- }
194
-
195
- #[ derive( Copy , Clone ) ]
196
- struct PrintStackElem {
197
- offset : isize ,
198
- pbreak : PrintStackBreak ,
181
+ Broken { offset : isize , breaks : Breaks } ,
199
182
}
200
183
201
184
const SIZE_INFINITY : isize = 0xffff ;
@@ -220,7 +203,7 @@ pub struct Printer {
220
203
/// advancing.
221
204
scan_stack : VecDeque < usize > ,
222
205
/// Stack of blocks-in-progress being flushed by print
223
- print_stack : Vec < PrintStackElem > ,
206
+ print_stack : Vec < PrintFrame > ,
224
207
/// Buffered indentation to avoid writing trailing whitespace
225
208
pending_indentation : isize ,
226
209
/// The token most recently popped from the left boundary of the
@@ -260,8 +243,8 @@ impl Printer {
260
243
}
261
244
262
245
/// Be very careful with this!
263
- pub fn replace_last_token_still_buffered ( & mut self , t : Token ) {
264
- self . buf . last_mut ( ) . unwrap ( ) . token = t ;
246
+ pub fn replace_last_token_still_buffered ( & mut self , token : Token ) {
247
+ self . buf . last_mut ( ) . unwrap ( ) . token = token ;
265
248
}
266
249
267
250
fn scan_eof ( & mut self ) {
@@ -271,53 +254,53 @@ impl Printer {
271
254
}
272
255
}
273
256
274
- fn scan_begin ( & mut self , b : BeginToken ) {
257
+ fn scan_begin ( & mut self , token : BeginToken ) {
275
258
if self . scan_stack . is_empty ( ) {
276
259
self . left_total = 1 ;
277
260
self . right_total = 1 ;
278
261
self . buf . clear ( ) ;
279
262
}
280
- let right = self . buf . push ( BufEntry { token : Token :: Begin ( b ) , size : -self . right_total } ) ;
281
- self . scan_stack . push_front ( right) ;
263
+ let right = self . buf . push ( BufEntry { token : Token :: Begin ( token ) , size : -self . right_total } ) ;
264
+ self . scan_stack . push_back ( right) ;
282
265
}
283
266
284
267
fn scan_end ( & mut self ) {
285
268
if self . scan_stack . is_empty ( ) {
286
269
self . print_end ( ) ;
287
270
} else {
288
271
let right = self . buf . push ( BufEntry { token : Token :: End , size : -1 } ) ;
289
- self . scan_stack . push_front ( right) ;
272
+ self . scan_stack . push_back ( right) ;
290
273
}
291
274
}
292
275
293
- fn scan_break ( & mut self , b : BreakToken ) {
276
+ fn scan_break ( & mut self , token : BreakToken ) {
294
277
if self . scan_stack . is_empty ( ) {
295
278
self . left_total = 1 ;
296
279
self . right_total = 1 ;
297
280
self . buf . clear ( ) ;
298
281
} else {
299
282
self . check_stack ( 0 ) ;
300
283
}
301
- let right = self . buf . push ( BufEntry { token : Token :: Break ( b ) , size : -self . right_total } ) ;
302
- self . scan_stack . push_front ( right) ;
303
- self . right_total += b . blank_space ;
284
+ let right = self . buf . push ( BufEntry { token : Token :: Break ( token ) , size : -self . right_total } ) ;
285
+ self . scan_stack . push_back ( right) ;
286
+ self . right_total += token . blank_space ;
304
287
}
305
288
306
- fn scan_string ( & mut self , s : Cow < ' static , str > ) {
289
+ fn scan_string ( & mut self , string : Cow < ' static , str > ) {
307
290
if self . scan_stack . is_empty ( ) {
308
- self . print_string ( & s ) ;
291
+ self . print_string ( & string ) ;
309
292
} else {
310
- let len = s . len ( ) as isize ;
311
- self . buf . push ( BufEntry { token : Token :: String ( s ) , size : len } ) ;
293
+ let len = string . len ( ) as isize ;
294
+ self . buf . push ( BufEntry { token : Token :: String ( string ) , size : len } ) ;
312
295
self . right_total += len;
313
296
self . check_stream ( ) ;
314
297
}
315
298
}
316
299
317
300
fn check_stream ( & mut self ) {
318
301
while self . right_total - self . left_total > self . space {
319
- if * self . scan_stack . back ( ) . unwrap ( ) == self . buf . index_of_first ( ) {
320
- self . scan_stack . pop_back ( ) . unwrap ( ) ;
302
+ if * self . scan_stack . front ( ) . unwrap ( ) == self . buf . index_of_first ( ) {
303
+ self . scan_stack . pop_front ( ) . unwrap ( ) ;
321
304
self . buf . first_mut ( ) . unwrap ( ) . size = SIZE_INFINITY ;
322
305
}
323
306
self . advance_left ( ) ;
@@ -328,152 +311,118 @@ impl Printer {
328
311
}
329
312
330
313
fn advance_left ( & mut self ) {
331
- let mut left_size = self . buf . first ( ) . unwrap ( ) . size ;
332
-
333
- while left_size >= 0 {
334
- let left = self . buf . first ( ) . unwrap ( ) . token . clone ( ) ;
314
+ while self . buf . first ( ) . unwrap ( ) . size >= 0 {
315
+ let left = self . buf . pop_first ( ) . unwrap ( ) ;
335
316
336
- let len = match left {
337
- Token :: Break ( b) => b. blank_space ,
338
- Token :: String ( ref s) => {
339
- let len = s. len ( ) as isize ;
340
- assert_eq ! ( len, left_size) ;
341
- len
317
+ match & left. token {
318
+ Token :: String ( string) => {
319
+ self . left_total += string. len ( ) as isize ;
320
+ self . print_string ( string) ;
342
321
}
343
- _ => 0 ,
344
- } ;
345
-
346
- self . print ( left, left_size) ;
322
+ Token :: Break ( token) => {
323
+ self . left_total += token. blank_space ;
324
+ self . print_break ( * token, left. size ) ;
325
+ }
326
+ Token :: Begin ( token) => self . print_begin ( * token, left. size ) ,
327
+ Token :: End => self . print_end ( ) ,
328
+ }
347
329
348
- self . left_total += len ;
330
+ self . last_printed = Some ( left . token ) ;
349
331
350
- self . buf . advance_left ( ) ;
351
332
if self . buf . is_empty ( ) {
352
333
break ;
353
334
}
354
-
355
- left_size = self . buf . first ( ) . unwrap ( ) . size ;
356
335
}
357
336
}
358
337
359
- fn check_stack ( & mut self , mut k : usize ) {
360
- while let Some ( & x ) = self . scan_stack . front ( ) {
361
- let mut entry = & mut self . buf [ x ] ;
338
+ fn check_stack ( & mut self , mut depth : usize ) {
339
+ while let Some ( & index ) = self . scan_stack . back ( ) {
340
+ let mut entry = & mut self . buf [ index ] ;
362
341
match entry. token {
363
342
Token :: Begin ( _) => {
364
- if k == 0 {
343
+ if depth == 0 {
365
344
break ;
366
345
}
367
- self . scan_stack . pop_front ( ) . unwrap ( ) ;
346
+ self . scan_stack . pop_back ( ) . unwrap ( ) ;
368
347
entry. size += self . right_total ;
369
- k -= 1 ;
348
+ depth -= 1 ;
370
349
}
371
350
Token :: End => {
372
351
// paper says + not =, but that makes no sense.
373
- self . scan_stack . pop_front ( ) . unwrap ( ) ;
352
+ self . scan_stack . pop_back ( ) . unwrap ( ) ;
374
353
entry. size = 1 ;
375
- k += 1 ;
354
+ depth += 1 ;
376
355
}
377
356
_ => {
378
- self . scan_stack . pop_front ( ) . unwrap ( ) ;
357
+ self . scan_stack . pop_back ( ) . unwrap ( ) ;
379
358
entry. size += self . right_total ;
380
- if k == 0 {
359
+ if depth == 0 {
381
360
break ;
382
361
}
383
362
}
384
363
}
385
364
}
386
365
}
387
366
388
- fn print_newline ( & mut self , amount : isize ) {
389
- self . out . push ( '\n' ) ;
390
- self . pending_indentation = 0 ;
391
- self . indent ( amount) ;
392
- }
393
-
394
- fn indent ( & mut self , amount : isize ) {
395
- self . pending_indentation += amount;
367
+ fn get_top ( & self ) -> PrintFrame {
368
+ * self
369
+ . print_stack
370
+ . last ( )
371
+ . unwrap_or ( & PrintFrame :: Broken { offset : 0 , breaks : Breaks :: Inconsistent } )
396
372
}
397
373
398
- fn get_top ( & self ) -> PrintStackElem {
399
- * self . print_stack . last ( ) . unwrap_or ( {
400
- & PrintStackElem { offset : 0 , pbreak : PrintStackBreak :: Broken ( Breaks :: Inconsistent ) }
401
- } )
402
- }
403
-
404
- fn print_begin ( & mut self , b : BeginToken , l : isize ) {
405
- if l > self . space {
406
- let col = self . margin - self . space + b. offset ;
407
- self . print_stack
408
- . push ( PrintStackElem { offset : col, pbreak : PrintStackBreak :: Broken ( b. breaks ) } ) ;
374
+ fn print_begin ( & mut self , token : BeginToken , size : isize ) {
375
+ if size > self . space {
376
+ let col = self . margin - self . space + token. offset ;
377
+ self . print_stack . push ( PrintFrame :: Broken { offset : col, breaks : token. breaks } ) ;
409
378
} else {
410
- self . print_stack . push ( PrintStackElem { offset : 0 , pbreak : PrintStackBreak :: Fits } ) ;
379
+ self . print_stack . push ( PrintFrame :: Fits ) ;
411
380
}
412
381
}
413
382
414
383
fn print_end ( & mut self ) {
415
384
self . print_stack . pop ( ) . unwrap ( ) ;
416
385
}
417
386
418
- fn print_break ( & mut self , b : BreakToken , l : isize ) {
419
- let top = self . get_top ( ) ;
420
- match top. pbreak {
421
- PrintStackBreak :: Fits => {
422
- self . space -= b. blank_space ;
423
- self . indent ( b. blank_space ) ;
424
- }
425
- PrintStackBreak :: Broken ( Breaks :: Consistent ) => {
426
- self . print_newline ( top. offset + b. offset ) ;
427
- self . space = self . margin - ( top. offset + b. offset ) ;
428
- }
429
- PrintStackBreak :: Broken ( Breaks :: Inconsistent ) => {
430
- if l > self . space {
431
- self . print_newline ( top. offset + b. offset ) ;
432
- self . space = self . margin - ( top. offset + b. offset ) ;
433
- } else {
434
- self . indent ( b. blank_space ) ;
435
- self . space -= b. blank_space ;
387
+ fn print_break ( & mut self , token : BreakToken , size : isize ) {
388
+ let break_offset =
389
+ match self . get_top ( ) {
390
+ PrintFrame :: Fits => None ,
391
+ PrintFrame :: Broken { offset, breaks : Breaks :: Consistent } => Some ( offset) ,
392
+ PrintFrame :: Broken { offset, breaks : Breaks :: Inconsistent } => {
393
+ if size > self . space { Some ( offset) } else { None }
436
394
}
437
- }
395
+ } ;
396
+ if let Some ( offset) = break_offset {
397
+ self . out . push ( '\n' ) ;
398
+ self . pending_indentation = offset + token. offset ;
399
+ self . space = self . margin - ( offset + token. offset ) ;
400
+ } else {
401
+ self . pending_indentation += token. blank_space ;
402
+ self . space -= token. blank_space ;
438
403
}
439
404
}
440
405
441
- fn print_string ( & mut self , s : & str ) {
442
- let len = s. len ( ) as isize ;
443
- // assert!(len <= space);
444
- self . space -= len;
445
-
406
+ fn print_string ( & mut self , string : & str ) {
446
407
// Write the pending indent. A more concise way of doing this would be:
447
408
//
448
409
// write!(self.out, "{: >n$}", "", n = self.pending_indentation as usize)?;
449
410
//
450
411
// But that is significantly slower. This code is sufficiently hot, and indents can get
451
412
// sufficiently large, that the difference is significant on some workloads.
452
413
self . out . reserve ( self . pending_indentation as usize ) ;
453
- self . out . extend ( std :: iter:: repeat ( ' ' ) . take ( self . pending_indentation as usize ) ) ;
414
+ self . out . extend ( iter:: repeat ( ' ' ) . take ( self . pending_indentation as usize ) ) ;
454
415
self . pending_indentation = 0 ;
455
- self . out . push_str ( s) ;
456
- }
457
416
458
- fn print ( & mut self , token : Token , l : isize ) {
459
- match & token {
460
- Token :: Begin ( b) => self . print_begin ( * b, l) ,
461
- Token :: End => self . print_end ( ) ,
462
- Token :: Break ( b) => self . print_break ( * b, l) ,
463
- Token :: String ( s) => {
464
- let len = s. len ( ) as isize ;
465
- assert_eq ! ( len, l) ;
466
- self . print_string ( s) ;
467
- }
468
- }
469
- self . last_printed = Some ( token) ;
417
+ self . out . push_str ( string) ;
418
+ self . space -= string. len ( ) as isize ;
470
419
}
471
420
472
421
// Convenience functions to talk to the printer.
473
422
474
423
/// "raw box"
475
- pub fn rbox ( & mut self , indent : usize , b : Breaks ) {
476
- self . scan_begin ( BeginToken { offset : indent as isize , breaks : b } )
424
+ pub fn rbox ( & mut self , indent : usize , breaks : Breaks ) {
425
+ self . scan_begin ( BeginToken { offset : indent as isize , breaks } )
477
426
}
478
427
479
428
/// Inconsistent breaking box
@@ -500,8 +449,8 @@ impl Printer {
500
449
}
501
450
502
451
pub fn word < S : Into < Cow < ' static , str > > > ( & mut self , wrd : S ) {
503
- let s = wrd. into ( ) ;
504
- self . scan_string ( s )
452
+ let string = wrd. into ( ) ;
453
+ self . scan_string ( string )
505
454
}
506
455
507
456
fn spaces ( & mut self , n : usize ) {
0 commit comments