1717
1818use prelude:: * ;
1919use super :: * ;
20-
20+ use cmp :: min ;
2121
2222/// Writes to an owned, growable byte vector
2323pub struct MemWriter {
@@ -29,13 +29,15 @@ impl MemWriter {
2929}
3030
3131impl Writer for MemWriter {
32- fn write ( & mut self , _buf : & [ u8 ] ) { fail ! ( ) }
32+ fn write ( & mut self , buf : & [ u8 ] ) {
33+ self . buf . push_all ( buf)
34+ }
3335
3436 fn flush ( & mut self ) { /* no-op */ }
3537}
3638
3739impl Seek for MemWriter {
38- fn tell ( & self ) -> u64 { fail ! ( ) }
40+ fn tell ( & self ) -> u64 { self . buf . len ( ) as u64 }
3941
4042 fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
4143}
@@ -77,13 +79,27 @@ impl MemReader {
7779}
7880
7981impl Reader for MemReader {
80- fn read ( & mut self , _buf : & mut [ u8 ] ) -> Option < uint > { fail ! ( ) }
82+ fn read ( & mut self , buf : & mut [ u8 ] ) -> Option < uint > {
83+ { if self . eof ( ) { return None ; } }
84+
85+ let write_len = min ( buf. len ( ) , self . buf . len ( ) - self . pos ) ;
86+ {
87+ let input = self . buf . slice ( self . pos , self . pos + write_len) ;
88+ let output = vec:: mut_slice ( buf, 0 , write_len) ;
89+ assert ! ( input. len( ) == output. len( ) ) ;
90+ vec:: bytes:: copy_memory ( output, input, write_len) ;
91+ }
92+ self . pos += write_len;
93+ assert ! ( self . pos <= self . buf. len( ) ) ;
8194
82- fn eof ( & mut self ) -> bool { fail ! ( ) }
95+ return Some ( write_len) ;
96+ }
97+
98+ fn eof ( & mut self ) -> bool { self . pos == self . buf . len ( ) }
8399}
84100
85101impl Seek for MemReader {
86- fn tell ( & self ) -> u64 { fail ! ( ) }
102+ fn tell ( & self ) -> u64 { self . pos as u64 }
87103
88104 fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
89105}
@@ -163,4 +179,43 @@ impl<'self> Seek for BufReader<'self> {
163179 fn tell ( & self ) -> u64 { fail ! ( ) }
164180
165181 fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
166- }
182+ }
183+
184+ #[ cfg( test) ]
185+ mod test {
186+ use prelude:: * ;
187+ use super :: * ;
188+
189+ #[ test]
190+ fn test_mem_writer ( ) {
191+ let mut writer = MemWriter :: new ( ) ;
192+ assert ! ( writer. tell( ) == 0 ) ;
193+ writer. write ( [ 0 ] ) ;
194+ assert ! ( writer. tell( ) == 1 ) ;
195+ writer. write ( [ 1 , 2 , 3 ] ) ;
196+ writer. write ( [ 4 , 5 , 6 , 7 ] ) ;
197+ assert ! ( writer. tell( ) == 8 ) ;
198+ assert ! ( writer. inner( ) == ~[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
199+ }
200+
201+ #[ test]
202+ fn test_mem_reader ( ) {
203+ let mut reader = MemReader :: new ( ~[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
204+ let mut buf = [ ] ;
205+ assert ! ( reader. read( buf) == Some ( 0 ) ) ;
206+ assert ! ( reader. tell( ) == 0 ) ;
207+ let mut buf = [ 0 ] ;
208+ assert ! ( reader. read( buf) == Some ( 1 ) ) ;
209+ assert ! ( reader. tell( ) == 1 ) ;
210+ assert ! ( buf == [ 0 ] ) ;
211+ let mut buf = [ 0 , ..4 ] ;
212+ assert ! ( reader. read( buf) == Some ( 4 ) ) ;
213+ assert ! ( reader. tell( ) == 5 ) ;
214+ assert ! ( buf == [ 1 , 2 , 3 , 4 ] ) ;
215+ assert ! ( reader. read( buf) == Some ( 3 ) ) ;
216+ assert ! ( buf. slice( 0 , 3 ) == [ 5 , 6 , 7 ] ) ;
217+ assert ! ( reader. eof( ) ) ;
218+ assert ! ( reader. read( buf) == None ) ;
219+ assert ! ( reader. eof( ) ) ;
220+ }
221+ }
0 commit comments