17
17
18
18
use prelude:: * ;
19
19
use super :: * ;
20
-
20
+ use cmp :: min ;
21
21
22
22
/// Writes to an owned, growable byte vector
23
23
pub struct MemWriter {
@@ -29,13 +29,15 @@ impl MemWriter {
29
29
}
30
30
31
31
impl 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
+ }
33
35
34
36
fn flush ( & mut self ) { /* no-op */ }
35
37
}
36
38
37
39
impl Seek for MemWriter {
38
- fn tell ( & self ) -> u64 { fail ! ( ) }
40
+ fn tell ( & self ) -> u64 { self . buf . len ( ) as u64 }
39
41
40
42
fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
41
43
}
@@ -77,13 +79,27 @@ impl MemReader {
77
79
}
78
80
79
81
impl 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( ) ) ;
81
94
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 ( ) }
83
99
}
84
100
85
101
impl Seek for MemReader {
86
- fn tell ( & self ) -> u64 { fail ! ( ) }
102
+ fn tell ( & self ) -> u64 { self . pos as u64 }
87
103
88
104
fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
89
105
}
@@ -163,4 +179,43 @@ impl<'self> Seek for BufReader<'self> {
163
179
fn tell ( & self ) -> u64 { fail ! ( ) }
164
180
165
181
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