extract slice_deserializer

This commit is contained in:
AF 2023-04-23 00:31:59 +00:00
parent 25c15837d9
commit 5869c185ed
2 changed files with 41 additions and 36 deletions

View File

@ -2,11 +2,13 @@
//! Brings [`Mentionable`]/[`Factory`]/[`Origin`] concepts from the original implementation in Python.
//! Allows for more generic behaviour via [`Context`], as opposed to original async-only.
mod slice_deserializer;
mod typeless;
pub use slice_deserializer::*;
pub use typeless::*;
use std::{cmp::min, error::Error, fmt::Display, rc::Rc};
use std::{error::Error, fmt::Display, rc::Rc};
use crate::func::*;
@ -328,41 +330,6 @@ impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> ExtFactory<'a, Ctx> for F {
}
}
/// [Deserializer] for slices. Used in [`ExtFactory::parse_slice`] and [`crate::std::atomic::ExtAtomic::parse_slice`].
pub struct SliceDeserializer<'a> {
slice: &'a [u8],
pos: usize,
}
impl<'a> From<&'a [u8]> for SliceDeserializer<'a> {
fn from(value: &'a [u8]) -> Self {
SliceDeserializer {
slice: value,
pos: 0,
}
}
}
impl<'a> Deserializer for SliceDeserializer<'a> {
fn read_n(&mut self, n: usize) -> &[u8] {
let (left, right) = self.slice.split_at(min(n, self.slice.len()));
self.slice = right;
self.pos += left.len();
left
}
fn read_all(&mut self) -> &[u8] {
let left = self.slice;
self.slice = &[];
self.pos += left.len();
left
}
fn tell(&self) -> usize {
self.pos
}
}
impl Serializer for Vec<u8> {
fn write(&mut self, buf: &[u8]) {
self.extend(buf);

View File

@ -0,0 +1,38 @@
use std::cmp::min;
use super::*;
/// [Deserializer] for slices. Used in [`ExtFactory::parse_slice`] and [`crate::std::atomic::ExtAtomic::parse_slice`].
pub struct SliceDeserializer<'a> {
slice: &'a [u8],
pos: usize,
}
impl<'a> From<&'a [u8]> for SliceDeserializer<'a> {
fn from(value: &'a [u8]) -> Self {
SliceDeserializer {
slice: value,
pos: 0,
}
}
}
impl<'a> Deserializer for SliceDeserializer<'a> {
fn read_n(&mut self, n: usize) -> &[u8] {
let (left, right) = self.slice.split_at(min(n, self.slice.len()));
self.slice = right;
self.pos += left.len();
left
}
fn read_all(&mut self) -> &[u8] {
let left = self.slice;
self.slice = &[];
self.pos += left.len();
left
}
fn tell(&self) -> usize {
self.pos
}
}