Skip to content

Commit 118a6dc

Browse files
committed
Accept a slice instead of a Vec in read_skippable_frame
1 parent b0e5811 commit 118a6dc

File tree

2 files changed

+16
-23
lines changed

2 files changed

+16
-23
lines changed

src/stream/read/mod.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#[cfg(feature = "experimental")]
33
use std::cmp::min;
44
#[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};
77
#[cfg(feature = "experimental")]
88
use std::mem::size_of;
99

@@ -114,8 +114,8 @@ fn read_exact_or_seek_back<R: Read + Seek + ?Sized>(this: &mut R, mut buf: &mut
114114
}
115115
}
116116

117+
#[cfg(feature = "experimental")]
117118
impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
118-
#[cfg(feature = "experimental")]
119119
fn read_skippable_frame_size(&mut self) -> io::Result<usize> {
120120
let mut magic_buffer = [0u8; U32_SIZE];
121121
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>> {
130130
Ok(content_size + SKIPPABLEHEADERSIZE as usize)
131131
}
132132

133-
#[cfg(feature = "experimental")]
134133
fn seek_back(&mut self, bytes_count: usize) {
135134
if let Err(error) = self.reader.reader_mut().seek(SeekFrom::Current(-(bytes_count as i64))) {
136135
panic!("Error while seeking back to the start: {}", error);
137136
}
138137
}
139138

140-
#[cfg(feature = "experimental")]
141139
/// Attempt to read a skippable frame and write its content to `dest`.
142140
/// 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)> {
144142
let mut bytes_to_seek = 0;
145143

146144
let res = (|| {
@@ -160,14 +158,13 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
160158
bytes_to_seek = U32_SIZE * 2;
161159
return Err(io::Error::new(io::ErrorKind::Other, "Unsupported frame parameter"));
162160
}
163-
if content_size > dest.capacity() {
161+
if content_size > dest.len() {
164162
bytes_to_seek = U32_SIZE * 2;
165163
return Err(io::Error::new(io::ErrorKind::Other, "Destination buffer is too small"));
166164
}
167165

168166
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])?;
171168
}
172169

173170
Ok((magic_number, content_size))
@@ -189,7 +186,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
189186
Ok((content_size, MagicVariant(magic_variant as u8)))
190187
}
191188

192-
#[cfg(feature = "experimental")]
193189
fn get_block_size(&mut self) -> io::Result<(usize, bool)> {
194190
let mut buffer = [0u8; U24_SIZE];
195191
self.reader.reader_mut().read_exact(&mut buffer)?;
@@ -201,7 +197,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
201197
Ok((compressed_size as usize, last_block != 0))
202198
}
203199

204-
#[cfg(feature = "experimental")]
205200
fn find_frame_compressed_size(&mut self) -> io::Result<usize> {
206201
const ZSTD_BLOCK_HEADER_SIZE: usize = 3;
207202

@@ -241,7 +236,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
241236
}
242237
}
243238

244-
#[cfg(feature = "experimental")]
245239
fn frame_header_size(&mut self) -> io::Result<(usize, bool)> {
246240
use crate::map_error_code;
247241
const MAX_FRAME_HEADER_SIZE_PREFIX: usize = 5;
@@ -255,7 +249,6 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader<R>> {
255249
Ok((size, checksum_flag != 0))
256250
}
257251

258-
#[cfg(feature = "experimental")]
259252
/// Skip over a frame, without decompressing it.
260253
pub fn skip_frame(&mut self) -> io::Result<()> {
261254
let size = self.find_frame_compressed_size()?;

src/stream/zio/writer.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,8 @@ mod tests {
349349
let mut decoder = Decoder::new(data).unwrap().single_frame();
350350

351351
let mut frame = vec![0; 20];
352-
decoder.read_skippable_frame(&mut frame).unwrap();
353-
assert_eq!("test content", String::from_utf8_lossy(&frame));
352+
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
353+
assert_eq!("test content", String::from_utf8_lossy(&frame[..size]));
354354

355355
let inner = decoder.finish();
356356

@@ -370,8 +370,8 @@ mod tests {
370370
.single_frame()
371371
};
372372

373-
decoder.read_skippable_frame(&mut frame).unwrap();
374-
assert_eq!("SKIP", String::from_utf8_lossy(&frame));
373+
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
374+
assert_eq!("SKIP", String::from_utf8_lossy(&frame[..size]));
375375

376376
decoder.skip_frame().unwrap();
377377

@@ -382,8 +382,8 @@ mod tests {
382382
.single_frame()
383383
};
384384

385-
decoder.read_skippable_frame(&mut frame).unwrap();
386-
assert_eq!("end", String::from_utf8_lossy(&frame));
385+
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
386+
assert_eq!("end", String::from_utf8_lossy(&frame[..size]));
387387

388388
let inner = decoder.finish();
389389

@@ -429,10 +429,10 @@ mod tests {
429429
};
430430

431431
let mut frame = vec![0; 20];
432-
decoder.read_skippable_frame(&mut frame).unwrap();
433-
assert_eq!("SKIP", String::from_utf8_lossy(&frame));
432+
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
433+
assert_eq!("SKIP", String::from_utf8_lossy(&frame[..size]));
434434

435-
decoder.read_skippable_frame(&mut frame).unwrap();
436-
assert_eq!("second skip frame", String::from_utf8_lossy(&frame));
435+
let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap();
436+
assert_eq!("second skip frame", String::from_utf8_lossy(&frame[..size]));
437437
}
438438
}

0 commit comments

Comments
 (0)