#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "alloc")]
use alloc::{boxed::Box, vec::Vec};
use crate::prelude::*;
pub trait RelativeEncodable<RelativeTo, Symbol = u8> {
async fn relative_encode<C>(&self, rel: &RelativeTo, consumer: &mut C) -> Result<(), C::Error>
where
C: BulkConsumer<Item = Symbol> + ?Sized;
fn can_be_encoded_relative_to(&self, rel: &RelativeTo) -> bool;
}
impl<T, RelativeTo, Symbol> RelativeEncodable<RelativeTo, Symbol> for &T where T: RelativeEncodable<RelativeTo, Symbol> {
async fn relative_encode<C>(&self, rel: &RelativeTo, consumer: &mut C) -> Result<(), C::Error>
where
C: BulkConsumer<Item = Symbol> + ?Sized {
(*self).relative_encode(rel, consumer).await
}
fn can_be_encoded_relative_to(&self, rel: &RelativeTo) -> bool {
(*self).can_be_encoded_relative_to(rel)
}
}
pub trait RelativeEncodableExt<RelativeTo, Symbol = u8>:
RelativeEncodable<RelativeTo, Symbol>
{
#[cfg(feature = "alloc")]
async fn new_vec_storing_relative_encoding(&self, rel: &RelativeTo) -> Vec<Symbol>
where
Symbol: Default,
{
let mut c = Vec::new().into_consumer();
match self.relative_encode(rel, &mut c).await {
Ok(()) => c.into(),
Err(_) => unreachable!(),
}
}
}
impl<T, RelativeTo, S> RelativeEncodableExt<RelativeTo, S> for T where
T: RelativeEncodable<RelativeTo, S>
{
}
pub trait RelativeEncodableKnownLength<RelativeTo, Symbol = u8>:
RelativeEncodable<RelativeTo, Symbol>
{
fn len_of_relative_encoding(&self, rel: &RelativeTo) -> usize;
}
impl<T, RelativeTo, Symbol> RelativeEncodableKnownLength<RelativeTo, Symbol> for &T where T: RelativeEncodableKnownLength<RelativeTo, Symbol> {
fn len_of_relative_encoding(&self, rel: &RelativeTo) -> usize {
(*self).len_of_relative_encoding(rel)
}
}
pub trait RelativeEncodableKnownLengthExt<RelativeTo, Symbol = u8>:
RelativeEncodableKnownLength<RelativeTo, Symbol>
{
#[cfg(feature = "alloc")]
async fn new_boxed_slice_storing_relative_encoding(&self, rel: &RelativeTo) -> Box<[Symbol]>
where
Symbol: Default,
{
let mut c = Vec::with_capacity(self.len_of_relative_encoding(rel)).into_consumer();
match self.relative_encode(rel, &mut c).await {
Ok(()) => Vec::<Symbol>::from(c).into_boxed_slice(),
Err(_) => unreachable!(),
}
}
}
impl<T, S> RelativeEncodableKnownLengthExt<S> for T where T: RelativeEncodableKnownLength<S> {}