Skip to content

Commit 1998b3e

Browse files
committed
auto merge of #10738 : sfackler/rust/buffered-fixes, r=alexcrichton
BufferedWriter::inner flushes before returning the underlying writer. BufferedWriter::write no longer flushes the underlying writer. LineBufferedWriter::write flushes up to the *last* newline in the input string, not the first.
2 parents 436adc2 + 26e57bb commit 1998b3e

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

src/libstd/io/buffered.rs

+28-10
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,19 @@ impl<W: Writer> BufferedWriter<W> {
166166
pub fn new(inner: W) -> BufferedWriter<W> {
167167
BufferedWriter::with_capacity(DEFAULT_CAPACITY, inner)
168168
}
169+
170+
fn flush_buf(&mut self) {
171+
if self.pos != 0 {
172+
self.inner.write(self.buf.slice_to(self.pos));
173+
self.pos = 0;
174+
}
175+
}
169176
}
170177

171178
impl<W: Writer> Writer for BufferedWriter<W> {
172179
fn write(&mut self, buf: &[u8]) {
173180
if self.pos + buf.len() > self.buf.len() {
174-
self.flush();
181+
self.flush_buf();
175182
}
176183

177184
if buf.len() > self.buf.len() {
@@ -184,16 +191,13 @@ impl<W: Writer> Writer for BufferedWriter<W> {
184191
}
185192

186193
fn flush(&mut self) {
187-
if self.pos != 0 {
188-
self.inner.write(self.buf.slice_to(self.pos));
189-
self.pos = 0;
190-
}
194+
self.flush_buf();
191195
self.inner.flush();
192196
}
193197
}
194198

195199
impl<W: Writer> Decorator<W> for BufferedWriter<W> {
196-
fn inner(self) -> W { self.inner }
200+
fn inner(mut self) -> W { self.flush_buf(); self.inner }
197201
fn inner_ref<'a>(&'a self) -> &'a W { &self.inner }
198202
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut W { &mut self.inner }
199203
}
@@ -218,7 +222,7 @@ impl<W: Writer> LineBufferedWriter<W> {
218222

219223
impl<W: Writer> Writer for LineBufferedWriter<W> {
220224
fn write(&mut self, buf: &[u8]) {
221-
match buf.iter().position(|&b| b == '\n' as u8) {
225+
match buf.iter().rposition(|&b| b == '\n' as u8) {
222226
Some(i) => {
223227
self.inner.write(buf.slice_to(i + 1));
224228
self.inner.flush();
@@ -387,6 +391,15 @@ mod test {
387391
writer.inner_ref().inner_ref().as_slice());
388392
}
389393

394+
#[test]
395+
fn test_buffered_writer_inner_flushes() {
396+
let mut w = BufferedWriter::with_capacity(3, MemWriter::new());
397+
w.write([0, 1]);
398+
assert_eq!([], w.inner_ref().inner_ref().as_slice());
399+
let w = w.inner();
400+
assert_eq!([0, 1], w.inner_ref().as_slice());
401+
}
402+
390403
// This is just here to make sure that we don't infinite loop in the
391404
// newtype struct autoderef weirdness
392405
#[test]
@@ -430,10 +443,15 @@ mod test {
430443
assert_eq!(*writer.inner_ref().inner_ref(), ~[]);
431444
writer.flush();
432445
assert_eq!(*writer.inner_ref().inner_ref(), ~[0, 1]);
433-
writer.write([0, '\n' as u8, 1]);
434-
assert_eq!(*writer.inner_ref().inner_ref(), ~[0, 1, 0, '\n' as u8]);
446+
writer.write([0, '\n' as u8, 1, '\n' as u8, 2]);
447+
assert_eq!(*writer.inner_ref().inner_ref(),
448+
~[0, 1, 0, '\n' as u8, 1, '\n' as u8]);
435449
writer.flush();
436-
assert_eq!(*writer.inner_ref().inner_ref(), ~[0, 1, 0, '\n' as u8, 1]);
450+
assert_eq!(*writer.inner_ref().inner_ref(),
451+
~[0, 1, 0, '\n' as u8, 1, '\n' as u8, 2]);
452+
writer.write([3, '\n' as u8]);
453+
assert_eq!(*writer.inner_ref().inner_ref(),
454+
~[0, 1, 0, '\n' as u8, 1, '\n' as u8, 2, 3, '\n' as u8]);
437455
}
438456

439457
#[bench]

0 commit comments

Comments
 (0)