@@ -19,13 +19,14 @@ use option::{Some, None, Option};
19
19
use result:: { Ok , Err } ;
20
20
use slice:: { OwnedVector , ImmutableVector , MutableVector } ;
21
21
use slice;
22
+ use vec:: Vec ;
22
23
23
24
/// Wraps a Reader and buffers input from it
24
25
///
25
- /// It can be excessively inefficient to work directly with a `Reader` or
26
- /// `Writer`. Every call to `read` or `write` on `TcpStream` results in a
27
- /// system call, for example. This module provides structures that wrap
28
- /// `Readers`, `Writers`, and `Streams` and buffer input and output to them .
26
+ /// It can be excessively inefficient to work directly with a `Reader`. For
27
+ /// example, every call to `read` on `TcpStream` results in a system call. A
28
+ /// `BufferedReader` performs large, infrequent reads on the underlying
29
+ /// `Reader` and maintains an in-memory buffer of the results .
29
30
///
30
31
/// # Example
31
32
///
@@ -43,10 +44,9 @@ use slice;
43
44
/// ```
44
45
pub struct BufferedReader < R > {
45
46
priv inner : R ,
46
- priv buf: ~ [ u8 ] ,
47
+ priv buf: Vec < u8 > ,
47
48
priv pos: uint ,
48
49
priv cap: uint ,
49
- priv eof: bool ,
50
50
}
51
51
52
52
impl < R : Reader > BufferedReader < R > {
@@ -58,14 +58,13 @@ impl<R: Reader> BufferedReader<R> {
58
58
// everything up-front. This allows creation of BufferedReader instances
59
59
// to be very cheap (large mallocs are not nearly as expensive as large
60
60
// callocs).
61
- let mut buf = slice :: with_capacity ( cap) ;
61
+ let mut buf = Vec :: with_capacity ( cap) ;
62
62
unsafe { buf. set_len ( cap) ; }
63
63
BufferedReader {
64
64
inner : inner,
65
65
buf : buf,
66
66
pos : 0 ,
67
67
cap : 0 ,
68
- eof : false ,
69
68
}
70
69
}
71
70
@@ -80,7 +79,7 @@ impl<R: Reader> BufferedReader<R> {
80
79
/// underlying reader because that could possibly corrupt the buffer.
81
80
pub fn get_ref < ' a > ( & ' a self ) -> & ' a R { & self . inner }
82
81
83
- /// Unwraps this buffer , returning the underlying reader.
82
+ /// Unwraps this `BufferedReader` , returning the underlying reader.
84
83
///
85
84
/// Note that any leftover data in the internal buffer is lost.
86
85
pub fn unwrap ( self ) -> R { self . inner }
@@ -89,7 +88,7 @@ impl<R: Reader> BufferedReader<R> {
89
88
impl < R : Reader > Buffer for BufferedReader < R > {
90
89
fn fill < ' a > ( & ' a mut self ) -> IoResult < & ' a [ u8 ] > {
91
90
if self . pos == self . cap {
92
- self . cap = try!( self . inner . read ( self . buf ) ) ;
91
+ self . cap = try!( self . inner . read ( self . buf . as_mut_slice ( ) ) ) ;
93
92
self . pos = 0 ;
94
93
}
95
94
Ok ( self . buf . slice ( self . pos , self . cap ) )
@@ -116,6 +115,11 @@ impl<R: Reader> Reader for BufferedReader<R> {
116
115
117
116
/// Wraps a Writer and buffers output to it
118
117
///
118
+ /// It can be excessively inefficient to work directly with a `Writer`. For
119
+ /// example, every call to `write` on `TcpStream` results in a system call. A
120
+ /// `BufferedWriter` keeps an in memory buffer of data and writes it to the
121
+ /// underlying `Writer` in large, infrequent batches.
122
+ ///
119
123
/// This writer will be flushed when it is dropped.
120
124
///
121
125
/// # Example
@@ -132,15 +136,15 @@ impl<R: Reader> Reader for BufferedReader<R> {
132
136
/// ```
133
137
pub struct BufferedWriter < W > {
134
138
priv inner : Option < W > ,
135
- priv buf: ~ [ u8 ] ,
139
+ priv buf: Vec < u8 > ,
136
140
priv pos: uint
137
141
}
138
142
139
143
impl < W : Writer > BufferedWriter < W > {
140
144
/// Creates a new `BufferedWriter` with the specified buffer capacity
141
145
pub fn with_capacity ( cap : uint , inner : W ) -> BufferedWriter < W > {
142
146
// See comments in BufferedReader for why this uses unsafe code.
143
- let mut buf = slice :: with_capacity ( cap) ;
147
+ let mut buf = Vec :: with_capacity ( cap) ;
144
148
unsafe { buf. set_len ( cap) ; }
145
149
BufferedWriter {
146
150
inner : Some ( inner) ,
@@ -170,7 +174,7 @@ impl<W: Writer> BufferedWriter<W> {
170
174
/// underlying reader because that could possibly corrupt the buffer.
171
175
pub fn get_ref < ' a > ( & ' a self ) -> & ' a W { self . inner . get_ref ( ) }
172
176
173
- /// Unwraps this buffer , returning the underlying writer.
177
+ /// Unwraps this `BufferedWriter` , returning the underlying writer.
174
178
///
175
179
/// The buffer is flushed before returning the writer.
176
180
pub fn unwrap ( mut self ) -> W {
@@ -234,7 +238,7 @@ impl<W: Writer> LineBufferedWriter<W> {
234
238
/// underlying reader because that could possibly corrupt the buffer.
235
239
pub fn get_ref < ' a > ( & ' a self ) -> & ' a W { self . inner . get_ref ( ) }
236
240
237
- /// Unwraps this buffer , returning the underlying writer.
241
+ /// Unwraps this `LineBufferedWriter` , returning the underlying writer.
238
242
///
239
243
/// The internal buffer is flushed before returning the writer.
240
244
pub fn unwrap ( self ) -> W { self . inner . unwrap ( ) }
@@ -273,6 +277,11 @@ impl<W: Reader> Reader for InternalBufferedWriter<W> {
273
277
274
278
/// Wraps a Stream and buffers input and output to and from it.
275
279
///
280
+ /// It can be excessively inefficient to work directly with a `Stream`. For
281
+ /// example, every call to `read` or `write` on `TcpStream` results in a system
282
+ /// call. A `BufferedStream` keeps in memory buffers of data, making large,
283
+ /// infrequent calls to `read` and `write` on the underlying `Stream`.
284
+ ///
276
285
/// The output half will be flushed when this stream is dropped.
277
286
///
278
287
/// # Example
@@ -325,7 +334,7 @@ impl<S: Stream> BufferedStream<S> {
325
334
w. get_ref ( )
326
335
}
327
336
328
- /// Unwraps this buffer , returning the underlying stream.
337
+ /// Unwraps this `BufferedStream` , returning the underlying stream.
329
338
///
330
339
/// The internal buffer is flushed before returning the stream. Any leftover
331
340
/// data in the read buffer is lost.
0 commit comments