//! Wrapper object for encoding reference types.
// TODO(tarcieri): replace with blanket impls of `Encode(Value)` for reference types?

use crate::{Encode, EncodeValue, Length, Result, Tag, Tagged, ValueOrd, Writer};
use core::cmp::Ordering;

/// Reference encoder: wrapper type which impls `Encode` for any reference to a
/// type which impls the same.
pub struct EncodeRef<'a, T>(pub &'a T);

impl<'a, T> AsRef<T> for EncodeRef<'a, T> {
    fn as_ref(&self) -> &T {
        self.0
    }
}

impl<'a, T> Encode for EncodeRef<'a, T>
where
    T: Encode,
{
    fn encoded_len(&self) -> Result<Length> {
        self.0.encoded_len()
    }

    fn encode(&self, writer: &mut dyn Writer) -> Result<()> {
        self.0.encode(writer)
    }
}

/// Reference value encoder: wrapper type which impls `EncodeValue` and `Tagged`
/// for any reference type which impls the same.
///
/// By virtue of the blanket impl, this type also impls `Encode`.
pub struct EncodeValueRef<'a, T>(pub &'a T);

impl<'a, T> AsRef<T> for EncodeValueRef<'a, T> {
    fn as_ref(&self) -> &T {
        self.0
    }
}

impl<'a, T> EncodeValue for EncodeValueRef<'a, T>
where
    T: EncodeValue,
{
    fn value_len(&self) -> Result<Length> {
        self.0.value_len()
    }

    fn encode_value(&self, writer: &mut dyn Writer) -> Result<()> {
        self.0.encode_value(writer)
    }
}

impl<'a, T> Tagged for EncodeValueRef<'a, T>
where
    T: Tagged,
{
    fn tag(&self) -> Tag {
        self.0.tag()
    }
}

impl<'a, T> ValueOrd for EncodeValueRef<'a, T>
where
    T: ValueOrd,
{
    fn value_cmp(&self, other: &Self) -> Result<Ordering> {
        self.0.value_cmp(other.0)
    }
}
