1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
use crate::prelude::*; #[derive(Default)] pub struct BoxWriter<T> { writer: T, } pub struct BoxReader<T> { reader: T, } impl<'a, T: Writer<'a>> Writer<'a> for BoxWriter<T> { type Write=Box<T::Write>; fn write<'b : 'a>(&mut self, value: &'b Self::Write) { self.writer.write(value); } fn flush<ParentBranch: StaticBranch>(self, branch: ParentBranch, bytes: &mut Vec<u8>, lens: &mut Vec<usize>) { let Self { writer } = self; writer.flush(branch, bytes, lens); } } impl<T: Reader> Reader for BoxReader<T> { type Read=Box<T::Read>; fn new<ParentBranch: StaticBranch>(sticks: DynBranch<'_>, branch: ParentBranch) -> ReadResult<Self> { Ok(BoxReader { reader: T::new(sticks, branch)? }) } fn read(&mut self) -> ReadResult<Self::Read> { Ok(Box::new(self.reader.read()?)) } } impl<'a, T: Writable<'a>> Writable<'a> for Box<T> { type Writer=BoxWriter<T::Writer>; } impl<'a, T: Readable> Readable for Box<T> { type Reader=BoxReader<T::Reader>; }