mirror of https://git.sr.ht/~stygianentity/bincode
deduplicate slicing logic SliceReader
This commit is contained in:
parent
28da4dbf56
commit
858cee9a22
|
|
@ -46,6 +46,17 @@ impl<'storage> SliceReader<'storage> {
|
||||||
pub fn new(bytes: &'storage [u8]) -> SliceReader<'storage> {
|
pub fn new(bytes: &'storage [u8]) -> SliceReader<'storage> {
|
||||||
SliceReader { slice: bytes }
|
SliceReader { slice: bytes }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
fn get_byte_slice(&mut self, length: usize) -> Result<&'storage [u8]> {
|
||||||
|
if length > self.slice.len() {
|
||||||
|
return Err(SliceReader::unexpected_eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
let s = &self.slice[..length];
|
||||||
|
self.slice = &self.slice[length..];
|
||||||
|
Ok(s)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<R> IoReader<R> {
|
impl<R> IoReader<R> {
|
||||||
|
|
@ -97,28 +108,16 @@ impl<'storage> BincodeRead<'storage> for SliceReader<'storage> {
|
||||||
V: serde::de::Visitor<'storage>,
|
V: serde::de::Visitor<'storage>,
|
||||||
{
|
{
|
||||||
use ErrorKind;
|
use ErrorKind;
|
||||||
if length > self.slice.len() {
|
let string = match ::std::str::from_utf8(self.get_byte_slice(length)?) {
|
||||||
return Err(SliceReader::unexpected_eof());
|
|
||||||
}
|
|
||||||
|
|
||||||
let string = match ::std::str::from_utf8(&self.slice[..length]) {
|
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(e) => return Err(ErrorKind::InvalidUtf8Encoding(e).into()),
|
Err(e) => return Err(ErrorKind::InvalidUtf8Encoding(e).into()),
|
||||||
};
|
};
|
||||||
let r = visitor.visit_borrowed_str(string);
|
visitor.visit_borrowed_str(string)
|
||||||
self.slice = &self.slice[length..];
|
|
||||||
r
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn get_byte_buffer(&mut self, length: usize) -> Result<Vec<u8>> {
|
fn get_byte_buffer(&mut self, length: usize) -> Result<Vec<u8>> {
|
||||||
if length > self.slice.len() {
|
self.get_byte_slice(length).map(|x| x.to_vec())
|
||||||
return Err(SliceReader::unexpected_eof());
|
|
||||||
}
|
|
||||||
|
|
||||||
let r = &self.slice[..length];
|
|
||||||
self.slice = &self.slice[length..];
|
|
||||||
Ok(r.to_vec())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|
@ -126,13 +125,7 @@ impl<'storage> BincodeRead<'storage> for SliceReader<'storage> {
|
||||||
where
|
where
|
||||||
V: serde::de::Visitor<'storage>,
|
V: serde::de::Visitor<'storage>,
|
||||||
{
|
{
|
||||||
if length > self.slice.len() {
|
visitor.visit_borrowed_bytes(self.get_byte_slice(length)?)
|
||||||
return Err(SliceReader::unexpected_eof());
|
|
||||||
}
|
|
||||||
|
|
||||||
let r = visitor.visit_borrowed_bytes(&self.slice[..length]);
|
|
||||||
self.slice = &self.slice[length..];
|
|
||||||
r
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue