der/
encode_ref.rs

1//! Wrapper object for encoding reference types.
2// TODO(tarcieri): replace with blanket impls of `Encode(Value)` for reference types?
3
4use crate::{Encode, EncodeValue, Length, Result, Tag, Tagged, ValueOrd, Writer};
5use core::cmp::Ordering;
6
7/// Reference encoder: wrapper type which impls `Encode` for any reference to a
8/// type which impls the same.
9pub 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
30/// Reference value encoder: wrapper type which impls `EncodeValue` and `Tagged`
31/// for any reference type which impls the same.
32///
33/// By virtue of the blanket impl, this type also impls `Encode`.
34pub 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}