macro_rules! impl_len_for_wrapper {
($type:ty, $lenfield:tt) => {
impl $crate::data::views::Len for $type {
#[inline]
fn is_empty(&self) -> bool {
self.$lenfield.is_empty()
}
#[inline]
fn len(&self) -> usize {
self.$lenfield.len()
}
}
};
}
macro_rules! impl_len_for_views_generic {
($owned:ident, $view:ident, $viewmut:ident, $lenfield:tt) => {
$crate::data::views::impl_len_for_wrapper! {$owned, $lenfield}
$crate::data::views::impl_len_for_wrapper! {$view<'_>, $lenfield}
$crate::data::views::impl_len_for_wrapper! {$viewmut<'_>, $lenfield}
};
}
macro_rules! impl_view_assoc_types_generic {
($owned:ident, $view:ident, $viewmut:ident) => {
impl $crate::data::views::AssocOwnedType for $owned {
type Owned = $owned;
}
impl $crate::data::views::AssocViewType for $owned {
type View<'a> = $view<'a>;
}
impl $crate::data::views::AssocViewMutType for $owned {
type ViewMut<'a> = $viewmut<'a>;
}
impl $crate::data::views::AssocOwnedType for $view<'_> {
type Owned = $owned;
}
impl $crate::data::views::AssocViewType for $view<'_> {
type View<'a> = $view<'a>;
}
impl $crate::data::views::AssocViewMutType for $view<'_> {
type ViewMut<'a> = $viewmut<'a>;
}
impl $crate::data::views::AssocOwnedType for $viewmut<'_> {
type Owned = $owned;
}
impl $crate::data::views::AssocViewType for $viewmut<'_> {
type View<'a> = $view<'a>;
}
impl $crate::data::views::AssocViewMutType for $viewmut<'_> {
type ViewMut<'a> = $viewmut<'a>;
}
};
}
macro_rules! impl_view_conversion_generic {
($owned:ident, $view:ident, $viewmut:ident) => {
impl $crate::data::views::ToOwnedData for $view<'_> {
#[inline]
fn to_owned_data(&self) -> Self::Owned {
$owned(self.0.into())
}
}
impl $crate::data::views::ToOwnedData for $viewmut<'_> {
#[inline]
fn to_owned_data(&self) -> $owned {
$owned((&*self.0).into())
}
}
impl $crate::data::views::AsView for $owned {
fn as_view(&self) -> $view<'_> {
$view(&self.0)
}
}
impl $crate::data::views::AsView for $viewmut<'_> {
fn as_view(&self) -> $view<'_> {
$view(&self.0)
}
}
impl $crate::data::views::AsViewMut for $owned {
fn as_view_mut(&mut self) -> $viewmut<'_> {
$viewmut(&mut self.0)
}
}
impl<'a> $crate::data::views::ToView<'a> for $viewmut<'a> {
fn to_view(self) -> $view<'a> {
$view(self.0)
}
}
impl<'a> $crate::data::views::DataView<'a> for $view<'a> {
fn reborrow_view<'b>(&'b self) -> $view<'b>
where
'a: 'b, {
$view(self.0)
}
}
impl<'a> $crate::data::views::DataViewMut<'a> for $viewmut<'a> {
fn reborrow_view_mut<'b>(&'b mut self) -> $viewmut<'b>
where
'a: 'b, {
$viewmut(self.0)
}
}
};
}
macro_rules! impl_slice_for_wrapper {
($owned:ident, $view:ident, $viewmut:ident) => {
impl $crate::data::views::Slice for $owned {
#[inline]
fn slice<R: $crate::data::views::SliceRange>(&self, range: R) -> $view<'_> {
$view(&self.0[range])
}
#[inline]
fn get_slice<R: $crate::data::views::SliceRange>(&self, range: R) -> Option<$view<'_>> {
Some($view(self.0.get(range)?))
}
}
impl $crate::data::views::Slice for $view<'_> {
#[inline]
fn slice<R: $crate::data::views::SliceRange>(&self, range: R) -> $view<'_> {
$view(&self.0[range])
}
#[inline]
fn get_slice<R: $crate::data::views::SliceRange>(&self, range: R) -> Option<$view<'_>> {
Some($view(self.0.get(range)?))
}
}
impl $crate::data::views::SliceCopy for $view<'_> {
#[inline]
fn slice<R: $crate::data::views::SliceRange>(self, range: R) -> Self {
$view(&self.0[range])
}
#[inline]
fn get_slice<R: $crate::data::views::SliceRange>(self, range: R) -> Option<Self> {
Some($view(self.0.get(range)?))
}
}
impl $crate::data::views::Slice for $viewmut<'_> {
#[inline]
fn slice<R: $crate::data::views::SliceRange>(&self, range: R) -> $view<'_> {
$view(&self.0[range])
}
#[inline]
fn get_slice<R: $crate::data::views::SliceRange>(&self, range: R) -> Option<$view<'_>> {
Some($view(self.0.get(range)?))
}
}
impl $crate::data::views::SliceMut for $owned {
#[inline]
fn slice_mut<R: $crate::data::views::SliceRange>(&mut self, range: R) -> $viewmut<'_> {
$viewmut(&mut self.0[range])
}
#[inline]
fn get_slice_mut<R: $crate::data::views::SliceRange>(&mut self, range: R) -> Option<$viewmut<'_>> {
Some($viewmut(self.0.get_mut(range)?))
}
}
impl $crate::data::views::SliceMut for $viewmut<'_> {
#[inline]
fn slice_mut<R: $crate::data::views::SliceRange>(&mut self, range: R) -> $viewmut<'_> {
$viewmut(&mut self.0[range])
}
#[inline]
fn get_slice_mut<R: $crate::data::views::SliceRange>(&mut self, range: R) -> Option<$viewmut<'_>> {
Some($viewmut(self.0.get_mut(range)?))
}
}
};
}
macro_rules! impl_restrict_for_wrapper {
($owned:ident, $view:ident, $viewmut:ident) => {
impl<'a> $crate::data::views::Restrict for $view<'a> {
#[inline]
fn restrict<R: $crate::data::views::SliceRange>(&mut self, range: R) {
self.0 = &self.0[range];
}
#[inline]
fn clear(&mut self) {
self.0 = &[];
}
}
impl<'a> $crate::data::views::Restrict for $viewmut<'a> {
#[inline]
fn restrict<R: $crate::data::views::SliceRange>(&mut self, range: R) {
let data = std::mem::take(&mut self.0);
self.0 = &mut data[range];
}
#[inline]
fn clear(&mut self) {
self.0 = &mut [];
}
}
};
}
pub(crate) use impl_len_for_views_generic;
pub(crate) use impl_len_for_wrapper;
pub(crate) use impl_restrict_for_wrapper;
pub(crate) use impl_slice_for_wrapper;
pub(crate) use impl_view_assoc_types_generic;
pub(crate) use impl_view_conversion_generic;