22
33#![ allow( dead_code) ]
44
5+ use crate :: ring:: RingBuffer ;
56use std:: borrow:: Cow ;
67use std:: collections:: VecDeque ;
78
@@ -68,7 +69,6 @@ pub const SIZE_INFINITY: isize = 0xffff;
6869
6970pub struct Printer {
7071 out : String ,
71- buf_max_len : usize ,
7272 // Width of lines we're constrained to
7373 margin : isize ,
7474 // Number of spaces left on line
@@ -78,7 +78,7 @@ pub struct Printer {
7878 // Index of right side of input stream
7979 right : usize ,
8080 // Ring-buffer of tokens and calculated sizes
81- buf : Vec < BufEntry > ,
81+ buf : RingBuffer < BufEntry > ,
8282 // Running size of stream "...left"
8383 left_total : isize ,
8484 // Running size of stream "...right"
@@ -114,18 +114,15 @@ impl Default for BufEntry {
114114impl Printer {
115115 pub fn new ( ) -> Self {
116116 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 ( ) ;
119119 Printer {
120120 out : String :: new ( ) ,
121- buf_max_len : n,
122121 margin : linewidth as isize ,
123122 space : linewidth as isize ,
124123 left : 0 ,
125124 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,
129126 left_total : 0 ,
130127 right_total : 0 ,
131128 scan_stack : VecDeque :: new ( ) ,
@@ -155,8 +152,8 @@ impl Printer {
155152 if self . scan_stack . is_empty ( ) {
156153 self . left_total = 1 ;
157154 self . right_total = 1 ;
158- self . left = 0 ;
159- self . right = 0 ;
155+ self . right = self . left ;
156+ self . buf . truncate ( 1 ) ;
160157 } else {
161158 self . advance_right ( ) ;
162159 }
@@ -182,8 +179,8 @@ impl Printer {
182179 if self . scan_stack . is_empty ( ) {
183180 self . left_total = 1 ;
184181 self . right_total = 1 ;
185- self . left = 0 ;
186- self . right = 0 ;
182+ self . right = self . left ;
183+ self . buf . truncate ( 1 ) ;
187184 } else {
188185 self . advance_right ( ) ;
189186 }
@@ -242,12 +239,7 @@ impl Printer {
242239
243240 fn advance_right ( & mut self ) {
244241 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 ( ) ;
251243 }
252244
253245 fn advance_left ( & mut self ) {
@@ -274,8 +266,8 @@ impl Printer {
274266 break ;
275267 }
276268
269+ self . buf . advance_left ( ) ;
277270 self . left += 1 ;
278- self . left %= self . buf_max_len ;
279271
280272 left_size = self . buf [ self . left ] . size ;
281273 }
0 commit comments