2
2
#[ cfg( feature = "experimental" ) ]
3
3
use std:: cmp:: min;
4
4
#[ cfg( feature = "experimental" ) ]
5
- use std:: io:: SeekFrom ;
6
- use std:: io:: { self , BufRead , BufReader , Read , Seek } ;
5
+ use std:: io:: { SeekFrom , Seek } ;
6
+ use std:: io:: { self , BufRead , BufReader , Read } ;
7
7
#[ cfg( feature = "experimental" ) ]
8
8
use std:: mem:: size_of;
9
9
@@ -114,8 +114,8 @@ fn read_exact_or_seek_back<R: Read + Seek + ?Sized>(this: &mut R, mut buf: &mut
114
114
}
115
115
}
116
116
117
+ #[ cfg( feature = "experimental" ) ]
117
118
impl < ' a , R : Read + Seek > Decoder < ' a , BufReader < R > > {
118
- #[ cfg( feature = "experimental" ) ]
119
119
fn read_skippable_frame_size ( & mut self ) -> io:: Result < usize > {
120
120
let mut magic_buffer = [ 0u8 ; U32_SIZE ] ;
121
121
read_exact_or_seek_back ( self . reader . reader_mut ( ) , & mut magic_buffer) ?;
@@ -130,17 +130,15 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
130
130
Ok ( content_size + SKIPPABLEHEADERSIZE as usize )
131
131
}
132
132
133
- #[ cfg( feature = "experimental" ) ]
134
133
fn seek_back ( & mut self , bytes_count : usize ) {
135
134
if let Err ( error) = self . reader . reader_mut ( ) . seek ( SeekFrom :: Current ( -( bytes_count as i64 ) ) ) {
136
135
panic ! ( "Error while seeking back to the start: {}" , error) ;
137
136
}
138
137
}
139
138
140
- #[ cfg( feature = "experimental" ) ]
141
139
/// Attempt to read a skippable frame and write its content to `dest`.
142
140
/// If it cannot read a skippable frame, the reader will be back to its starting position.
143
- pub fn read_skippable_frame ( & mut self , dest : & mut Vec < u8 > ) -> io:: Result < ( usize , MagicVariant ) > {
141
+ pub fn read_skippable_frame ( & mut self , dest : & mut [ u8 ] ) -> io:: Result < ( usize , MagicVariant ) > {
144
142
let mut bytes_to_seek = 0 ;
145
143
146
144
let res = ( || {
@@ -160,14 +158,13 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
160
158
bytes_to_seek = U32_SIZE * 2 ;
161
159
return Err ( io:: Error :: new ( io:: ErrorKind :: Other , "Unsupported frame parameter" ) ) ;
162
160
}
163
- if content_size > dest. capacity ( ) {
161
+ if content_size > dest. len ( ) {
164
162
bytes_to_seek = U32_SIZE * 2 ;
165
163
return Err ( io:: Error :: new ( io:: ErrorKind :: Other , "Destination buffer is too small" ) ) ;
166
164
}
167
165
168
166
if content_size > 0 {
169
- dest. resize ( content_size, 0 ) ;
170
- read_exact_or_seek_back ( self . reader . reader_mut ( ) , dest) ?;
167
+ read_exact_or_seek_back ( self . reader . reader_mut ( ) , & mut dest[ ..content_size] ) ?;
171
168
}
172
169
173
170
Ok ( ( magic_number, content_size) )
@@ -189,7 +186,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
189
186
Ok ( ( content_size, MagicVariant ( magic_variant as u8 ) ) )
190
187
}
191
188
192
- #[ cfg( feature = "experimental" ) ]
193
189
fn get_block_size ( & mut self ) -> io:: Result < ( usize , bool ) > {
194
190
let mut buffer = [ 0u8 ; U24_SIZE ] ;
195
191
self . reader . reader_mut ( ) . read_exact ( & mut buffer) ?;
@@ -201,7 +197,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
201
197
Ok ( ( compressed_size as usize , last_block != 0 ) )
202
198
}
203
199
204
- #[ cfg( feature = "experimental" ) ]
205
200
fn find_frame_compressed_size ( & mut self ) -> io:: Result < usize > {
206
201
const ZSTD_BLOCK_HEADER_SIZE : usize = 3 ;
207
202
@@ -241,7 +236,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
241
236
}
242
237
}
243
238
244
- #[ cfg( feature = "experimental" ) ]
245
239
fn frame_header_size ( & mut self ) -> io:: Result < ( usize , bool ) > {
246
240
use crate :: map_error_code;
247
241
const MAX_FRAME_HEADER_SIZE_PREFIX : usize = 5 ;
@@ -255,7 +249,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
255
249
Ok ( ( size, checksum_flag != 0 ) )
256
250
}
257
251
258
- #[ cfg( feature = "experimental" ) ]
259
252
/// Skip over a frame, without decompressing it.
260
253
pub fn skip_frame ( & mut self ) -> io:: Result < ( ) > {
261
254
let size = self . find_frame_compressed_size ( ) ?;
0 commit comments