2
2
3
3
#![ allow( dead_code) ]
4
4
5
+ use crate :: ring:: RingBuffer ;
5
6
use std:: borrow:: Cow ;
6
7
use std:: collections:: VecDeque ;
7
8
@@ -68,7 +69,6 @@ pub const SIZE_INFINITY: isize = 0xffff;
68
69
69
70
pub struct Printer {
70
71
out : String ,
71
- buf_max_len : usize ,
72
72
// Width of lines we're constrained to
73
73
margin : isize ,
74
74
// Number of spaces left on line
@@ -78,7 +78,7 @@ pub struct Printer {
78
78
// Index of right side of input stream
79
79
right : usize ,
80
80
// Ring-buffer of tokens and calculated sizes
81
- buf : Vec < BufEntry > ,
81
+ buf : RingBuffer < BufEntry > ,
82
82
// Running size of stream "...left"
83
83
left_total : isize ,
84
84
// Running size of stream "...right"
@@ -114,18 +114,15 @@ impl Default for BufEntry {
114
114
impl Printer {
115
115
pub fn new ( ) -> Self {
116
116
let linewidth = 78 ;
117
- // Yes 55, it makes the ring buffers big enough to never fall behind.
118
- let n : usize = 55 * linewidth ;
117
+ let mut buf = RingBuffer :: new ( ) ;
118
+ buf . advance_right ( ) ;
119
119
Printer {
120
120
out : String :: new ( ) ,
121
- buf_max_len : n,
122
121
margin : linewidth as isize ,
123
122
space : linewidth as isize ,
124
123
left : 0 ,
125
124
right : 0 ,
126
- // Initialize a single entry; advance_right() will extend it on
127
- // demand up to `buf_max_len` elements.
128
- buf : vec ! [ BufEntry :: default ( ) ] ,
125
+ buf,
129
126
left_total : 0 ,
130
127
right_total : 0 ,
131
128
scan_stack : VecDeque :: new ( ) ,
@@ -155,8 +152,8 @@ impl Printer {
155
152
if self . scan_stack . is_empty ( ) {
156
153
self . left_total = 1 ;
157
154
self . right_total = 1 ;
158
- self . left = 0 ;
159
- self . right = 0 ;
155
+ self . right = self . left ;
156
+ self . buf . truncate ( 1 ) ;
160
157
} else {
161
158
self . advance_right ( ) ;
162
159
}
@@ -182,8 +179,8 @@ impl Printer {
182
179
if self . scan_stack . is_empty ( ) {
183
180
self . left_total = 1 ;
184
181
self . right_total = 1 ;
185
- self . left = 0 ;
186
- self . right = 0 ;
182
+ self . right = self . left ;
183
+ self . buf . truncate ( 1 ) ;
187
184
} else {
188
185
self . advance_right ( ) ;
189
186
}
@@ -242,12 +239,7 @@ impl Printer {
242
239
243
240
fn advance_right ( & mut self ) {
244
241
self . right += 1 ;
245
- self . right %= self . buf_max_len ;
246
- // Extend the buf if necessary.
247
- if self . right == self . buf . len ( ) {
248
- self . buf . push ( BufEntry :: default ( ) ) ;
249
- }
250
- assert_ne ! ( self . right, self . left) ;
242
+ self . buf . advance_right ( ) ;
251
243
}
252
244
253
245
fn advance_left ( & mut self ) {
@@ -274,8 +266,8 @@ impl Printer {
274
266
break ;
275
267
}
276
268
269
+ self . buf . advance_left ( ) ;
277
270
self . left += 1 ;
278
- self . left %= self . buf_max_len ;
279
271
280
272
left_size = self . buf [ self . left ] . size ;
281
273
}
0 commit comments