@@ -54,10 +54,6 @@ pub struct Printer {
54
54
margin : isize ,
55
55
// Number of spaces left on line
56
56
space : isize ,
57
- // Index of left side of input stream
58
- left : usize ,
59
- // Index of right side of input stream
60
- right : usize ,
61
57
// Ring-buffer of tokens and calculated sizes
62
58
buf : RingBuffer < BufEntry > ,
63
59
// Running size of stream "...left"
@@ -89,8 +85,6 @@ impl Printer {
89
85
out : String :: new ( ) ,
90
86
margin : linewidth as isize ,
91
87
space : linewidth as isize ,
92
- left : 0 ,
93
- right : 0 ,
94
88
buf : RingBuffer :: new ( ) ,
95
89
left_total : 0 ,
96
90
right_total : 0 ,
@@ -112,54 +106,47 @@ impl Printer {
112
106
if self . scan_stack . is_empty ( ) {
113
107
self . left_total = 1 ;
114
108
self . right_total = 1 ;
115
- self . right = self . left ;
116
109
self . buf . clear ( ) ;
117
- } else {
118
- self . right += 1 ;
119
110
}
120
- self . buf . push ( BufEntry {
111
+ let right = self . buf . push ( BufEntry {
121
112
token : Token :: Begin ( b) ,
122
113
size : -self . right_total ,
123
114
} ) ;
124
- self . scan_stack . push_back ( self . right ) ;
115
+ self . scan_stack . push_back ( right) ;
125
116
}
126
117
127
118
pub fn scan_end ( & mut self ) {
128
119
if self . scan_stack . is_empty ( ) {
129
120
self . print_end ( ) ;
130
121
} else {
131
- self . right += 1 ;
132
- self . buf . push ( BufEntry {
122
+ let right = self . buf . push ( BufEntry {
133
123
token : Token :: End ,
134
124
size : -1 ,
135
125
} ) ;
136
- self . scan_stack . push_back ( self . right ) ;
126
+ self . scan_stack . push_back ( right) ;
137
127
}
138
128
}
139
129
140
130
pub fn scan_break ( & mut self , b : BreakToken ) {
141
131
if self . scan_stack . is_empty ( ) {
142
132
self . left_total = 1 ;
143
133
self . right_total = 1 ;
144
- self . right = self . left ;
145
134
self . buf . clear ( ) ;
146
135
} else {
147
136
self . check_stack ( 0 ) ;
148
- self . right += 1 ;
149
137
}
150
- self . buf . push ( BufEntry {
138
+ let right = self . buf . push ( BufEntry {
151
139
token : Token :: Break ( b) ,
152
140
size : -self . right_total ,
153
141
} ) ;
154
- self . scan_stack . push_back ( self . right ) ;
142
+ self . scan_stack . push_back ( right) ;
155
143
self . right_total += b. blank_space ;
156
144
}
157
145
158
146
pub fn scan_string ( & mut self , s : Cow < ' static , str > ) {
159
147
if self . scan_stack . is_empty ( ) {
160
148
self . print_string ( s) ;
161
149
} else {
162
- self . right += 1 ;
163
150
let len = s. len ( ) as isize ;
164
151
self . buf . push ( BufEntry {
165
152
token : Token :: String ( s) ,
@@ -172,22 +159,19 @@ impl Printer {
172
159
173
160
fn check_stream ( & mut self ) {
174
161
while self . right_total - self . left_total > self . space {
175
- if self . scan_stack . front ( ) == Some ( & self . left ) {
162
+ if * self . scan_stack . front ( ) . unwrap ( ) == self . buf . index_of_first ( ) {
176
163
self . scan_stack . pop_front ( ) . unwrap ( ) ;
177
- self . buf [ self . left ] . size = SIZE_INFINITY ;
164
+ self . buf . first_mut ( ) . size = SIZE_INFINITY ;
178
165
}
179
166
self . advance_left ( ) ;
180
- if self . left == self . right {
181
- break ;
182
- }
183
167
}
184
168
}
185
169
186
170
fn advance_left ( & mut self ) {
187
- let mut left_size = self . buf [ self . left ] . size ;
171
+ let mut left_size = self . buf . first ( ) . size ;
188
172
189
173
while left_size >= 0 {
190
- let left = self . buf [ self . left ] . token . clone ( ) ;
174
+ let left = self . buf . first ( ) . token . clone ( ) ;
191
175
192
176
let len = match left {
193
177
Token :: Break ( b) => b. blank_space ,
@@ -203,14 +187,12 @@ impl Printer {
203
187
204
188
self . left_total += len;
205
189
206
- if self . left == self . right {
190
+ self . buf . advance_left ( ) ;
191
+ if self . buf . is_empty ( ) {
207
192
break ;
208
193
}
209
194
210
- self . buf . advance_left ( ) ;
211
- self . left += 1 ;
212
-
213
- left_size = self . buf [ self . left ] . size ;
195
+ left_size = self . buf . first ( ) . size ;
214
196
}
215
197
}
216
198
0 commit comments