zoe 0.0.31

A nightly library for viral genomics
Documentation
/// A macro for implementing [`Len`], given the type and the name of the field
/// which determines the length.
///
/// [`Len`]: crate::data::views::Len
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()
            }
        }
    };
}

/// A macro for implementing [`Len`], given the owning type, the view type, the
/// mutable view type, and the name of the field which determines the length.
/// The lifetime parameter is assumed to be a generic on the view types.
///
/// [`Len`]: crate::data::views::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}
    };
}

/// A macro for implementing the associated type traits for views, given the
/// owned type, the view type, and the mutable view type. The lifetime parameter
/// is assumed to be a generic on the view types.
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>;
        }
    };
}

/// A macro for implementing traits for converting between owned and view types,
/// assuming that the lifetime on the view types is a generic.
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)
            }
        }
    };
}

/// A macro for implementing [`Slice`] and [`SliceMut`] for wrapper types.
///
/// [`Slice`]: crate::data::views::traits::Slice
/// [`SliceMut`]: crate::data::views::traits::SliceMut
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;