1use crate::{Encode, EncodeValue, Length, Result, Tag, Tagged, ValueOrd, Writer};
5use core::cmp::Ordering;
6
7pub struct EncodeRef<'a, T>(pub &'a T);
10
11impl<'a, T> AsRef<T> for EncodeRef<'a, T> {
12    fn as_ref(&self) -> &T {
13        self.0
14    }
15}
16
17impl<'a, T> Encode for EncodeRef<'a, T>
18where
19    T: Encode,
20{
21    fn encoded_len(&self) -> Result<Length> {
22        self.0.encoded_len()
23    }
24
25    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
26        self.0.encode(writer)
27    }
28}
29
30pub struct EncodeValueRef<'a, T>(pub &'a T);
35
36impl<'a, T> AsRef<T> for EncodeValueRef<'a, T> {
37    fn as_ref(&self) -> &T {
38        self.0
39    }
40}
41
42impl<'a, T> EncodeValue for EncodeValueRef<'a, T>
43where
44    T: EncodeValue,
45{
46    fn value_len(&self) -> Result<Length> {
47        self.0.value_len()
48    }
49
50    fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
51        self.0.encode_value(writer)
52    }
53}
54
55impl<'a, T> Tagged for EncodeValueRef<'a, T>
56where
57    T: Tagged,
58{
59    fn tag(&self) -> Tag {
60        self.0.tag()
61    }
62}
63
64impl<'a, T> ValueOrd for EncodeValueRef<'a, T>
65where
66    T: ValueOrd,
67{
68    fn value_cmp(&self, other: &Self) -> Result<Ordering> {
69        self.0.value_cmp(other.0)
70    }
71}