Skip to content

Commit 30b5ca5

Browse files
authored
Merge pull request #296 from stjepang/cleanup-bufwriter
Cleanup BufWriter
2 parents d1fe965 + da2335b commit 30b5ca5

File tree

2 files changed

+80
-94
lines changed

2 files changed

+80
-94
lines changed

src/io/buf_writer.rs

Lines changed: 9 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
use crate::task::{Context, Poll};
2-
use futures_core::ready;
3-
use futures_io::{AsyncSeek, AsyncWrite, SeekFrom};
41
use std::fmt;
5-
use std::io;
62
use std::pin::Pin;
73

4+
use futures_core::ready;
5+
6+
use crate::io::{self, Seek, SeekFrom, Write};
7+
use crate::task::{Context, Poll};
8+
89
const DEFAULT_CAPACITY: usize = 8 * 1024;
910

1011
/// Wraps a writer and buffers its output.
@@ -82,7 +83,7 @@ pub struct BufWriter<W> {
8283
written: usize,
8384
}
8485

85-
impl<W: AsyncWrite> BufWriter<W> {
86+
impl<W: Write> BufWriter<W> {
8687
pin_utils::unsafe_pinned!(inner: W);
8788
pin_utils::unsafe_unpinned!(buf: Vec<u8>);
8889

@@ -173,10 +174,6 @@ impl<W: AsyncWrite> BufWriter<W> {
173174
&mut self.inner
174175
}
175176

176-
// pub fn get_pin_mut(self: Pin<&mut Self>) -> Pin<&mut W> {
177-
// self.inner()
178-
// }
179-
180177
/// Consumes BufWriter, returning the underlying writer
181178
///
182179
/// This method will not write leftover data, it will be lost.
@@ -187,10 +184,6 @@ impl<W: AsyncWrite> BufWriter<W> {
187184
self.inner
188185
}
189186

190-
// pub fn poll_into_inner(self: Pin<&mut Self>, _cx: Context<'_>) -> Poll<io::Result<usize>> {
191-
// unimplemented!("poll into inner method")
192-
// }
193-
194187
/// Returns a reference to the internally buffered data.
195188
///
196189
/// # Examples
@@ -251,7 +244,7 @@ impl<W: AsyncWrite> BufWriter<W> {
251244
}
252245
}
253246

254-
impl<W: AsyncWrite> AsyncWrite for BufWriter<W> {
247+
impl<W: Write> Write for BufWriter<W> {
255248
fn poll_write(
256249
mut self: Pin<&mut Self>,
257250
cx: &mut Context<'_>,
@@ -278,7 +271,7 @@ impl<W: AsyncWrite> AsyncWrite for BufWriter<W> {
278271
}
279272
}
280273

281-
impl<W: AsyncWrite + fmt::Debug> fmt::Debug for BufWriter<W> {
274+
impl<W: Write + fmt::Debug> fmt::Debug for BufWriter<W> {
282275
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
283276
f.debug_struct("BufReader")
284277
.field("writer", &self.inner)
@@ -287,11 +280,10 @@ impl<W: AsyncWrite + fmt::Debug> fmt::Debug for BufWriter<W> {
287280
}
288281
}
289282

290-
impl<W: AsyncWrite + AsyncSeek> AsyncSeek for BufWriter<W> {
283+
impl<W: Write + Seek> Seek for BufWriter<W> {
291284
/// Seek to the offset, in bytes, in the underlying writer.
292285
///
293286
/// Seeking always writes out the internal buffer before seeking.
294-
295287
fn poll_seek(
296288
mut self: Pin<&mut Self>,
297289
cx: &mut Context<'_>,
@@ -301,80 +293,3 @@ impl<W: AsyncWrite + AsyncSeek> AsyncSeek for BufWriter<W> {
301293
self.inner().poll_seek(cx, pos)
302294
}
303295
}
304-
305-
mod tests {
306-
#![allow(unused_imports)]
307-
308-
use super::BufWriter;
309-
use crate::io::{self, SeekFrom};
310-
use crate::prelude::*;
311-
use crate::task;
312-
313-
#[test]
314-
fn test_buffered_writer() {
315-
task::block_on(async {
316-
let inner = Vec::new();
317-
let mut writer = BufWriter::with_capacity(2, inner);
318-
319-
writer.write(&[0, 1]).await.unwrap();
320-
assert_eq!(writer.buffer(), []);
321-
assert_eq!(*writer.get_ref(), [0, 1]);
322-
323-
writer.write(&[2]).await.unwrap();
324-
assert_eq!(writer.buffer(), [2]);
325-
assert_eq!(*writer.get_ref(), [0, 1]);
326-
327-
writer.write(&[3]).await.unwrap();
328-
assert_eq!(writer.buffer(), [2, 3]);
329-
assert_eq!(*writer.get_ref(), [0, 1]);
330-
331-
writer.flush().await.unwrap();
332-
assert_eq!(writer.buffer(), []);
333-
assert_eq!(*writer.get_ref(), [0, 1, 2, 3]);
334-
335-
writer.write(&[4]).await.unwrap();
336-
writer.write(&[5]).await.unwrap();
337-
assert_eq!(writer.buffer(), [4, 5]);
338-
assert_eq!(*writer.get_ref(), [0, 1, 2, 3]);
339-
340-
writer.write(&[6]).await.unwrap();
341-
assert_eq!(writer.buffer(), [6]);
342-
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5]);
343-
344-
writer.write(&[7, 8]).await.unwrap();
345-
assert_eq!(writer.buffer(), []);
346-
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8]);
347-
348-
writer.write(&[9, 10, 11]).await.unwrap();
349-
assert_eq!(writer.buffer(), []);
350-
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
351-
352-
writer.flush().await.unwrap();
353-
assert_eq!(writer.buffer(), []);
354-
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
355-
})
356-
}
357-
358-
#[test]
359-
fn test_buffered_writer_inner_into_inner_does_not_flush() {
360-
task::block_on(async {
361-
let mut w = BufWriter::with_capacity(3, Vec::new());
362-
w.write(&[0, 1]).await.unwrap();
363-
assert_eq!(*w.get_ref(), []);
364-
let w = w.into_inner();
365-
assert_eq!(w, []);
366-
})
367-
}
368-
369-
#[test]
370-
fn test_buffered_writer_seek() {
371-
task::block_on(async {
372-
let mut w = BufWriter::with_capacity(3, io::Cursor::new(Vec::new()));
373-
w.write_all(&[0, 1, 2, 3, 4, 5]).await.unwrap();
374-
w.write_all(&[6, 7]).await.unwrap();
375-
assert_eq!(w.seek(SeekFrom::Current(0)).await.ok(), Some(8));
376-
assert_eq!(&w.get_ref().get_ref()[..], &[0, 1, 2, 3, 4, 5, 6, 7][..]);
377-
assert_eq!(w.seek(SeekFrom::Start(2)).await.ok(), Some(2));
378-
})
379-
}
380-
}

tests/buf_writer.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use async_std::io::{self, BufWriter, SeekFrom};
2+
use async_std::prelude::*;
3+
use async_std::task;
4+
5+
#[test]
6+
fn test_buffered_writer() {
7+
task::block_on(async {
8+
let inner = Vec::new();
9+
let mut writer = BufWriter::with_capacity(2, inner);
10+
11+
writer.write(&[0, 1]).await.unwrap();
12+
assert_eq!(writer.buffer(), []);
13+
assert_eq!(*writer.get_ref(), [0, 1]);
14+
15+
writer.write(&[2]).await.unwrap();
16+
assert_eq!(writer.buffer(), [2]);
17+
assert_eq!(*writer.get_ref(), [0, 1]);
18+
19+
writer.write(&[3]).await.unwrap();
20+
assert_eq!(writer.buffer(), [2, 3]);
21+
assert_eq!(*writer.get_ref(), [0, 1]);
22+
23+
writer.flush().await.unwrap();
24+
assert_eq!(writer.buffer(), []);
25+
assert_eq!(*writer.get_ref(), [0, 1, 2, 3]);
26+
27+
writer.write(&[4]).await.unwrap();
28+
writer.write(&[5]).await.unwrap();
29+
assert_eq!(writer.buffer(), [4, 5]);
30+
assert_eq!(*writer.get_ref(), [0, 1, 2, 3]);
31+
32+
writer.write(&[6]).await.unwrap();
33+
assert_eq!(writer.buffer(), [6]);
34+
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5]);
35+
36+
writer.write(&[7, 8]).await.unwrap();
37+
assert_eq!(writer.buffer(), []);
38+
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8]);
39+
40+
writer.write(&[9, 10, 11]).await.unwrap();
41+
assert_eq!(writer.buffer(), []);
42+
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
43+
44+
writer.flush().await.unwrap();
45+
assert_eq!(writer.buffer(), []);
46+
assert_eq!(*writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
47+
})
48+
}
49+
50+
#[test]
51+
fn test_buffered_writer_inner_into_inner_does_not_flush() {
52+
task::block_on(async {
53+
let mut w = BufWriter::with_capacity(3, Vec::new());
54+
w.write(&[0, 1]).await.unwrap();
55+
assert_eq!(*w.get_ref(), []);
56+
let w = w.into_inner();
57+
assert_eq!(w, []);
58+
})
59+
}
60+
61+
#[test]
62+
fn test_buffered_writer_seek() {
63+
task::block_on(async {
64+
let mut w = BufWriter::with_capacity(3, io::Cursor::new(Vec::new()));
65+
w.write_all(&[0, 1, 2, 3, 4, 5]).await.unwrap();
66+
w.write_all(&[6, 7]).await.unwrap();
67+
assert_eq!(w.seek(SeekFrom::Current(0)).await.ok(), Some(8));
68+
assert_eq!(&w.get_ref().get_ref()[..], &[0, 1, 2, 3, 4, 5, 6, 7][..]);
69+
assert_eq!(w.seek(SeekFrom::Start(2)).await.ok(), Some(2));
70+
})
71+
}

0 commit comments

Comments
 (0)