@@ -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
171178impl < 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
195199impl < 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
219223impl < 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