Skip to content

Commit 4d3faae

Browse files
committed
Eliminate left and right cursors in favor of ring buffer
1 parent cc66a7f commit 4d3faae

File tree

2 files changed

+33
-30
lines changed

2 files changed

+33
-30
lines changed

compiler/rustc_ast_pretty/src/pp.rs

+14-29
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,6 @@ pub struct Printer {
206206
margin: isize,
207207
/// Number of spaces left on line
208208
space: isize,
209-
/// Index of left side of input stream
210-
left: usize,
211-
/// Index of right side of input stream
212-
right: usize,
213209
/// Ring-buffer of tokens and calculated sizes
214210
buf: RingBuffer<BufEntry>,
215211
/// Running size of stream "...left"
@@ -245,8 +241,6 @@ impl Printer {
245241
out: String::new(),
246242
margin: linewidth as isize,
247243
space: linewidth as isize,
248-
left: 0,
249-
right: 0,
250244
buf: RingBuffer::new(),
251245
left_total: 0,
252246
right_total: 0,
@@ -281,45 +275,38 @@ impl Printer {
281275
if self.scan_stack.is_empty() {
282276
self.left_total = 1;
283277
self.right_total = 1;
284-
self.right = self.left;
285278
self.buf.clear();
286-
} else {
287-
self.right += 1;
288279
}
289-
self.buf.push(BufEntry { token: Token::Begin(b), size: -self.right_total });
290-
self.scan_stack.push_front(self.right);
280+
let right = self.buf.push(BufEntry { token: Token::Begin(b), size: -self.right_total });
281+
self.scan_stack.push_front(right);
291282
}
292283

293284
fn scan_end(&mut self) {
294285
if self.scan_stack.is_empty() {
295286
self.print_end();
296287
} else {
297-
self.right += 1;
298-
self.buf.push(BufEntry { token: Token::End, size: -1 });
299-
self.scan_stack.push_front(self.right);
288+
let right = self.buf.push(BufEntry { token: Token::End, size: -1 });
289+
self.scan_stack.push_front(right);
300290
}
301291
}
302292

303293
fn scan_break(&mut self, b: BreakToken) {
304294
if self.scan_stack.is_empty() {
305295
self.left_total = 1;
306296
self.right_total = 1;
307-
self.right = self.left;
308297
self.buf.clear();
309298
} else {
310299
self.check_stack(0);
311-
self.right += 1;
312300
}
313-
self.buf.push(BufEntry { token: Token::Break(b), size: -self.right_total });
314-
self.scan_stack.push_front(self.right);
301+
let right = self.buf.push(BufEntry { token: Token::Break(b), size: -self.right_total });
302+
self.scan_stack.push_front(right);
315303
self.right_total += b.blank_space;
316304
}
317305

318306
fn scan_string(&mut self, s: Cow<'static, str>) {
319307
if self.scan_stack.is_empty() {
320308
self.print_string(&s);
321309
} else {
322-
self.right += 1;
323310
let len = s.len() as isize;
324311
self.buf.push(BufEntry { token: Token::String(s), size: len });
325312
self.right_total += len;
@@ -329,22 +316,22 @@ impl Printer {
329316

330317
fn check_stream(&mut self) {
331318
while self.right_total - self.left_total > self.space {
332-
if self.scan_stack.back() == Some(&self.left) {
319+
if *self.scan_stack.back().unwrap() == self.buf.index_of_first() {
333320
self.scan_stack.pop_back().unwrap();
334-
self.buf[self.left].size = SIZE_INFINITY;
321+
self.buf.first_mut().unwrap().size = SIZE_INFINITY;
335322
}
336323
self.advance_left();
337-
if self.left == self.right {
324+
if self.buf.is_empty() {
338325
break;
339326
}
340327
}
341328
}
342329

343330
fn advance_left(&mut self) {
344-
let mut left_size = self.buf[self.left].size;
331+
let mut left_size = self.buf.first().unwrap().size;
345332

346333
while left_size >= 0 {
347-
let left = self.buf[self.left].token.clone();
334+
let left = self.buf.first().unwrap().token.clone();
348335

349336
let len = match left {
350337
Token::Break(b) => b.blank_space,
@@ -360,14 +347,12 @@ impl Printer {
360347

361348
self.left_total += len;
362349

363-
if self.left == self.right {
350+
self.buf.advance_left();
351+
if self.buf.is_empty() {
364352
break;
365353
}
366354

367-
self.buf.advance_left();
368-
self.left += 1;
369-
370-
left_size = self.buf[self.left].size;
355+
left_size = self.buf.first().unwrap().size;
371356
}
372357
}
373358

compiler/rustc_ast_pretty/src/pp/ring.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@ impl<T> RingBuffer<T> {
2222
RingBuffer { data: VecDeque::new(), offset: 0 }
2323
}
2424

25-
pub fn push(&mut self, value: T) {
25+
pub fn is_empty(&self) -> bool {
26+
self.data.is_empty()
27+
}
28+
29+
pub fn push(&mut self, value: T) -> usize {
30+
let index = self.offset + self.data.len();
2631
self.data.push_back(value);
32+
index
2733
}
2834

2935
pub fn advance_left(&mut self) {
@@ -35,6 +41,18 @@ impl<T> RingBuffer<T> {
3541
self.data.clear();
3642
}
3743

44+
pub fn index_of_first(&self) -> usize {
45+
self.offset
46+
}
47+
48+
pub fn first(&self) -> Option<&T> {
49+
self.data.front()
50+
}
51+
52+
pub fn first_mut(&mut self) -> Option<&mut T> {
53+
self.data.front_mut()
54+
}
55+
3856
pub fn last(&self) -> Option<&T> {
3957
self.data.back()
4058
}

0 commit comments

Comments
 (0)