#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{Containerized, CopyOnto, Region, ReserveItems};
impl<T: Containerized> Containerized for Option<T> {
type Region = OptionRegion<T::Region>;
}
#[derive(Default, Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct OptionRegion<R> {
inner: R,
}
impl<R: Region> Region for OptionRegion<R> {
type ReadItem<'a> = Option<R::ReadItem<'a>> where Self: 'a;
type Index = Option<R::Index>;
fn merge_regions<'a>(regions: impl Iterator<Item = &'a Self> + Clone) -> Self
where
Self: 'a,
{
Self {
inner: R::merge_regions(regions.map(|r| &r.inner)),
}
}
#[inline]
fn index(&self, index: Self::Index) -> Self::ReadItem<'_> {
index.map(|t| self.inner.index(t))
}
#[inline]
fn reserve_regions<'a, I>(&mut self, regions: I)
where
Self: 'a,
I: Iterator<Item = &'a Self> + Clone,
{
self.inner.reserve_regions(regions.map(|r| &r.inner));
}
#[inline]
fn clear(&mut self) {
self.inner.clear();
}
fn heap_size<F: FnMut(usize, usize)>(&self, callback: F) {
self.inner.heap_size(callback);
}
}
impl<T, TR> CopyOnto<OptionRegion<TR>> for Option<T>
where
TR: Region,
T: CopyOnto<TR>,
{
#[inline]
fn copy_onto(self, target: &mut OptionRegion<TR>) -> <OptionRegion<TR> as Region>::Index {
self.map(|t| t.copy_onto(&mut target.inner))
}
}
impl<'a, T: 'a, TR> CopyOnto<OptionRegion<TR>> for &'a Option<T>
where
TR: Region,
&'a T: CopyOnto<TR>,
{
#[inline]
fn copy_onto(self, target: &mut OptionRegion<TR>) -> <OptionRegion<TR> as Region>::Index {
self.as_ref().map(|t| t.copy_onto(&mut target.inner))
}
}
impl<'a, T: 'a, TR> ReserveItems<OptionRegion<TR>> for &'a Option<T>
where
TR: Region,
&'a T: ReserveItems<TR>,
{
fn reserve_items<I>(target: &mut OptionRegion<TR>, items: I)
where
I: Iterator<Item = Self> + Clone,
{
ReserveItems::reserve_items(&mut target.inner, items.flat_map(|r| r.as_ref()));
}
}