use crate::write_xdr::WriteXDR;
use xdr_common::{BytesM, StaticIfNoAlloc, StringM, VecM};
pub trait EncodesAs<X: ?Sized>: WriteXDR {}
impl<X: ?Sized, U: EncodesAs<X> + ?Sized> EncodesAs<X> for &U {}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
impl<X: ?Sized, U: EncodesAs<X> + ?Sized> EncodesAs<X> for alloc::boxed::Box<U> {}
#[cfg(not(feature = "alloc"))]
impl<X: ?Sized, U: EncodesAs<X>> EncodesAs<X> for xdr_common::Box<U> {}
#[cfg(all(feature = "alloc", target_has_atomic = "ptr"))]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
impl<X: ?Sized, U: EncodesAs<X> + ?Sized> EncodesAs<X> for alloc::sync::Arc<U> {}
impl<X: StaticIfNoAlloc, U: EncodesAs<X>, const N: u32> EncodesAs<VecM<X, N>> for [U] {}
macro_rules! encodes_as_self {
( $( $t:ty ),* $(,)? ) => { $(
impl EncodesAs<$t> for $t {}
)* };
}
encodes_as_self! {
i16, i32, i64, u16, u32, u64, bool, f32, f64, str, (), core::convert::Infallible,
}
#[cfg(feature = "int128")]
encodes_as_self! { i128, u128 }
#[cfg(feature = "alloc")]
encodes_as_self! { alloc::string::String }
macro_rules! encodes_as_self_where_write_xdr {
( $( [$($g:tt)*] $t:ty ),* $(,)? ) => { $(
impl<$($g)*> EncodesAs<$t> for $t where $t: WriteXDR {}
)* };
}
encodes_as_self_where_write_xdr! {
[T] [T],
[T, const N: usize] [T; N],
[T] Option<T>,
[T, E] Result<T, E>,
[T] core::marker::PhantomData<T>,
[const MAX: u32] BytesM<MAX>,
[const MAX: u32] StringM<MAX>,
[T: StaticIfNoAlloc, const MAX: u32] VecM<T, MAX>,
}
#[cfg(feature = "alloc")]
encodes_as_self_where_write_xdr! { [T] alloc::vec::Vec<T> }
#[cfg(feature = "heapless")]
encodes_as_self_where_write_xdr! {
[T, const N: usize] ::heapless::Vec<T, N>,
[const N: usize] ::heapless::String<N>,
}
macro_rules! encodes_as_self_tuples {
() => {};
( $t0:ident $(, $t:ident)* ) => {
encodes_as_self_where_write_xdr! { [$t0 $(, $t)*] ($t0, $($t,)*) }
encodes_as_self_tuples! { $($t),* }
};
}
encodes_as_self_tuples! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 }