@@ -59,11 +59,13 @@ pub struct MemWriter {
59
59
60
60
impl MemWriter {
61
61
/// Create a new `MemWriter`.
62
+ #[ inline]
62
63
pub fn new ( ) -> MemWriter {
63
64
MemWriter :: with_capacity ( 128 )
64
65
}
65
66
/// Create a new `MemWriter`, allocating at least `n` bytes for
66
67
/// the internal buffer.
68
+ #[ inline]
67
69
pub fn with_capacity ( n : uint ) -> MemWriter {
68
70
MemWriter { buf : Vec :: with_capacity ( n) , pos : 0 }
69
71
}
@@ -73,13 +75,16 @@ impl MemWriter {
73
75
///
74
76
/// No method is exposed for acquiring a mutable reference to the buffer
75
77
/// because it could corrupt the state of this `MemWriter`.
78
+ #[ inline]
76
79
pub fn get_ref < ' a > ( & ' a self ) -> & ' a [ u8 ] { self . buf . as_slice ( ) }
77
80
78
81
/// Unwraps this `MemWriter`, returning the underlying buffer
82
+ #[ inline]
79
83
pub fn unwrap ( self ) -> Vec < u8 > { self . buf }
80
84
}
81
85
82
86
impl Writer for MemWriter {
87
+ #[ inline]
83
88
fn write ( & mut self , buf : & [ u8 ] ) -> IoResult < ( ) > {
84
89
// Make sure the internal buffer is as least as big as where we
85
90
// currently are
@@ -112,7 +117,10 @@ impl Writer for MemWriter {
112
117
}
113
118
114
119
impl Seek for MemWriter {
120
+ #[ inline]
115
121
fn tell ( & self ) -> IoResult < u64 > { Ok ( self . pos as u64 ) }
122
+
123
+ #[ inline]
116
124
fn seek ( & mut self , pos : i64 , style : SeekStyle ) -> IoResult < ( ) > {
117
125
let new = try!( combine ( style, self . pos , self . buf . len ( ) , pos) ) ;
118
126
self . pos = new as uint ;
@@ -140,6 +148,7 @@ pub struct MemReader {
140
148
impl MemReader {
141
149
/// Creates a new `MemReader` which will read the buffer given. The buffer
142
150
/// can be re-acquired through `unwrap`
151
+ #[ inline]
143
152
pub fn new ( buf : Vec < u8 > ) -> MemReader {
144
153
MemReader {
145
154
buf : buf,
@@ -150,20 +159,24 @@ impl MemReader {
150
159
/// Tests whether this reader has read all bytes in its buffer.
151
160
///
152
161
/// If `true`, then this will no longer return bytes from `read`.
162
+ #[ inline]
153
163
pub fn eof ( & self ) -> bool { self . pos >= self . buf . len ( ) }
154
164
155
165
/// Acquires an immutable reference to the underlying buffer of this
156
166
/// `MemReader`.
157
167
///
158
168
/// No method is exposed for acquiring a mutable reference to the buffer
159
169
/// because it could corrupt the state of this `MemReader`.
170
+ #[ inline]
160
171
pub fn get_ref < ' a > ( & ' a self ) -> & ' a [ u8 ] { self . buf . as_slice ( ) }
161
172
162
173
/// Unwraps this `MemReader`, returning the underlying buffer
174
+ #[ inline]
163
175
pub fn unwrap ( self ) -> Vec < u8 > { self . buf }
164
176
}
165
177
166
178
impl Reader for MemReader {
179
+ #[ inline]
167
180
fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
168
181
if self . eof ( ) { return Err ( io:: standard_error ( io:: EndOfFile ) ) }
169
182
@@ -182,7 +195,10 @@ impl Reader for MemReader {
182
195
}
183
196
184
197
impl Seek for MemReader {
198
+ #[ inline]
185
199
fn tell ( & self ) -> IoResult < u64 > { Ok ( self . pos as u64 ) }
200
+
201
+ #[ inline]
186
202
fn seek ( & mut self , pos : i64 , style : SeekStyle ) -> IoResult < ( ) > {
187
203
let new = try!( combine ( style, self . pos , self . buf . len ( ) , pos) ) ;
188
204
self . pos = new as uint ;
@@ -191,13 +207,16 @@ impl Seek for MemReader {
191
207
}
192
208
193
209
impl Buffer for MemReader {
210
+ #[ inline]
194
211
fn fill_buf < ' a > ( & ' a mut self ) -> IoResult < & ' a [ u8 ] > {
195
212
if self . pos < self . buf . len ( ) {
196
213
Ok ( self . buf . slice_from ( self . pos ) )
197
214
} else {
198
215
Err ( io:: standard_error ( io:: EndOfFile ) )
199
216
}
200
217
}
218
+
219
+ #[ inline]
201
220
fn consume ( & mut self , amt : uint ) { self . pos += amt; }
202
221
}
203
222
@@ -227,6 +246,7 @@ pub struct BufWriter<'a> {
227
246
impl < ' a > BufWriter < ' a > {
228
247
/// Creates a new `BufWriter` which will wrap the specified buffer. The
229
248
/// writer initially starts at position 0.
249
+ #[ inline]
230
250
pub fn new < ' a > ( buf : & ' a mut [ u8 ] ) -> BufWriter < ' a > {
231
251
BufWriter {
232
252
buf : buf,
@@ -236,6 +256,7 @@ impl<'a> BufWriter<'a> {
236
256
}
237
257
238
258
impl < ' a > Writer for BufWriter < ' a > {
259
+ #[ inline]
239
260
fn write ( & mut self , buf : & [ u8 ] ) -> IoResult < ( ) > {
240
261
// return an error if the entire write does not fit in the buffer
241
262
let max_size = self . buf . len ( ) ;
@@ -254,7 +275,10 @@ impl<'a> Writer for BufWriter<'a> {
254
275
}
255
276
256
277
impl < ' a > Seek for BufWriter < ' a > {
278
+ #[ inline]
257
279
fn tell ( & self ) -> IoResult < u64 > { Ok ( self . pos as u64 ) }
280
+
281
+ #[ inline]
258
282
fn seek ( & mut self , pos : i64 , style : SeekStyle ) -> IoResult < ( ) > {
259
283
let new = try!( combine ( style, self . pos , self . buf . len ( ) , pos) ) ;
260
284
self . pos = new as uint ;
@@ -282,6 +306,7 @@ pub struct BufReader<'a> {
282
306
283
307
impl < ' a > BufReader < ' a > {
284
308
/// Creates a new buffered reader which will read the specified buffer
309
+ #[ inline]
285
310
pub fn new < ' a > ( buf : & ' a [ u8 ] ) -> BufReader < ' a > {
286
311
BufReader {
287
312
buf : buf,
@@ -292,10 +317,12 @@ impl<'a> BufReader<'a> {
292
317
/// Tests whether this reader has read all bytes in its buffer.
293
318
///
294
319
/// If `true`, then this will no longer return bytes from `read`.
320
+ #[ inline]
295
321
pub fn eof ( & self ) -> bool { self . pos >= self . buf . len ( ) }
296
322
}
297
323
298
324
impl < ' a > Reader for BufReader < ' a > {
325
+ #[ inline]
299
326
fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
300
327
if self . eof ( ) { return Err ( io:: standard_error ( io:: EndOfFile ) ) }
301
328
@@ -314,7 +341,10 @@ impl<'a> Reader for BufReader<'a> {
314
341
}
315
342
316
343
impl < ' a > Seek for BufReader < ' a > {
344
+ #[ inline]
317
345
fn tell ( & self ) -> IoResult < u64 > { Ok ( self . pos as u64 ) }
346
+
347
+ #[ inline]
318
348
fn seek ( & mut self , pos : i64 , style : SeekStyle ) -> IoResult < ( ) > {
319
349
let new = try!( combine ( style, self . pos , self . buf . len ( ) , pos) ) ;
320
350
self . pos = new as uint ;
@@ -323,22 +353,27 @@ impl<'a> Seek for BufReader<'a> {
323
353
}
324
354
325
355
impl < ' a > Buffer for BufReader < ' a > {
356
+ #[ inline]
326
357
fn fill_buf < ' a > ( & ' a mut self ) -> IoResult < & ' a [ u8 ] > {
327
358
if self . pos < self . buf . len ( ) {
328
359
Ok ( self . buf . slice_from ( self . pos ) )
329
360
} else {
330
361
Err ( io:: standard_error ( io:: EndOfFile ) )
331
362
}
332
363
}
364
+
365
+ #[ inline]
333
366
fn consume ( & mut self , amt : uint ) { self . pos += amt; }
334
367
}
335
368
336
369
#[ cfg( test) ]
337
370
mod test {
371
+ extern crate test;
338
372
use prelude:: * ;
339
373
use super :: * ;
340
374
use io:: * ;
341
375
use io;
376
+ use self :: test:: Bencher ;
342
377
use str:: StrSlice ;
343
378
344
379
#[ test]
@@ -571,4 +606,59 @@ mod test {
571
606
assert ! ( r. read_at_least( buf. len( ) , buf) . is_err( ) ) ;
572
607
assert_eq ! ( buf. as_slice( ) , & [ 7 , 8 , 6 ] ) ;
573
608
}
609
+
610
+ #[ bench]
611
+ fn bench_mem_writer ( b : & mut Bencher ) {
612
+ b. iter ( || {
613
+ let mut wr = MemWriter :: new ( ) ;
614
+ for _i in range ( 0 , 10 ) {
615
+ wr. write ( [ 5 , .. 10 ] ) . unwrap ( ) ;
616
+ }
617
+ assert_eq ! ( wr. unwrap( ) . as_slice( ) , [ 5 , .. 100 ] . as_slice( ) ) ;
618
+ } ) ;
619
+ }
620
+
621
+ #[ bench]
622
+ fn bench_mem_reader ( b : & mut Bencher ) {
623
+ b. iter ( || {
624
+ let buf = Vec :: from_slice ( [ 5 as u8 , ..100 ] ) ;
625
+ {
626
+ let mut rdr = MemReader :: new ( buf) ;
627
+ for _i in range ( 0 , 10 ) {
628
+ let mut buf = [ 0 as u8 , .. 10 ] ;
629
+ rdr. read ( buf) . unwrap ( ) ;
630
+ assert_eq ! ( buf. as_slice( ) , [ 5 , .. 10 ] . as_slice( ) ) ;
631
+ }
632
+ }
633
+ } ) ;
634
+ }
635
+
636
+ #[ bench]
637
+ fn bench_buf_writer ( b : & mut Bencher ) {
638
+ b. iter ( || {
639
+ let mut buf = [ 0 as u8 , ..100 ] ;
640
+ {
641
+ let mut wr = BufWriter :: new ( buf) ;
642
+ for _i in range ( 0 , 10 ) {
643
+ wr. write ( [ 5 , .. 10 ] ) . unwrap ( ) ;
644
+ }
645
+ }
646
+ assert_eq ! ( buf. as_slice( ) , [ 5 , .. 100 ] . as_slice( ) ) ;
647
+ } ) ;
648
+ }
649
+
650
+ #[ bench]
651
+ fn bench_buf_reader ( b : & mut Bencher ) {
652
+ b. iter ( || {
653
+ let buf = [ 5 as u8 , ..100 ] ;
654
+ {
655
+ let mut rdr = BufReader :: new ( buf) ;
656
+ for _i in range ( 0 , 10 ) {
657
+ let mut buf = [ 0 as u8 , .. 10 ] ;
658
+ rdr. read ( buf) . unwrap ( ) ;
659
+ assert_eq ! ( buf. as_slice( ) , [ 5 , .. 10 ] . as_slice( ) ) ;
660
+ }
661
+ }
662
+ } ) ;
663
+ }
574
664
}
0 commit comments