@@ -166,12 +166,19 @@ impl<W: Writer> BufferedWriter<W> {
166
166
pub fn new ( inner : W ) -> BufferedWriter < W > {
167
167
BufferedWriter :: with_capacity ( DEFAULT_CAPACITY , inner)
168
168
}
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
+ }
169
176
}
170
177
171
178
impl < W : Writer > Writer for BufferedWriter < W > {
172
179
fn write ( & mut self , buf : & [ u8 ] ) {
173
180
if self . pos + buf. len ( ) > self . buf . len ( ) {
174
- self . flush ( ) ;
181
+ self . flush_buf ( ) ;
175
182
}
176
183
177
184
if buf. len ( ) > self . buf . len ( ) {
@@ -184,16 +191,13 @@ impl<W: Writer> Writer for BufferedWriter<W> {
184
191
}
185
192
186
193
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 ( ) ;
191
195
self . inner . flush ( ) ;
192
196
}
193
197
}
194
198
195
199
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 }
197
201
fn inner_ref < ' a > ( & ' a self ) -> & ' a W { & self . inner }
198
202
fn inner_mut_ref < ' a > ( & ' a mut self ) -> & ' a mut W { & mut self . inner }
199
203
}
@@ -218,7 +222,7 @@ impl<W: Writer> LineBufferedWriter<W> {
218
222
219
223
impl < W : Writer > Writer for LineBufferedWriter < W > {
220
224
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 ) {
222
226
Some ( i) => {
223
227
self . inner . write ( buf. slice_to ( i + 1 ) ) ;
224
228
self . inner . flush ( ) ;
@@ -387,6 +391,15 @@ mod test {
387
391
writer. inner_ref( ) . inner_ref( ) . as_slice( ) ) ;
388
392
}
389
393
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
+
390
403
// This is just here to make sure that we don't infinite loop in the
391
404
// newtype struct autoderef weirdness
392
405
#[ test]
@@ -430,10 +443,15 @@ mod test {
430
443
assert_eq ! ( * writer. inner_ref( ) . inner_ref( ) , ~[ ] ) ;
431
444
writer. flush ( ) ;
432
445
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 ] ) ;
435
449
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 ] ) ;
437
455
}
438
456
439
457
#[ bench]
0 commit comments