@@ -157,59 +157,55 @@ impl Encoder {
157
157
// -----------------------------------------------------------------------------
158
158
159
159
pub struct Decoder < ' a > {
160
- pub data : & ' a [ u8 ] ,
161
- position : usize ,
160
+ pub original_data : & ' a [ u8 ] ,
161
+ data : & ' a [ u8 ] ,
162
162
}
163
163
164
164
impl < ' a > Decoder < ' a > {
165
165
#[ inline]
166
- pub fn new ( data : & ' a [ u8 ] , position : usize ) -> Decoder < ' a > {
166
+ pub fn new ( data : & ' a [ u8 ] , pos : usize ) -> Decoder < ' a > {
167
167
Decoder {
168
- data,
169
- position ,
168
+ original_data : data,
169
+ data : & data [ pos.. ] ,
170
170
}
171
171
}
172
172
173
173
#[ inline]
174
- pub fn position ( & self ) -> usize {
175
- self . position
174
+ pub fn data ( & self ) -> & [ u8 ] {
175
+ self . data
176
176
}
177
177
178
178
#[ inline]
179
- pub fn set_position ( & mut self , pos : usize ) {
180
- self . position = pos
179
+ pub fn position ( & self ) -> usize {
180
+ self . data . as_ptr ( ) . wrapping_offset_from ( self . original_data . as_ptr ( ) ) as usize
181
181
}
182
182
183
183
#[ inline]
184
184
pub fn advance ( & mut self , bytes : usize ) {
185
- self . position += bytes;
185
+ self . data = & self . data [ bytes.. ] ;
186
186
}
187
187
188
188
#[ inline]
189
189
pub fn read_raw_bytes ( & mut self , s : & mut [ u8 ] ) -> Result < ( ) , String > {
190
- let start = self . position ;
191
- let end = start + s. len ( ) ;
192
-
193
- s. copy_from_slice ( & self . data [ start..end] ) ;
194
-
195
- self . position = end;
190
+ s. copy_from_slice ( & self . data [ ..s. len ( ) ] ) ;
191
+ self . advance ( s. len ( ) ) ;
196
192
197
193
Ok ( ( ) )
198
194
}
199
195
}
200
196
201
197
macro_rules! read_uleb128 {
202
198
( $dec: expr, $t: ty, $fun: ident) => ( {
203
- let ( value, bytes_read) = leb128:: $fun( & $dec. data[ $dec . position .. ] ) ;
204
- $dec. position += bytes_read;
199
+ let ( value, bytes_read) = leb128:: $fun( & $dec. data) ;
200
+ $dec. advance ( bytes_read) ;
205
201
Ok ( value)
206
202
} )
207
203
}
208
204
209
205
macro_rules! read_sleb128 {
210
206
( $dec: expr, $t: ty) => ( {
211
- let ( value, bytes_read) = read_signed_leb128( $dec. data, $dec . position ) ;
212
- $dec. position += bytes_read;
207
+ let ( value, bytes_read) = read_signed_leb128( $dec. data) ;
208
+ $dec. advance ( bytes_read) ;
213
209
Ok ( value as $t)
214
210
} )
215
211
}
@@ -245,8 +241,8 @@ impl<'a> serialize::Decoder for Decoder<'a> {
245
241
246
242
#[ inline]
247
243
fn read_u8 ( & mut self ) -> Result < u8 , Self :: Error > {
248
- let value = self . data [ self . position ] ;
249
- self . position += 1 ;
244
+ let value = self . data [ 0 ] ;
245
+ self . advance ( 1 ) ;
250
246
Ok ( value)
251
247
}
252
248
@@ -277,8 +273,8 @@ impl<'a> serialize::Decoder for Decoder<'a> {
277
273
278
274
#[ inline]
279
275
fn read_i8 ( & mut self ) -> Result < i8 , Self :: Error > {
280
- let as_u8 = self . data [ self . position ] ;
281
- self . position += 1 ;
276
+ let as_u8 = self . data [ 0 ] ;
277
+ self . advance ( 1 ) ;
282
278
unsafe { Ok ( :: std:: mem:: transmute ( as_u8) ) }
283
279
}
284
280
@@ -314,8 +310,8 @@ impl<'a> serialize::Decoder for Decoder<'a> {
314
310
#[ inline]
315
311
fn read_str ( & mut self ) -> Result < Cow < ' _ , str > , Self :: Error > {
316
312
let len = self . read_usize ( ) ?;
317
- let s = :: std:: str:: from_utf8 ( & self . data [ self . position .. self . position + len] ) . unwrap ( ) ;
318
- self . position += len;
313
+ let s = :: std:: str:: from_utf8 ( & self . data [ .. len] ) . unwrap ( ) ;
314
+ self . advance ( len) ;
319
315
Ok ( Cow :: Borrowed ( s) )
320
316
}
321
317
0 commit comments