id_sys 0.1.0

Provides data structures which can be marked such that they only work with similarly marked integer data types.
Documentation
use crate::{extends::Extends, IdVec};

impl<TMarker: ?Sized, TValue> IdVec<TMarker, TValue> {
    pub const fn downcast_as<TExtendedMarker: ?Sized>(&self) -> &IdVec<TExtendedMarker, TValue>
    where
        TExtendedMarker: Extends<TMarker>,
    {
        IdVec::from_vec_ref(self.as_vec())
    }

    pub const fn upcast_as<TExtendedMarker: ?Sized>(&self) -> &IdVec<TExtendedMarker, TValue>
    where
        TMarker: Extends<TExtendedMarker>,
    {
        IdVec::from_vec_ref(self.as_vec())
    }

    pub fn downcast_as_mut<TExtendedMarker: ?Sized>(
        &mut self,
    ) -> &mut IdVec<TExtendedMarker, TValue>
    where
        TExtendedMarker: Extends<TMarker>,
    {
        IdVec::from_mut_vec(self.as_mut_vec())
    }

    pub fn upcast_as_mut<TExtendedMarker: ?Sized>(&mut self) -> &mut IdVec<TExtendedMarker, TValue>
    where
        TMarker: Extends<TExtendedMarker>,
    {
        IdVec::from_mut_vec(self.as_mut_vec())
    }

    pub fn downcast_into<TExtendedMarker: ?Sized>(self) -> IdVec<TExtendedMarker, TValue>
    where
        TExtendedMarker: Extends<TMarker>,
    {
        IdVec::from_vec(self.into_vec())
    }

    pub fn upcast_into<TExtendedMarker: ?Sized>(self) -> IdVec<TExtendedMarker, TValue>
    where
        TMarker: Extends<TExtendedMarker>,
    {
        IdVec::from_vec(self.into_vec())
    }
}