summaryrefslogtreecommitdiff
path: root/shared/src/helper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/helper.rs')
-rw-r--r--shared/src/helper.rs22
1 files changed, 20 insertions, 2 deletions
diff --git a/shared/src/helper.rs b/shared/src/helper.rs
index d267f68..eb1f321 100644
--- a/shared/src/helper.rs
+++ b/shared/src/helper.rs
@@ -18,6 +18,7 @@ use crate::packets::{Data, Object, Resource};
use anyhow::Result;
use glam::{Affine3A, Vec2, Vec3A};
use std::{
+ borrow::Cow,
io::{Read, Write},
marker::PhantomData,
};
@@ -26,10 +27,10 @@ pub trait ReadWrite: Sized {
fn write(&self, w: &mut dyn Write) -> Result<()>;
fn read(r: &mut dyn Read) -> Result<Self>;
- fn write_alloc(&self) -> Vec<u8> {
+ fn write_alloc<'a>(&'a self) -> Cow<'a, [u8]> {
let mut buf = Vec::new();
self.write(&mut buf).unwrap();
- buf
+ Cow::Owned(buf)
}
}
@@ -66,6 +67,23 @@ impl ReadWrite for Vec<u8> {
Ok(buf)
}
}
+impl<'a> ReadWrite for Cow<'a, [u8]> {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self)?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut buf = Vec::new();
+ r.read_to_end(&mut buf)?;
+ Ok(Cow::Owned(buf))
+ }
+ fn write_alloc<'b>(&'b self) -> Cow<'b, [u8]> {
+ match self {
+ Cow::Borrowed(x) => Cow::Borrowed(x),
+ Cow::Owned(x) => Cow::Borrowed(&x),
+ }
+ }
+}
impl ReadWrite for Vec<Vec3A> {
fn write(&self, w: &mut dyn Write) -> Result<()> {
for e in self {