Skip to content

Commit 4427ced

Browse files
committed
Eliminate left and right cursors in favor of ring buffer
1 parent fcb5968 commit 4427ced

File tree

2 files changed

+32
-32
lines changed

2 files changed

+32
-32
lines changed

src/algorithm.rs

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,6 @@ pub struct Printer {
5454
margin: isize,
5555
// Number of spaces left on line
5656
space: isize,
57-
// Index of left side of input stream
58-
left: usize,
59-
// Index of right side of input stream
60-
right: usize,
6157
// Ring-buffer of tokens and calculated sizes
6258
buf: RingBuffer<BufEntry>,
6359
// Running size of stream "...left"
@@ -89,8 +85,6 @@ impl Printer {
8985
out: String::new(),
9086
margin: linewidth as isize,
9187
space: linewidth as isize,
92-
left: 0,
93-
right: 0,
9488
buf: RingBuffer::new(),
9589
left_total: 0,
9690
right_total: 0,
@@ -112,54 +106,47 @@ impl Printer {
112106
if self.scan_stack.is_empty() {
113107
self.left_total = 1;
114108
self.right_total = 1;
115-
self.right = self.left;
116109
self.buf.clear();
117-
} else {
118-
self.right += 1;
119110
}
120-
self.buf.push(BufEntry {
111+
let right = self.buf.push(BufEntry {
121112
token: Token::Begin(b),
122113
size: -self.right_total,
123114
});
124-
self.scan_stack.push_back(self.right);
115+
self.scan_stack.push_back(right);
125116
}
126117

127118
pub fn scan_end(&mut self) {
128119
if self.scan_stack.is_empty() {
129120
self.print_end();
130121
} else {
131-
self.right += 1;
132-
self.buf.push(BufEntry {
122+
let right = self.buf.push(BufEntry {
133123
token: Token::End,
134124
size: -1,
135125
});
136-
self.scan_stack.push_back(self.right);
126+
self.scan_stack.push_back(right);
137127
}
138128
}
139129

140130
pub fn scan_break(&mut self, b: BreakToken) {
141131
if self.scan_stack.is_empty() {
142132
self.left_total = 1;
143133
self.right_total = 1;
144-
self.right = self.left;
145134
self.buf.clear();
146135
} else {
147136
self.check_stack(0);
148-
self.right += 1;
149137
}
150-
self.buf.push(BufEntry {
138+
let right = self.buf.push(BufEntry {
151139
token: Token::Break(b),
152140
size: -self.right_total,
153141
});
154-
self.scan_stack.push_back(self.right);
142+
self.scan_stack.push_back(right);
155143
self.right_total += b.blank_space;
156144
}
157145

158146
pub fn scan_string(&mut self, s: Cow<'static, str>) {
159147
if self.scan_stack.is_empty() {
160148
self.print_string(s);
161149
} else {
162-
self.right += 1;
163150
let len = s.len() as isize;
164151
self.buf.push(BufEntry {
165152
token: Token::String(s),
@@ -172,22 +159,19 @@ impl Printer {
172159

173160
fn check_stream(&mut self) {
174161
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() {
176163
self.scan_stack.pop_front().unwrap();
177-
self.buf[self.left].size = SIZE_INFINITY;
164+
self.buf.first_mut().size = SIZE_INFINITY;
178165
}
179166
self.advance_left();
180-
if self.left == self.right {
181-
break;
182-
}
183167
}
184168
}
185169

186170
fn advance_left(&mut self) {
187-
let mut left_size = self.buf[self.left].size;
171+
let mut left_size = self.buf.first().size;
188172

189173
while left_size >= 0 {
190-
let left = self.buf[self.left].token.clone();
174+
let left = self.buf.first().token.clone();
191175

192176
let len = match left {
193177
Token::Break(b) => b.blank_space,
@@ -203,14 +187,12 @@ impl Printer {
203187

204188
self.left_total += len;
205189

206-
if self.left == self.right {
190+
self.buf.advance_left();
191+
if self.buf.is_empty() {
207192
break;
208193
}
209194

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;
214196
}
215197
}
216198

src/ring.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,14 @@ impl<T> RingBuffer<T> {
1515
}
1616
}
1717

18-
pub fn push(&mut self, value: T) {
18+
pub fn is_empty(&self) -> bool {
19+
self.data.is_empty()
20+
}
21+
22+
pub fn push(&mut self, value: T) -> usize {
23+
let index = self.offset + self.data.len();
1924
self.data.push_back(value);
25+
index
2026
}
2127

2228
pub fn advance_left(&mut self) {
@@ -27,6 +33,18 @@ impl<T> RingBuffer<T> {
2733
pub fn clear(&mut self) {
2834
self.data.clear();
2935
}
36+
37+
pub fn index_of_first(&self) -> usize {
38+
self.offset
39+
}
40+
41+
pub fn first(&self) -> &T {
42+
&self.data[0]
43+
}
44+
45+
pub fn first_mut(&mut self) -> &mut T {
46+
&mut self.data[0]
47+
}
3048
}
3149

3250
impl<T> Index<usize> for RingBuffer<T> {

0 commit comments

Comments
 (0)