use alloc::borrow::Cow;
use crate::{
CellCowExt, CellSliceExt, CowPolicy, MelinoeMut, MelinoeRef, ReadPermit, RetainDecision,
WritePermit,
};
use super::BrandedVec;
impl<'brand, T> BrandedVec<'brand, T> {
#[inline]
pub fn get<'a, P>(&'a self, index: usize, permit: P) -> Option<MelinoeRef<'a, 'brand, T>>
where
P: ReadPermit<'brand> + 'a,
{
self.cells.get(index).map(|cell| cell.borrow(permit))
}
#[inline]
pub fn get_mut<'a, P>(&'a self, index: usize, permit: P) -> Option<MelinoeMut<'a, 'brand, T>>
where
P: WritePermit<'brand> + 'a,
{
self.cells.get(index).map(|cell| cell.borrow_mut(permit))
}
#[inline]
pub fn as_slice<'a, P>(&'a self, permit: P) -> &'a [T]
where
P: ReadPermit<'brand> + 'a,
{
self.cells.borrow_slice(permit)
}
#[inline]
pub fn as_mut_slice<'a, P>(&'a self, permit: P) -> &'a mut [T]
where
P: WritePermit<'brand> + 'a,
{
self.cells.borrow_slice_mut(permit)
}
#[inline]
pub fn borrow_cow<'a, P>(&'a self, permit: P) -> Cow<'a, [T]>
where
T: Clone,
P: ReadPermit<'brand> + 'a,
{
self.cells.borrow_cow(permit)
}
#[inline]
pub fn retain_cow<'a, P>(&'a self, permit: P) -> Cow<'a, [T]>
where
T: Clone,
P: ReadPermit<'brand> + 'a,
{
self.cells.retain_cow(permit)
}
#[inline]
pub fn cow_with<'a, P, C>(&'a self, permit: P, policy: C) -> Cow<'a, [T]>
where
T: Clone,
P: ReadPermit<'brand> + 'a,
C: CowPolicy,
{
self.cells.borrow_cow_with(permit, policy)
}
#[inline]
#[must_use]
pub fn clone_with<'a, P>(&'a self, permit: P) -> Self
where
T: Clone,
P: ReadPermit<'brand> + 'a,
{
self.as_slice(permit).iter().cloned().collect::<Self>()
}
#[inline]
pub fn cow_if<'a, P>(&'a self, permit: P, decision: RetainDecision) -> Cow<'a, [T]>
where
T: Clone,
P: ReadPermit<'brand> + 'a,
{
self.cells.borrow_cow_if(permit, decision)
}
}