@@ -265,6 +265,16 @@ impl Write for Cursor<Vec<u8>> {
265265 fn flush ( & mut self ) -> io:: Result < ( ) > { Ok ( ( ) ) }
266266}
267267
268+ #[ stable( feature = "cursor_box_slice" , since = "1.5.0" ) ]
269+ impl Write for Cursor < Box < [ u8 ] > > {
270+ fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
271+ let pos = cmp:: min ( self . pos , self . inner . len ( ) as u64 ) ;
272+ let amt = try!( ( & mut self . inner [ ( pos as usize ) ..] ) . write ( buf) ) ;
273+ self . pos += amt as u64 ;
274+ Ok ( amt)
275+ }
276+ fn flush ( & mut self ) -> io:: Result < ( ) > { Ok ( ( ) ) }
277+ }
268278
269279#[ cfg( test) ]
270280mod tests {
@@ -292,6 +302,24 @@ mod tests {
292302 assert_eq ! ( & writer. get_ref( ) [ ..] , b) ;
293303 }
294304
305+ #[ test]
306+ fn test_box_slice_writer ( ) {
307+ let mut writer = Cursor :: new ( vec ! [ 0u8 ; 9 ] . into_boxed_slice ( ) ) ;
308+ assert_eq ! ( writer. position( ) , 0 ) ;
309+ assert_eq ! ( writer. write( & [ 0 ] ) . unwrap( ) , 1 ) ;
310+ assert_eq ! ( writer. position( ) , 1 ) ;
311+ assert_eq ! ( writer. write( & [ 1 , 2 , 3 ] ) . unwrap( ) , 3 ) ;
312+ assert_eq ! ( writer. write( & [ 4 , 5 , 6 , 7 ] ) . unwrap( ) , 4 ) ;
313+ assert_eq ! ( writer. position( ) , 8 ) ;
314+ assert_eq ! ( writer. write( & [ ] ) . unwrap( ) , 0 ) ;
315+ assert_eq ! ( writer. position( ) , 8 ) ;
316+
317+ assert_eq ! ( writer. write( & [ 8 , 9 ] ) . unwrap( ) , 1 ) ;
318+ assert_eq ! ( writer. write( & [ 10 ] ) . unwrap( ) , 0 ) ;
319+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ;
320+ assert_eq ! ( & * * writer. get_ref( ) , b) ;
321+ }
322+
295323 #[ test]
296324 fn test_buf_writer ( ) {
297325 let mut buf = [ 0 as u8 ; 9 ] ;
@@ -373,6 +401,28 @@ mod tests {
373401 assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
374402 }
375403
404+ #[ test]
405+ fn test_boxed_slice_reader ( ) {
406+ let mut reader = Cursor :: new ( vec ! ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ) . into_boxed_slice ( ) ) ;
407+ let mut buf = [ ] ;
408+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
409+ assert_eq ! ( reader. position( ) , 0 ) ;
410+ let mut buf = [ 0 ] ;
411+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 1 ) ;
412+ assert_eq ! ( reader. position( ) , 1 ) ;
413+ let b: & [ _ ] = & [ 0 ] ;
414+ assert_eq ! ( buf, b) ;
415+ let mut buf = [ 0 ; 4 ] ;
416+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 4 ) ;
417+ assert_eq ! ( reader. position( ) , 5 ) ;
418+ let b: & [ _ ] = & [ 1 , 2 , 3 , 4 ] ;
419+ assert_eq ! ( buf, b) ;
420+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 3 ) ;
421+ let b: & [ _ ] = & [ 5 , 6 , 7 ] ;
422+ assert_eq ! ( & buf[ ..3 ] , b) ;
423+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
424+ }
425+
376426 #[ test]
377427 fn read_to_end ( ) {
378428 let mut reader = Cursor :: new ( vec ! ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ;
@@ -459,6 +509,10 @@ mod tests {
459509 let mut r = Cursor :: new ( & mut buf[ ..] ) ;
460510 assert_eq ! ( r. seek( SeekFrom :: Start ( 10 ) ) . unwrap( ) , 10 ) ;
461511 assert_eq ! ( r. write( & [ 3 ] ) . unwrap( ) , 0 ) ;
512+
513+ let mut r = Cursor :: new ( vec ! [ 10 ] . into_boxed_slice ( ) ) ;
514+ assert_eq ! ( r. seek( SeekFrom :: Start ( 10 ) ) . unwrap( ) , 10 ) ;
515+ assert_eq ! ( r. write( & [ 3 ] ) . unwrap( ) , 0 ) ;
462516 }
463517
464518 #[ test]
@@ -473,6 +527,9 @@ mod tests {
473527 let mut buf = [ 0 ] ;
474528 let mut r = Cursor :: new ( & mut buf[ ..] ) ;
475529 assert ! ( r. seek( SeekFrom :: End ( -2 ) ) . is_err( ) ) ;
530+
531+ let mut r = Cursor :: new ( vec ! ( 10 ) . into_boxed_slice ( ) ) ;
532+ assert ! ( r. seek( SeekFrom :: End ( -2 ) ) . is_err( ) ) ;
476533 }
477534
478535 #[ test]
0 commit comments