Skip to content

Instantly share code, notes, and snippets.

@Yoplitein
Last active February 7, 2025 04:17
Show Gist options
  • Save Yoplitein/6806428bba16b9270bdfa95bfee0a8f5 to your computer and use it in GitHub Desktop.
Save Yoplitein/6806428bba16b9270bdfa95bfee0a8f5 to your computer and use it in GitHub Desktop.
use std::io::{self, Read, Write};
use num_traits::{FromBytes, ToBytes};
trait ReadPrimitive {
fn read_le_primitive<Prim: FromBytes>(&mut self) -> io::Result<Prim>
where
Prim::Bytes: Default;
fn read_be_primitive<Prim: FromBytes>(&mut self) -> io::Result<Prim>
where
Prim::Bytes: Default;
fn read_ne_primitive<Prim: FromBytes>(&mut self) -> io::Result<Prim>
where
Prim::Bytes: Default;
}
impl<T: io::Read> ReadPrimitive for T {
fn read_le_primitive<Prim: FromBytes>(&mut self) -> io::Result<Prim>
where
Prim::Bytes: Default,
{
let mut buf = Prim::Bytes::default();
self.read_exact(buf.as_mut())?;
Ok(Prim::from_le_bytes(&buf))
}
fn read_be_primitive<Prim: FromBytes>(&mut self) -> io::Result<Prim>
where
Prim::Bytes: Default,
{
let mut buf = Prim::Bytes::default();
self.read_exact(buf.as_mut())?;
Ok(Prim::from_be_bytes(&buf))
}
fn read_ne_primitive<Prim: FromBytes>(&mut self) -> io::Result<Prim>
where
Prim::Bytes: Default,
{
let mut buf = Prim::Bytes::default();
self.read_exact(buf.as_mut())?;
Ok(Prim::from_ne_bytes(&buf))
}
}
trait WritePrimitive {
fn write_le_primitive<Prim: ToBytes>(&mut self, v: Prim) -> io::Result<()>;
fn write_be_primitive<Prim: ToBytes>(&mut self, v: Prim) -> io::Result<()>;
fn write_ne_primitive<Prim: ToBytes>(&mut self, v: Prim) -> io::Result<()>;
}
impl<T: io::Write> WritePrimitive for T {
fn write_le_primitive<Prim: ToBytes>(&mut self, v: Prim) -> io::Result<()> {
let bytes = v.to_le_bytes();
self.write_all(bytes.as_ref())
}
fn write_be_primitive<Prim: ToBytes>(&mut self, v: Prim) -> io::Result<()> {
let bytes = v.to_be_bytes();
self.write_all(bytes.as_ref())
}
fn write_ne_primitive<Prim: ToBytes>(&mut self, v: Prim) -> io::Result<()> {
let bytes = v.to_ne_bytes();
self.write_all(bytes.as_ref())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment