132
132
//! methods called `Printer::scan_*`, and the 'PRINT' process is the
133
133
//! method called `Printer::print`.
134
134
135
+ mod ring;
136
+
137
+ use ring:: RingBuffer ;
135
138
use std:: borrow:: Cow ;
136
139
use std:: collections:: VecDeque ;
137
140
use std:: fmt;
@@ -190,8 +193,7 @@ impl fmt::Display for Token {
190
193
}
191
194
}
192
195
193
- fn buf_str ( buf : & [ BufEntry ] , left : usize , right : usize , lim : usize ) -> String {
194
- let n = buf. len ( ) ;
196
+ fn buf_str ( buf : & RingBuffer < BufEntry > , left : usize , right : usize , lim : usize ) -> String {
195
197
let mut i = left;
196
198
let mut l = lim;
197
199
let mut s = String :: from ( "[" ) ;
@@ -202,7 +204,6 @@ fn buf_str(buf: &[BufEntry], left: usize, right: usize, lim: usize) -> String {
202
204
}
203
205
s. push_str ( & format ! ( "{}={}" , buf[ i] . size, & buf[ i] . token) ) ;
204
206
i += 1 ;
205
- i %= n;
206
207
}
207
208
s. push ( ']' ) ;
208
209
s
@@ -224,7 +225,6 @@ const SIZE_INFINITY: isize = 0xffff;
224
225
225
226
pub struct Printer {
226
227
out : String ,
227
- buf_max_len : usize ,
228
228
/// Width of lines we're constrained to
229
229
margin : isize ,
230
230
/// Number of spaces left on line
@@ -234,7 +234,7 @@ pub struct Printer {
234
234
/// Index of right side of input stream
235
235
right : usize ,
236
236
/// Ring-buffer of tokens and calculated sizes
237
- buf : Vec < BufEntry > ,
237
+ buf : RingBuffer < BufEntry > ,
238
238
/// Running size of stream "...left"
239
239
left_total : isize ,
240
240
/// Running size of stream "...right"
@@ -267,19 +267,16 @@ impl Default for BufEntry {
267
267
impl Printer {
268
268
pub fn new ( ) -> Self {
269
269
let linewidth = 78 ;
270
- // Yes 55, it makes the ring buffers big enough to never fall behind.
271
- let n: usize = 55 * linewidth;
272
270
debug ! ( "Printer::new {}" , linewidth) ;
271
+ let mut buf = RingBuffer :: new ( ) ;
272
+ buf. advance_right ( ) ;
273
273
Printer {
274
274
out : String :: new ( ) ,
275
- buf_max_len : n,
276
275
margin : linewidth as isize ,
277
276
space : linewidth as isize ,
278
277
left : 0 ,
279
278
right : 0 ,
280
- // Initialize a single entry; advance_right() will extend it on demand
281
- // up to `buf_max_len` elements.
282
- buf : vec ! [ BufEntry :: default ( ) ] ,
279
+ buf,
283
280
left_total : 0 ,
284
281
right_total : 0 ,
285
282
scan_stack : VecDeque :: new ( ) ,
@@ -308,8 +305,8 @@ impl Printer {
308
305
if self . scan_stack . is_empty ( ) {
309
306
self . left_total = 1 ;
310
307
self . right_total = 1 ;
311
- self . left = 0 ;
312
- self . right = 0 ;
308
+ self . right = self . left ;
309
+ self . buf . truncate ( 1 ) ;
313
310
} else {
314
311
self . advance_right ( ) ;
315
312
}
@@ -332,8 +329,8 @@ impl Printer {
332
329
if self . scan_stack . is_empty ( ) {
333
330
self . left_total = 1 ;
334
331
self . right_total = 1 ;
335
- self . left = 0 ;
336
- self . right = 0 ;
332
+ self . right = self . left ;
333
+ self . buf . truncate ( 1 ) ;
337
334
} else {
338
335
self . advance_right ( ) ;
339
336
}
@@ -400,12 +397,7 @@ impl Printer {
400
397
401
398
fn advance_right ( & mut self ) {
402
399
self . right += 1 ;
403
- self . right %= self . buf_max_len ;
404
- // Extend the buf if necessary.
405
- if self . right == self . buf . len ( ) {
406
- self . buf . push ( BufEntry :: default ( ) ) ;
407
- }
408
- assert_ne ! ( self . right, self . left) ;
400
+ self . buf . advance_right ( ) ;
409
401
}
410
402
411
403
fn advance_left ( & mut self ) {
@@ -437,8 +429,8 @@ impl Printer {
437
429
break ;
438
430
}
439
431
432
+ self . buf . advance_left ( ) ;
440
433
self . left += 1 ;
441
- self . left %= self . buf_max_len ;
442
434
443
435
left_size = self . buf [ self . left ] . size ;
444
436
}
0 commit comments