use std::fmt::{Debug, Formatter};
use std::marker::PhantomData;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{Containerized, CopyOnto, Index, Region, ReserveItems};
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct MirrorRegion<T>(PhantomData<T>);
impl<T> Default for MirrorRegion<T> {
fn default() -> Self {
Self(PhantomData)
}
}
impl<T> Debug for MirrorRegion<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "MirrorRegion<{}>", std::any::type_name::<T>())
}
}
impl<T: Index + CopyOnto<Self>> Region for MirrorRegion<T> {
type ReadItem<'a> = T where T: 'a;
type Index = T;
fn merge_regions<'a>(_regions: impl Iterator<Item = &'a Self> + Clone) -> Self
where
Self: 'a,
{
Self::default()
}
#[inline]
fn index(&self, index: Self::Index) -> Self::ReadItem<'_> {
index
}
#[inline(always)]
fn reserve_regions<'a, I>(&mut self, _regions: I)
where
Self: 'a,
I: Iterator<Item = &'a Self> + Clone,
{
}
#[inline(always)]
fn clear(&mut self) {
}
fn heap_size<F: FnMut(usize, usize)>(&self, _callback: F) {
}
}
impl<T: Index> CopyOnto<MirrorRegion<Self>> for T {
#[inline(always)]
fn copy_onto(self, _target: &mut MirrorRegion<Self>) -> T {
self
}
}
impl<'a, T: Index> CopyOnto<MirrorRegion<T>> for &'a T {
#[inline(always)]
fn copy_onto(self, _target: &mut MirrorRegion<T>) -> T {
*self
}
}
impl<T: Index> ReserveItems<MirrorRegion<T>> for T {
#[inline(always)]
fn reserve_items<I>(_target: &mut MirrorRegion<T>, _items: I)
where
I: Iterator<Item = Self> + Clone,
{
}
}
impl<'a, T: Index> ReserveItems<MirrorRegion<T>> for &'a T {
#[inline(always)]
fn reserve_items<I>(_target: &mut MirrorRegion<T>, _items: I)
where
I: Iterator<Item = Self> + Clone,
{
}
}
macro_rules! implement_for {
($index_type:ty) => {
impl Containerized for $index_type {
type Region = MirrorRegion<Self>;
}
};
}
implement_for!(());
implement_for!(bool);
implement_for!(char);
implement_for!(u8);
implement_for!(u16);
implement_for!(u32);
implement_for!(u64);
implement_for!(u128);
implement_for!(usize);
implement_for!(i8);
implement_for!(i16);
implement_for!(i32);
implement_for!(i64);
implement_for!(i128);
implement_for!(isize);
implement_for!(f32);
implement_for!(f64);
implement_for!(std::num::Wrapping<i8>);
implement_for!(std::num::Wrapping<i16>);
implement_for!(std::num::Wrapping<i32>);
implement_for!(std::num::Wrapping<i64>);
implement_for!(std::num::Wrapping<i128>);
implement_for!(std::num::Wrapping<isize>);
implement_for!(std::time::Duration);