summaryrefslogtreecommitdiff
path: root/src/codec/decode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/decode.rs')
-rw-r--r--src/codec/decode.rs88
1 files changed, 86 insertions, 2 deletions
diff --git a/src/codec/decode.rs b/src/codec/decode.rs
index 65f08b5..1059811 100644
--- a/src/codec/decode.rs
+++ b/src/codec/decode.rs
@@ -1,7 +1,91 @@
-use std::io::{self, Read};
+use std::{io::Read, sync::Arc};
+
+use crate::DEFAULT_BUFFER_LEN;
+
+macro_rules! impl_decode {
+ ($type: ty) => {
+ impl Decode for $type {
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self>
+ where
+ Self: Sized,
+ {
+ const BYTES: usize = (<$type>::BITS / 8) as usize;
+ let mut bytes = [0; BYTES];
+ reader.read_exact(&mut bytes)?;
+ Ok(<$type>::from_be_bytes(bytes))
+ }
+ }
+ };
+}
pub trait Decode {
- fn decode(reader: &impl Read) -> io::Result<Self>
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self>
where
Self: Sized;
}
+
+impl Decode for bool {
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self>
+ where
+ Self: Sized,
+ {
+ let mut byte = [0_u8];
+ reader.read_exact(&mut byte)?;
+ Ok(byte[0] != 0)
+ }
+}
+
+impl Decode for Arc<[u8]> {
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> {
+ let mut buf = Vec::with_capacity(DEFAULT_BUFFER_LEN);
+ reader.read_to_end(&mut buf)?;
+ Ok(Arc::<[u8]>::from(buf.into_boxed_slice()))
+ }
+}
+
+impl<const S: usize> Decode for [u8; S] {
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self>
+ where
+ Self: Sized,
+ {
+ let mut slice = [0_u8; S];
+ reader.read_exact(&mut slice)?;
+ Ok(slice)
+ }
+}
+
+impl_decode!(u8);
+impl_decode!(u16);
+impl_decode!(u32);
+impl_decode!(u64);
+impl_decode!(u128);
+impl_decode!(usize);
+
+impl_decode!(i8);
+impl_decode!(i16);
+impl_decode!(i32);
+impl_decode!(i64);
+impl_decode!(i128);
+impl_decode!(isize);
+
+impl Decode for f64 {
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self>
+ where
+ Self: Sized,
+ {
+ let bits = u64::decode(reader)?;
+ let value = f64::from_bits(bits);
+ Ok(value)
+ }
+}
+
+impl Decode for f32 {
+ fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self>
+ where
+ Self: Sized,
+ {
+ let bits = u32::decode(reader)?;
+ let value = f32::from_bits(bits);
+ Ok(value)
+ }
+}