@@ -14,7 +14,8 @@ use cmp;
14
14
use container:: Container ;
15
15
use io:: { Reader , Writer , Stream , Buffer , DEFAULT_BUF_SIZE , IoResult } ;
16
16
use iter:: ExactSize ;
17
- use option:: { Some , None } ;
17
+ use ops:: Drop ;
18
+ use option:: { Some , None , Option } ;
18
19
use result:: { Ok , Err } ;
19
20
use vec:: { OwnedVector , ImmutableVector , MutableVector } ;
20
21
use vec;
@@ -115,7 +116,7 @@ impl<R: Reader> Reader for BufferedReader<R> {
115
116
116
117
/// Wraps a Writer and buffers output to it
117
118
///
118
- /// Note that `BufferedWriter` will NOT flush its buffer when dropped.
119
+ /// This writer will be flushed when it is dropped.
119
120
///
120
121
/// # Example
121
122
///
@@ -130,7 +131,7 @@ impl<R: Reader> Reader for BufferedReader<R> {
130
131
/// writer.flush();
131
132
/// ```
132
133
pub struct BufferedWriter < W > {
133
- priv inner : W ,
134
+ priv inner : Option < W > ,
134
135
priv buf: ~[ u8 ] ,
135
136
priv pos: uint
136
137
}
@@ -142,7 +143,7 @@ impl<W: Writer> BufferedWriter<W> {
142
143
let mut buf = vec:: with_capacity ( cap) ;
143
144
unsafe { buf. set_len ( cap) ; }
144
145
BufferedWriter {
145
- inner : inner,
146
+ inner : Some ( inner) ,
146
147
buf : buf,
147
148
pos : 0
148
149
}
@@ -155,7 +156,7 @@ impl<W: Writer> BufferedWriter<W> {
155
156
156
157
fn flush_buf ( & mut self ) -> IoResult < ( ) > {
157
158
if self . pos != 0 {
158
- let ret = self . inner . write ( self . buf . slice_to ( self . pos ) ) ;
159
+ let ret = self . inner . get_mut_ref ( ) . write ( self . buf . slice_to ( self . pos ) ) ;
159
160
self . pos = 0 ;
160
161
ret
161
162
} else {
@@ -167,15 +168,15 @@ impl<W: Writer> BufferedWriter<W> {
167
168
///
168
169
/// This type does not expose the ability to get a mutable reference to the
169
170
/// underlying reader because that could possibly corrupt the buffer.
170
- pub fn get_ref < ' a > ( & ' a self ) -> & ' a W { & self . inner }
171
+ pub fn get_ref < ' a > ( & ' a self ) -> & ' a W { self . inner . get_ref ( ) }
171
172
172
173
/// Unwraps this buffer, returning the underlying writer.
173
174
///
174
175
/// The buffer is flushed before returning the writer.
175
176
pub fn unwrap ( mut self ) -> W {
176
- // FIXME: is failing the right thing to do if flushing fails?
177
+ // FIXME(#12628) : is failing the right thing to do if flushing fails?
177
178
self . flush_buf ( ) . unwrap ( ) ;
178
- self . inner
179
+ self . inner . take_unwrap ( )
179
180
}
180
181
}
181
182
@@ -186,7 +187,7 @@ impl<W: Writer> Writer for BufferedWriter<W> {
186
187
}
187
188
188
189
if buf. len ( ) > self . buf . len ( ) {
189
- self . inner . write ( buf)
190
+ self . inner . get_mut_ref ( ) . write ( buf)
190
191
} else {
191
192
let dst = self . buf . mut_slice_from ( self . pos ) ;
192
193
vec:: bytes:: copy_memory ( dst, buf) ;
@@ -196,14 +197,24 @@ impl<W: Writer> Writer for BufferedWriter<W> {
196
197
}
197
198
198
199
fn flush ( & mut self ) -> IoResult < ( ) > {
199
- self . flush_buf ( ) . and_then ( |( ) | self . inner . flush ( ) )
200
+ self . flush_buf ( ) . and_then ( |( ) | self . inner . get_mut_ref ( ) . flush ( ) )
201
+ }
202
+ }
203
+
204
+ #[ unsafe_destructor]
205
+ impl < W : Writer > Drop for BufferedWriter < W > {
206
+ fn drop ( & mut self ) {
207
+ if self . inner . is_some ( ) {
208
+ // FIXME(#12628): should this error be ignored?
209
+ let _ = self . flush_buf ( ) ;
210
+ }
200
211
}
201
212
}
202
213
203
214
/// Wraps a Writer and buffers output to it, flushing whenever a newline (`0x0a`,
204
215
/// `'\n'`) is detected.
205
216
///
206
- /// Note that this structure does NOT flush the output when dropped.
217
+ /// This writer will be flushed when it is dropped.
207
218
pub struct LineBufferedWriter < W > {
208
219
priv inner : BufferedWriter < W > ,
209
220
}
@@ -256,13 +267,13 @@ impl<W> InternalBufferedWriter<W> {
256
267
257
268
impl < W : Reader > Reader for InternalBufferedWriter < W > {
258
269
fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
259
- self . get_mut_ref ( ) . inner . read ( buf)
270
+ self . get_mut_ref ( ) . inner . get_mut_ref ( ) . read ( buf)
260
271
}
261
272
}
262
273
263
- /// Wraps a Stream and buffers input and output to and from it
274
+ /// Wraps a Stream and buffers input and output to and from it.
264
275
///
265
- /// Note that `BufferedStream` will NOT flush its output buffer when dropped.
276
+ /// The output half will be flushed when this stream is dropped.
266
277
///
267
278
/// # Example
268
279
///
0 commit comments