valence_protocol/impls/
pointer.rs

1use std::borrow::Cow;
2use std::io::Write;
3use std::rc::Rc;
4use std::sync::Arc;
5
6use crate::{Decode, Encode};
7
8impl<T: Encode + ?Sized> Encode for &T {
9    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
10        (**self).encode(w)
11    }
12}
13
14impl<T: Encode + ?Sized> Encode for &mut T {
15    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
16        (**self).encode(w)
17    }
18}
19
20impl<T: Encode + ?Sized> Encode for Box<T> {
21    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
22        self.as_ref().encode(w)
23    }
24}
25
26impl<'a, T: Decode<'a>> Decode<'a> for Box<T> {
27    fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
28        T::decode(r).map(Box::new)
29    }
30}
31
32impl<T: Encode + ?Sized> Encode for Rc<T> {
33    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
34        self.as_ref().encode(w)
35    }
36}
37
38impl<'a, T: Decode<'a>> Decode<'a> for Rc<T> {
39    fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
40        T::decode(r).map(Rc::new)
41    }
42}
43
44impl<T: Encode + ?Sized> Encode for Arc<T> {
45    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
46        self.as_ref().encode(w)
47    }
48}
49
50impl<'a, T: Decode<'a>> Decode<'a> for Arc<T> {
51    fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
52        T::decode(r).map(Arc::new)
53    }
54}
55
56impl<B> Encode for Cow<'_, B>
57where
58    B: ToOwned + Encode + ?Sized,
59{
60    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
61        self.as_ref().encode(w)
62    }
63}
64
65impl<'a, B> Decode<'a> for Cow<'_, B>
66where
67    B: ToOwned + ?Sized,
68    B::Owned: Decode<'a>,
69{
70    fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
71        B::Owned::decode(r).map(Cow::Owned)
72    }
73}