From 9f5d815e932c9c01265fec2f5a079470d73d6cc8 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 12 Jan 2025 23:35:00 +0100 Subject: zero copy texture write --- shared/src/helper.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'shared/src/helper.rs') 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; - fn write_alloc(&self) -> Vec { + 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 { 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 { + 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 { fn write(&self, w: &mut dyn Write) -> Result<()> { for e in self { -- cgit v1.2.3-70-g09d2