diff --git a/src/de/impls.rs b/src/de/impls.rs new file mode 100644 index 0000000..131750e --- /dev/null +++ b/src/de/impls.rs @@ -0,0 +1,8 @@ +use super::{Decode, Decodable}; +use crate::error::Error; + +impl Decodable for u32 { + fn decode(mut decoder: D) -> Result { + decoder.decode_u32() + } +} \ No newline at end of file diff --git a/src/de/mod.rs b/src/de/mod.rs new file mode 100644 index 0000000..4b4c348 --- /dev/null +++ b/src/de/mod.rs @@ -0,0 +1,48 @@ +use core::marker::PhantomData; + +use crate::{ + config::{Config, Endian}, + error::Error, +}; +use read::Reader; + +mod impls; +pub mod read; + + + +pub trait Decodable: Sized { + fn decode(decoder: D) -> Result; +} + +pub trait Decode { + fn decode_u32(&mut self) -> Result; +} + +pub struct Decoder { + reader: R, + config: PhantomData, +} + +impl<'de, R: Reader<'de>, C: Config> Decoder { + pub fn new(reader: R) -> Decoder { + Decoder { + reader, + config: PhantomData, + } + } +} + +impl<'a, 'de, R: Reader<'de>, C: Config> Decode for &'a mut Decoder { + fn decode_u32(&mut self) -> Result { + let mut bytes = [0u8; 4]; + + self.reader.read(bytes.as_mut())?; + Ok(match C::ENDIAN { + Endian::Little => u32::from_le_bytes(bytes), + Endian::Big => u32::from_be_bytes(bytes), + }) + } +} + + diff --git a/src/de.rs b/src/de/read.rs similarity index 55% rename from src/de.rs rename to src/de/read.rs index ad15112..6e4270d 100644 --- a/src/de.rs +++ b/src/de/read.rs @@ -1,9 +1,4 @@ -use core::marker::PhantomData; - -use crate::{ - config::{Config, Endian}, - error::Error, -}; +use crate::error::Error; pub trait Reader<'storage> { fn read(&mut self, bytes: &mut [u8]) -> Result<(), Error>; @@ -12,46 +7,6 @@ pub trait Reader<'storage> { F: Fn(&'storage [u8]) -> R; } -pub trait Decodable: Sized { - fn decode(decoder: D) -> Result; -} - -pub trait Decode { - fn decode_u32(&mut self) -> Result; -} - -pub struct Decoder { - reader: R, - config: PhantomData, -} - -impl<'de, R: Reader<'de>, C: Config> Decoder { - pub fn new(reader: R) -> Decoder { - Decoder { - reader, - config: PhantomData, - } - } -} - -impl<'a, 'de, R: Reader<'de>, C: Config> Decode for &'a mut Decoder { - fn decode_u32(&mut self) -> Result { - let mut bytes = [0u8; 4]; - - self.reader.read(bytes.as_mut())?; - Ok(match C::ENDIAN { - Endian::Little => u32::from_le_bytes(bytes), - Endian::Big => u32::from_be_bytes(bytes), - }) - } -} - -impl Decodable for u32 { - fn decode(mut decoder: D) -> Result { - decoder.decode_u32() - } -} - pub struct SliceReader<'storage> { slice: &'storage [u8], } @@ -75,7 +30,7 @@ impl<'storage> SliceReader<'storage> { impl<'storage> Reader<'storage> for SliceReader<'storage> { #[inline(always)] - fn read(&mut self, bytes: &mut [u8]) -> Result<(), Error> { + fn read<'a>(&'a mut self, bytes: &mut [u8]) -> Result<(), Error> { if bytes.len() > self.slice.len() { return Err(Error::UnexpectedEnd); } @@ -93,4 +48,4 @@ impl<'storage> Reader<'storage> for SliceReader<'storage> { { Ok(visitor(self.get_byte_slice(length)?)) } -} +} \ No newline at end of file diff --git a/src/enc/impls.rs b/src/enc/impls.rs new file mode 100644 index 0000000..87a149a --- /dev/null +++ b/src/enc/impls.rs @@ -0,0 +1,8 @@ +use super::{Encode, Encodeable}; +use crate::error::Error; + +impl Encodeable for u32 { + fn encode(&self, mut encoder: E) -> Result<(), Error> { + encoder.encode_u32(*self) + } +} \ No newline at end of file diff --git a/src/enc/mod.rs b/src/enc/mod.rs new file mode 100644 index 0000000..caf67a6 --- /dev/null +++ b/src/enc/mod.rs @@ -0,0 +1,44 @@ +use core::marker::PhantomData; + +use crate::{ + config::{Config, Endian}, + error::Error, +}; +use write::Writer; + +mod impls; +pub mod write; + + +pub trait Encodeable { + fn encode(&self, encoder: E) -> Result<(), Error>; +} + +pub trait Encode { + fn encode_u32(&mut self, val: u32) -> Result<(), Error>; +} + +pub struct Encoder { + writer: W, + config: PhantomData, +} + +impl Encoder { + pub fn new(writer: W) -> Encoder { + Encoder { + writer, + config: PhantomData, + } + } +} + +impl<'a, W: Writer, C: Config> Encode for &'a mut Encoder { + fn encode_u32(&mut self, val: u32) -> Result<(), Error> { + let bytes = match C::ENDIAN { + Endian::Little => val.to_le_bytes(), + Endian::Big => val.to_be_bytes(), + }; + + self.writer.write(&bytes) + } +} \ No newline at end of file diff --git a/src/enc/write.rs b/src/enc/write.rs new file mode 100644 index 0000000..6d33e1a --- /dev/null +++ b/src/enc/write.rs @@ -0,0 +1,30 @@ +use crate::error::Error; + +pub trait Writer { + fn write(&mut self, bytes: &[u8]) -> Result<(), Error>; +} + +pub struct SliceWriter<'storage> { + slice: &'storage mut [u8], +} + +impl<'storage> SliceWriter<'storage> { + pub(crate) fn new(bytes: &'storage mut [u8]) -> SliceWriter<'storage> { + SliceWriter { + slice: bytes, + } + } +} + +impl<'storage> Writer for SliceWriter<'storage> { + fn write(&mut self, bytes: &[u8]) -> Result<(), Error> { + if bytes.len() > self.slice.len() { + return Err(Error::UnexpectedEnd); + } + let data = core::mem::take(&mut self.slice); + let (write_slice, remaining) = data.split_at_mut(bytes.len()); + write_slice.copy_from_slice(bytes); + self.slice = remaining; + Ok(()) + } +} \ No newline at end of file diff --git a/src/int_encoding.rs b/src/int_encoding.rs index 89c7005..cb81454 100644 --- a/src/int_encoding.rs +++ b/src/int_encoding.rs @@ -1,4 +1,4 @@ -use crate::{error::Error, ser::Writer}; +use crate::{error::Error, enc::write::Writer}; pub trait IntEncoding { fn encode_u32(writer: &mut W, val: u32) -> Result<(), Error>; diff --git a/src/lib.rs b/src/lib.rs index 677a188..16aa95a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,18 +18,18 @@ extern crate std; pub mod config; pub mod de; pub mod error; -pub mod ser; +pub mod enc; pub(crate) mod int_encoding; -pub fn encode_into_slice(val: E, dst: &mut [u8]) -> Result<(), error::Error> { - let writer = ser::SliceWriter::new(dst); - let mut encoder = ser::Encoder::<_, config::Default>::new(writer); +pub fn encode_into_slice(val: E, dst: &mut [u8]) -> Result<(), error::Error> { + let writer = enc::write::SliceWriter::new(dst); + let mut encoder = enc::Encoder::<_, config::Default>::new(writer); val.encode(&mut encoder) } pub fn decode(src: &mut [u8]) -> Result { - let reader = de::SliceReader::new(src); + let reader = de::read::SliceReader::new(src); let mut decoder = de::Decoder::<_, config::Default>::new(reader); D::decode(&mut decoder) } diff --git a/src/ser.rs b/src/ser.rs deleted file mode 100644 index 24ca57b..0000000 --- a/src/ser.rs +++ /dev/null @@ -1,77 +0,0 @@ -use core::marker::PhantomData; - -use crate::{ - config::{Config, Endian}, - error::Error, -}; - -pub trait Writer { - fn write(&mut self, bytes: &[u8]) -> Result<(), Error>; -} - -pub trait Encodeable { - fn encode(&self, encoder: E) -> Result<(), Error>; -} - -pub trait Encode { - fn encode_u32(&mut self, val: u32) -> Result<(), Error>; -} - -pub struct Encoder { - writer: W, - config: PhantomData, -} - -impl Encoder { - pub fn new(writer: W) -> Encoder { - Encoder { - writer, - config: PhantomData, - } - } -} - -impl<'a, W: Writer, C: Config> Encode for &'a mut Encoder { - fn encode_u32(&mut self, val: u32) -> Result<(), Error> { - let bytes = match C::ENDIAN { - Endian::Little => val.to_le_bytes(), - Endian::Big => val.to_be_bytes(), - }; - - self.writer.write(&bytes) - } -} - -impl Encodeable for u32 { - fn encode(&self, mut encoder: E) -> Result<(), Error> { - encoder.encode_u32(*self) - } -} - -pub struct SliceWriter<'storage> { - slice: &'storage mut [u8], - cursor: usize, -} - -impl<'storage> SliceWriter<'storage> { - pub(crate) fn new(bytes: &'storage mut [u8]) -> SliceWriter<'storage> { - SliceWriter { - slice: bytes, - cursor: 0, - } - } -} - -impl<'storage> Writer for SliceWriter<'storage> { - fn write(&mut self, bytes: &[u8]) -> Result<(), Error> { - if bytes.len() - self.cursor > self.slice.len() { - return Err(Error::UnexpectedEnd); - } - let temp = &mut self.slice[self.cursor..bytes.len()]; - - temp.copy_from_slice(bytes); - self.cursor += bytes.len(); - - Ok(()) - } -} diff --git a/tests/test.rs b/tests/test.rs index 45cdc23..db65476 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -4,7 +4,7 @@ use core::fmt::Debug; fn the_same(element: V) where - V: bincode::ser::Encodeable + bincode::de::Decodable + PartialEq + Debug + Clone + 'static, + V: bincode::enc::Encodeable + bincode::de::Decodable + PartialEq + Debug + Clone + 'static, { let mut buffer = [0u8; 32]; bincode::encode_into_slice(element.clone(), &mut buffer).unwrap();