use core::{
array::TryFromSliceError,
borrow::Borrow,
cmp::Ordering,
fmt::Debug,
iter::FusedIterator,
ops::{
Bound, Deref, Index, IndexMut, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo,
RangeToInclusive,
},
ptr,
slice::{self, SliceIndex},
};
use alloc::{
borrow::{Cow, ToOwned},
boxed::Box,
collections::VecDeque,
rc::Rc,
vec::Vec,
};
use bevy_platform::sync::Arc;
use super::{
unique_vec::{self, UniqueEntityEquivalentVec},
Entity, EntityEquivalent, EntitySet, EntitySetIterator, FromEntitySetIterator,
UniqueEntityEquivalentArray, UniqueEntityIter,
};
#[repr(transparent)]
#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct UniqueEntityEquivalentSlice<T: EntityEquivalent>([T]);
pub type UniqueEntitySlice = UniqueEntityEquivalentSlice<Entity>;
impl<T: EntityEquivalent> UniqueEntityEquivalentSlice<T> {
pub const unsafe fn from_slice_unchecked(slice: &[T]) -> &Self {
unsafe { &*(ptr::from_ref(slice) as *const Self) }
}
pub const unsafe fn from_slice_unchecked_mut(slice: &mut [T]) -> &mut Self {
unsafe { &mut *(ptr::from_mut(slice) as *mut Self) }
}
pub const fn as_inner(&self) -> &[T] {
&self.0
}
pub unsafe fn from_boxed_slice_unchecked(slice: Box<[T]>) -> Box<Self> {
unsafe { Box::from_raw(Box::into_raw(slice) as *mut Self) }
}
pub fn into_boxed_inner(self: Box<Self>) -> Box<[T]> {
unsafe { Box::from_raw(Box::into_raw(self) as *mut [T]) }
}
pub unsafe fn from_arc_slice_unchecked(slice: Arc<[T]>) -> Arc<Self> {
unsafe { Arc::from_raw(Arc::into_raw(slice) as *mut Self) }
}
pub fn into_arc_inner(this: Arc<Self>) -> Arc<[T]> {
unsafe { Arc::from_raw(Arc::into_raw(this) as *mut [T]) }
}
pub unsafe fn from_rc_slice_unchecked(slice: Rc<[T]>) -> Rc<Self> {
unsafe { Rc::from_raw(Rc::into_raw(slice) as *mut Self) }
}
pub fn into_rc_inner(self: Rc<Self>) -> Rc<[T]> {
unsafe { Rc::from_raw(Rc::into_raw(self) as *mut [T]) }
}
pub const fn split_first(&self) -> Option<(&T, &Self)> {
let Some((first, rest)) = self.0.split_first() else {
return None;
};
Some((first, unsafe { Self::from_slice_unchecked(rest) }))
}
pub const fn split_last(&self) -> Option<(&T, &Self)> {
let Some((last, rest)) = self.0.split_last() else {
return None;
};
Some((last, unsafe { Self::from_slice_unchecked(rest) }))
}
pub const fn first_chunk<const N: usize>(&self) -> Option<&UniqueEntityEquivalentArray<T, N>> {
let Some(chunk) = self.0.first_chunk() else {
return None;
};
Some(unsafe { UniqueEntityEquivalentArray::from_array_ref_unchecked(chunk) })
}
pub const fn split_first_chunk<const N: usize>(
&self,
) -> Option<(
&UniqueEntityEquivalentArray<T, N>,
&UniqueEntityEquivalentSlice<T>,
)> {
let Some((chunk, rest)) = self.0.split_first_chunk() else {
return None;
};
unsafe {
Some((
UniqueEntityEquivalentArray::from_array_ref_unchecked(chunk),
Self::from_slice_unchecked(rest),
))
}
}
pub const fn split_last_chunk<const N: usize>(
&self,
) -> Option<(
&UniqueEntityEquivalentSlice<T>,
&UniqueEntityEquivalentArray<T, N>,
)> {
let Some((rest, chunk)) = self.0.split_last_chunk() else {
return None;
};
unsafe {
Some((
Self::from_slice_unchecked(rest),
UniqueEntityEquivalentArray::from_array_ref_unchecked(chunk),
))
}
}
pub const fn last_chunk<const N: usize>(&self) -> Option<&UniqueEntityEquivalentArray<T, N>> {
let Some(chunk) = self.0.last_chunk() else {
return None;
};
Some(unsafe { UniqueEntityEquivalentArray::from_array_ref_unchecked(chunk) })
}
pub fn get<I>(&self, index: I) -> Option<&Self>
where
Self: Index<I>,
I: SliceIndex<[T], Output = [T]>,
{
self.0.get(index).map(|slice|
unsafe { Self::from_slice_unchecked(slice) })
}
pub fn get_mut<I>(&mut self, index: I) -> Option<&mut Self>
where
Self: Index<I>,
I: SliceIndex<[T], Output = [T]>,
{
self.0.get_mut(index).map(|slice|
unsafe { Self::from_slice_unchecked_mut(slice) })
}
pub unsafe fn get_unchecked<I>(&self, index: I) -> &Self
where
Self: Index<I>,
I: SliceIndex<[T], Output = [T]>,
{
unsafe { Self::from_slice_unchecked(self.0.get_unchecked(index)) }
}
pub unsafe fn get_unchecked_mut<I>(&mut self, index: I) -> &mut Self
where
Self: Index<I>,
I: SliceIndex<[T], Output = [T]>,
{
unsafe { Self::from_slice_unchecked_mut(self.0.get_unchecked_mut(index)) }
}
pub const fn as_mut_ptr(&mut self) -> *mut T {
self.0.as_mut_ptr()
}
pub const fn as_mut_ptr_range(&mut self) -> Range<*mut T> {
self.0.as_mut_ptr_range()
}
pub fn swap(&mut self, a: usize, b: usize) {
self.0.swap(a, b);
}
pub fn reverse(&mut self) {
self.0.reverse();
}
pub fn iter(&self) -> Iter<'_, T> {
unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.iter()) }
}
pub fn windows(&self, size: usize) -> Windows<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(self.0.windows(size))
}
}
pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(
self.0.chunks(chunk_size),
)
}
}
pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.chunks_mut(chunk_size),
)
}
}
pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(
self.0.chunks_exact(chunk_size),
)
}
}
pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.chunks_exact_mut(chunk_size),
)
}
}
pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(
self.0.rchunks(chunk_size),
)
}
}
pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.rchunks_mut(chunk_size),
)
}
}
pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(
self.0.rchunks_exact(chunk_size),
)
}
}
pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T> {
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.rchunks_exact_mut(chunk_size),
)
}
}
pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, F, T>
where
F: FnMut(&T, &T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(self.0.chunk_by(pred))
}
}
pub fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, F, T>
where
F: FnMut(&T, &T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.chunk_by_mut(pred),
)
}
}
pub const fn split_at(&self, mid: usize) -> (&Self, &Self) {
let (left, right) = self.0.split_at(mid);
unsafe {
(
Self::from_slice_unchecked(left),
Self::from_slice_unchecked(right),
)
}
}
pub const fn split_at_mut(&mut self, mid: usize) -> (&mut Self, &mut Self) {
let (left, right) = self.0.split_at_mut(mid);
unsafe {
(
Self::from_slice_unchecked_mut(left),
Self::from_slice_unchecked_mut(right),
)
}
}
pub const unsafe fn split_at_unchecked(&self, mid: usize) -> (&Self, &Self) {
let (left, right) = unsafe { self.0.split_at_unchecked(mid) };
unsafe {
(
Self::from_slice_unchecked(left),
Self::from_slice_unchecked(right),
)
}
}
pub const unsafe fn split_at_mut_unchecked(&mut self, mid: usize) -> (&mut Self, &mut Self) {
let (left, right) = unsafe { self.0.split_at_mut_unchecked(mid) };
unsafe {
(
Self::from_slice_unchecked_mut(left),
Self::from_slice_unchecked_mut(right),
)
}
}
pub const fn split_at_checked(&self, mid: usize) -> Option<(&Self, &Self)> {
let Some((left, right)) = self.0.split_at_checked(mid) else {
return None;
};
unsafe {
Some((
Self::from_slice_unchecked(left),
Self::from_slice_unchecked(right),
))
}
}
pub const fn split_at_mut_checked(&mut self, mid: usize) -> Option<(&mut Self, &mut Self)> {
let Some((left, right)) = self.0.split_at_mut_checked(mid) else {
return None;
};
unsafe {
Some((
Self::from_slice_unchecked_mut(left),
Self::from_slice_unchecked_mut(right),
))
}
}
pub fn split<F>(&self, pred: F) -> Split<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(self.0.split(pred))
}
}
pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.split_mut(pred),
)
}
}
pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(
self.0.split_inclusive(pred),
)
}
}
pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.split_inclusive_mut(pred),
)
}
}
pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(self.0.rsplit(pred))
}
}
pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.rsplit_mut(pred),
)
}
}
pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(self.0.splitn(n, pred))
}
}
pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.splitn_mut(n, pred),
)
}
}
pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIter::from_slice_iterator_unchecked(self.0.rsplitn(n, pred))
}
}
pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<'_, F, T>
where
F: FnMut(&T) -> bool,
{
unsafe {
UniqueEntityEquivalentSliceIterMut::from_mut_slice_iterator_unchecked(
self.0.rsplitn_mut(n, pred),
)
}
}
pub fn sort_unstable(&mut self)
where
T: Ord,
{
self.0.sort_unstable();
}
pub fn sort_unstable_by<F>(&mut self, compare: F)
where
F: FnMut(&T, &T) -> Ordering,
{
self.0.sort_unstable_by(compare);
}
pub fn sort_unstable_by_key<K, F>(&mut self, f: F)
where
F: FnMut(&T) -> K,
K: Ord,
{
self.0.sort_unstable_by_key(f);
}
pub fn rotate_left(&mut self, mid: usize) {
self.0.rotate_left(mid);
}
pub fn rotate_right(&mut self, mid: usize) {
self.0.rotate_right(mid);
}
pub fn sort(&mut self)
where
T: Ord,
{
self.0.sort();
}
pub fn sort_by<F>(&mut self, compare: F)
where
F: FnMut(&T, &T) -> Ordering,
{
self.0.sort_by(compare);
}
pub fn sort_by_key<K, F>(&mut self, f: F)
where
F: FnMut(&T) -> K,
K: Ord,
{
self.0.sort_by_key(f);
}
pub fn sort_by_cached_key<K, F>(&mut self, f: F)
where
F: FnMut(&T) -> K,
K: Ord,
{
self.0.sort_by_cached_key(f);
}
pub fn to_vec(&self) -> UniqueEntityEquivalentVec<T>
where
T: Clone,
{
unsafe { UniqueEntityEquivalentVec::from_vec_unchecked(self.0.to_vec()) }
}
pub fn into_vec(self: Box<Self>) -> UniqueEntityEquivalentVec<T> {
unsafe {
let len = self.len();
let vec = Vec::from_raw_parts(Box::into_raw(self).cast::<T>(), len, len);
UniqueEntityEquivalentVec::from_vec_unchecked(vec)
}
}
}
pub const fn from_ref<T: EntityEquivalent>(s: &T) -> &UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(slice::from_ref(s)) }
}
pub const fn from_mut<T: EntityEquivalent>(s: &mut T) -> &mut UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(slice::from_mut(s)) }
}
pub const unsafe fn from_raw_parts<'a, T: EntityEquivalent>(
data: *const T,
len: usize,
) -> &'a UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(slice::from_raw_parts(data, len)) }
}
pub const unsafe fn from_raw_parts_mut<'a, T: EntityEquivalent>(
data: *mut T,
len: usize,
) -> &'a mut UniqueEntityEquivalentSlice<T> {
unsafe {
UniqueEntityEquivalentSlice::from_slice_unchecked_mut(slice::from_raw_parts_mut(data, len))
}
}
pub unsafe fn cast_slice_of_unique_entity_slice<'a, 'b, T: EntityEquivalent + 'a>(
slice: &'b [&'a [T]],
) -> &'b [&'a UniqueEntityEquivalentSlice<T>] {
unsafe { &*(ptr::from_ref(slice) as *const [&UniqueEntityEquivalentSlice<T>]) }
}
pub unsafe fn cast_slice_of_unique_entity_slice_mut<'a, 'b, T: EntityEquivalent + 'a>(
slice: &'b mut [&'a [T]],
) -> &'b mut [&'a UniqueEntityEquivalentSlice<T>] {
unsafe { &mut *(ptr::from_mut(slice) as *mut [&UniqueEntityEquivalentSlice<T>]) }
}
pub unsafe fn cast_slice_of_mut_unique_entity_slice_mut<'a, 'b, T: EntityEquivalent + 'a>(
slice: &'b mut [&'a mut [T]],
) -> &'b mut [&'a mut UniqueEntityEquivalentSlice<T>] {
unsafe { &mut *(ptr::from_mut(slice) as *mut [&mut UniqueEntityEquivalentSlice<T>]) }
}
impl<'a, T: EntityEquivalent> IntoIterator for &'a UniqueEntityEquivalentSlice<T> {
type Item = &'a T;
type IntoIter = Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<'a, T: EntityEquivalent> IntoIterator for &'a Box<UniqueEntityEquivalentSlice<T>> {
type Item = &'a T;
type IntoIter = Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<T: EntityEquivalent> IntoIterator for Box<UniqueEntityEquivalentSlice<T>> {
type Item = T;
type IntoIter = unique_vec::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.into_vec().into_iter()
}
}
impl<T: EntityEquivalent> Deref for UniqueEntityEquivalentSlice<T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T: EntityEquivalent> AsRef<[T]> for UniqueEntityEquivalentSlice<T> {
fn as_ref(&self) -> &[T] {
self
}
}
impl<T: EntityEquivalent> AsRef<Self> for UniqueEntityEquivalentSlice<T> {
fn as_ref(&self) -> &Self {
self
}
}
impl<T: EntityEquivalent> AsMut<Self> for UniqueEntityEquivalentSlice<T> {
fn as_mut(&mut self) -> &mut Self {
self
}
}
impl<T: EntityEquivalent> Borrow<[T]> for UniqueEntityEquivalentSlice<T> {
fn borrow(&self) -> &[T] {
self
}
}
impl<T: EntityEquivalent + Clone> Clone for Box<UniqueEntityEquivalentSlice<T>> {
fn clone(&self) -> Self {
self.to_vec().into_boxed_slice()
}
}
impl<T: EntityEquivalent> Default for &UniqueEntityEquivalentSlice<T> {
fn default() -> Self {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(Default::default()) }
}
}
impl<T: EntityEquivalent> Default for &mut UniqueEntityEquivalentSlice<T> {
fn default() -> Self {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(Default::default()) }
}
}
impl<T: EntityEquivalent> Default for Box<UniqueEntityEquivalentSlice<T>> {
fn default() -> Self {
unsafe { UniqueEntityEquivalentSlice::from_boxed_slice_unchecked(Default::default()) }
}
}
impl<T: EntityEquivalent + Clone> From<&UniqueEntityEquivalentSlice<T>>
for Box<UniqueEntityEquivalentSlice<T>>
{
fn from(value: &UniqueEntityEquivalentSlice<T>) -> Self {
unsafe { UniqueEntityEquivalentSlice::from_boxed_slice_unchecked(value.0.into()) }
}
}
impl<T: EntityEquivalent + Clone> From<&UniqueEntityEquivalentSlice<T>>
for Arc<UniqueEntityEquivalentSlice<T>>
{
fn from(value: &UniqueEntityEquivalentSlice<T>) -> Self {
unsafe { UniqueEntityEquivalentSlice::from_arc_slice_unchecked(value.0.into()) }
}
}
impl<T: EntityEquivalent + Clone> From<&UniqueEntityEquivalentSlice<T>>
for Rc<UniqueEntityEquivalentSlice<T>>
{
fn from(value: &UniqueEntityEquivalentSlice<T>) -> Self {
unsafe { UniqueEntityEquivalentSlice::from_rc_slice_unchecked(value.0.into()) }
}
}
impl<'a, T: EntityEquivalent + Clone> From<&'a UniqueEntityEquivalentSlice<T>>
for Cow<'a, UniqueEntityEquivalentSlice<T>>
{
fn from(value: &'a UniqueEntityEquivalentSlice<T>) -> Self {
Cow::Borrowed(value)
}
}
impl<T: EntityEquivalent + Clone, const N: usize> From<UniqueEntityEquivalentArray<T, N>>
for Box<UniqueEntityEquivalentSlice<T>>
{
fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {
unsafe {
UniqueEntityEquivalentSlice::from_boxed_slice_unchecked(Box::new(value.into_inner()))
}
}
}
impl<'a, T: EntityEquivalent + Clone> From<Cow<'a, UniqueEntityEquivalentSlice<T>>>
for Box<UniqueEntityEquivalentSlice<T>>
{
fn from(value: Cow<'a, UniqueEntityEquivalentSlice<T>>) -> Self {
match value {
Cow::Borrowed(slice) => Box::from(slice),
Cow::Owned(slice) => Box::from(slice),
}
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>>
for Box<UniqueEntityEquivalentSlice<T>>
{
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
value.into_boxed_slice()
}
}
impl<T: EntityEquivalent> FromIterator<T> for Box<UniqueEntityEquivalentSlice<T>> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
iter.into_iter()
.collect::<UniqueEntityEquivalentVec<T>>()
.into_boxed_slice()
}
}
impl<T: EntityEquivalent> FromEntitySetIterator<T> for Box<UniqueEntityEquivalentSlice<T>> {
fn from_entity_set_iter<I: EntitySet<Item = T>>(iter: I) -> Self {
iter.into_iter()
.collect_set::<UniqueEntityEquivalentVec<T>>()
.into_boxed_slice()
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentVec<U>> for &UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.0.eq(other.as_vec())
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentVec<U>> for &mut UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.0.eq(other.as_vec())
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentVec<U>> for UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.0.eq(other.as_vec())
}
}
impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>
PartialEq<&UniqueEntityEquivalentSlice<U>> for [T; N]
{
fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U> + Clone, U: EntityEquivalent> PartialEq<&UniqueEntityEquivalentSlice<U>>
for Cow<'_, [T]>
{
fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U> + Clone, U: EntityEquivalent>
PartialEq<&UniqueEntityEquivalentSlice<U>> for Cow<'_, UniqueEntityEquivalentSlice<T>>
{
fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {
self.0.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<&UniqueEntityEquivalentSlice<U>> for Vec<T> {
fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<&UniqueEntityEquivalentSlice<U>>
for VecDeque<T>
{
fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>
PartialEq<&mut UniqueEntityEquivalentSlice<U>> for [T; N]
{
fn eq(&self, other: &&mut UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U> + Clone, U: EntityEquivalent> PartialEq<&mut UniqueEntityEquivalentSlice<U>>
for Cow<'_, [T]>
{
fn eq(&self, other: &&mut UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&&**other)
}
}
impl<T: EntityEquivalent + PartialEq<U> + Clone, U: EntityEquivalent>
PartialEq<&mut UniqueEntityEquivalentSlice<U>> for Cow<'_, UniqueEntityEquivalentSlice<T>>
{
fn eq(&self, other: &&mut UniqueEntityEquivalentSlice<U>) -> bool {
self.0.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U> + Clone, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentVec<U>> for Cow<'_, UniqueEntityEquivalentSlice<T>>
{
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.0.eq(other.as_vec())
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<&mut UniqueEntityEquivalentSlice<U>>
for Vec<T>
{
fn eq(&self, other: &&mut UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<&mut UniqueEntityEquivalentSlice<U>>
for VecDeque<T>
{
fn eq(&self, other: &&mut UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentSlice<U>> for [T]
{
fn eq(&self, other: &UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize> PartialEq<UniqueEntityEquivalentSlice<U>>
for [T; N]
{
fn eq(&self, other: &UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentSlice<U>> for Vec<T>
{
fn eq(&self, other: &UniqueEntityEquivalentSlice<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U, const N: usize> PartialEq<[U; N]>
for &UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &[U; N]) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U, const N: usize> PartialEq<[U; N]>
for &mut UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &[U; N]) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U, const N: usize> PartialEq<[U; N]>
for UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &[U; N]) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent, const N: usize>
PartialEq<UniqueEntityEquivalentArray<U, N>> for &UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &UniqueEntityEquivalentArray<U, N>) -> bool {
self.0.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent, const N: usize>
PartialEq<UniqueEntityEquivalentArray<U, N>> for &mut UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &UniqueEntityEquivalentArray<U, N>) -> bool {
self.0.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent, const N: usize>
PartialEq<UniqueEntityEquivalentArray<U, N>> for UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &UniqueEntityEquivalentArray<U, N>) -> bool {
self.0.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<Vec<U>> for &UniqueEntityEquivalentSlice<T> {
fn eq(&self, other: &Vec<U>) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<Vec<U>>
for &mut UniqueEntityEquivalentSlice<T>
{
fn eq(&self, other: &Vec<U>) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<Vec<U>> for UniqueEntityEquivalentSlice<T> {
fn eq(&self, other: &Vec<U>) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + Clone> ToOwned for UniqueEntityEquivalentSlice<T> {
type Owned = UniqueEntityEquivalentVec<T>;
fn to_owned(&self) -> Self::Owned {
unsafe { UniqueEntityEquivalentVec::from_vec_unchecked(self.0.to_owned()) }
}
}
impl<'a, T: EntityEquivalent + Copy, const N: usize> TryFrom<&'a UniqueEntityEquivalentSlice<T>>
for &'a UniqueEntityEquivalentArray<T, N>
{
type Error = TryFromSliceError;
fn try_from(value: &'a UniqueEntityEquivalentSlice<T>) -> Result<Self, Self::Error> {
<&[T; N]>::try_from(&value.0).map(|array|
unsafe { UniqueEntityEquivalentArray::from_array_ref_unchecked(array) })
}
}
impl<T: EntityEquivalent + Copy, const N: usize> TryFrom<&UniqueEntityEquivalentSlice<T>>
for UniqueEntityEquivalentArray<T, N>
{
type Error = TryFromSliceError;
fn try_from(value: &UniqueEntityEquivalentSlice<T>) -> Result<Self, Self::Error> {
<&Self>::try_from(value).copied()
}
}
impl<T: EntityEquivalent + Copy, const N: usize> TryFrom<&mut UniqueEntityEquivalentSlice<T>>
for UniqueEntityEquivalentArray<T, N>
{
type Error = TryFromSliceError;
fn try_from(value: &mut UniqueEntityEquivalentSlice<T>) -> Result<Self, Self::Error> {
<Self>::try_from(&*value)
}
}
impl<T: EntityEquivalent> Index<(Bound<usize>, Bound<usize>)> for UniqueEntityEquivalentSlice<T> {
type Output = Self;
fn index(&self, key: (Bound<usize>, Bound<usize>)) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<Range<usize>> for UniqueEntityEquivalentSlice<T> {
type Output = Self;
fn index(&self, key: Range<usize>) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeFrom<usize>> for UniqueEntityEquivalentSlice<T> {
type Output = Self;
fn index(&self, key: RangeFrom<usize>) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeFull> for UniqueEntityEquivalentSlice<T> {
type Output = Self;
fn index(&self, key: RangeFull) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeInclusive<usize>> for UniqueEntityEquivalentSlice<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeInclusive<usize>) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeTo<usize>> for UniqueEntityEquivalentSlice<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeTo<usize>) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeToInclusive<usize>> for UniqueEntityEquivalentSlice<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeToInclusive<usize>) -> &Self {
unsafe { Self::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<usize> for UniqueEntityEquivalentSlice<T> {
type Output = T;
fn index(&self, index: usize) -> &T {
&self.0[index]
}
}
impl<T: EntityEquivalent> IndexMut<(Bound<usize>, Bound<usize>)>
for UniqueEntityEquivalentSlice<T>
{
fn index_mut(&mut self, key: (Bound<usize>, Bound<usize>)) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<Range<usize>> for UniqueEntityEquivalentSlice<T> {
fn index_mut(&mut self, key: Range<usize>) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeFrom<usize>> for UniqueEntityEquivalentSlice<T> {
fn index_mut(&mut self, key: RangeFrom<usize>) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeFull> for UniqueEntityEquivalentSlice<T> {
fn index_mut(&mut self, key: RangeFull) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeInclusive<usize>> for UniqueEntityEquivalentSlice<T> {
fn index_mut(&mut self, key: RangeInclusive<usize>) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeTo<usize>> for UniqueEntityEquivalentSlice<T> {
fn index_mut(&mut self, key: RangeTo<usize>) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeToInclusive<usize>> for UniqueEntityEquivalentSlice<T> {
fn index_mut(&mut self, key: RangeToInclusive<usize>) -> &mut Self {
unsafe { Self::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
pub type Iter<'a, T> = UniqueEntityIter<slice::Iter<'a, T>>;
impl<'a, T: EntityEquivalent> UniqueEntityIter<slice::Iter<'a, T>> {
pub fn as_slice(&self) -> &'a UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.as_inner().as_slice()) }
}
}
pub type IterMut<'a, T> = UniqueEntityIter<slice::IterMut<'a, T>>;
impl<'a, T: EntityEquivalent> UniqueEntityIter<slice::IterMut<'a, T>> {
pub fn into_slice(self) -> &'a mut UniqueEntityEquivalentSlice<T> {
unsafe {
UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.into_inner().into_slice())
}
}
pub fn as_slice(&self) -> &UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.as_inner().as_slice()) }
}
}
#[derive(Debug)]
pub struct UniqueEntityEquivalentSliceIter<
'a,
T: EntityEquivalent + 'a,
I: Iterator<Item = &'a [T]>,
> {
pub(crate) iter: I,
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a [T]>>
UniqueEntityEquivalentSliceIter<'a, T, I>
{
pub unsafe fn from_slice_iterator_unchecked(iter: I) -> Self {
Self { iter }
}
pub fn into_inner(self) -> I {
self.iter
}
pub fn as_inner(&self) -> &I {
&self.iter
}
pub unsafe fn as_mut_inner(&mut self) -> &mut I {
&mut self.iter
}
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a [T]>> Iterator
for UniqueEntityEquivalentSliceIter<'a, T, I>
{
type Item = &'a UniqueEntityEquivalentSlice<T>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|slice|
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(slice) })
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<'a, T: EntityEquivalent + 'a, I: ExactSizeIterator<Item = &'a [T]>> ExactSizeIterator
for UniqueEntityEquivalentSliceIter<'a, T, I>
{
}
impl<'a, T: EntityEquivalent + 'a, I: DoubleEndedIterator<Item = &'a [T]>> DoubleEndedIterator
for UniqueEntityEquivalentSliceIter<'a, T, I>
{
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back().map(|slice|
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(slice) })
}
}
impl<'a, T: EntityEquivalent + 'a, I: FusedIterator<Item = &'a [T]>> FusedIterator
for UniqueEntityEquivalentSliceIter<'a, T, I>
{
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a [T]> + AsRef<[&'a [T]]>>
AsRef<[&'a UniqueEntityEquivalentSlice<T>]> for UniqueEntityEquivalentSliceIter<'a, T, I>
{
fn as_ref(&self) -> &[&'a UniqueEntityEquivalentSlice<T>] {
unsafe { cast_slice_of_unique_entity_slice(self.iter.as_ref()) }
}
}
pub type Windows<'a, T = Entity> = UniqueEntityEquivalentSliceIter<'a, T, slice::Windows<'a, T>>;
pub type Chunks<'a, T = Entity> = UniqueEntityEquivalentSliceIter<'a, T, slice::Chunks<'a, T>>;
pub type ChunksExact<'a, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::ChunksExact<'a, T>>;
impl<'a, T: EntityEquivalent> UniqueEntityEquivalentSliceIter<'a, T, slice::ChunksExact<'a, T>> {
pub fn remainder(&self) -> &'a UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.iter.remainder()) }
}
}
pub type RChunks<'a, T = Entity> = UniqueEntityEquivalentSliceIter<'a, T, slice::RChunks<'a, T>>;
pub type RChunksExact<'a, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::RChunksExact<'a, T>>;
impl<'a, T: EntityEquivalent> UniqueEntityEquivalentSliceIter<'a, T, slice::RChunksExact<'a, T>> {
pub fn remainder(&self) -> &'a UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.iter.remainder()) }
}
}
pub type ChunkBy<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::ChunkBy<'a, T, P>>;
pub type Split<'a, P, T = Entity> = UniqueEntityEquivalentSliceIter<'a, T, slice::Split<'a, T, P>>;
pub type SplitInclusive<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::SplitInclusive<'a, T, P>>;
pub type RSplit<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::RSplit<'a, T, P>>;
pub type SplitN<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::SplitN<'a, T, P>>;
pub type RSplitN<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIter<'a, T, slice::RSplitN<'a, T, P>>;
#[derive(Debug)]
pub struct UniqueEntityEquivalentSliceIterMut<
'a,
T: EntityEquivalent + 'a,
I: Iterator<Item = &'a mut [T]>,
> {
pub(crate) iter: I,
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a mut [T]>>
UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
pub unsafe fn from_mut_slice_iterator_unchecked(iter: I) -> Self {
Self { iter }
}
pub fn into_inner(self) -> I {
self.iter
}
pub fn as_inner(&self) -> &I {
&self.iter
}
pub unsafe fn as_mut_inner(&mut self) -> &mut I {
&mut self.iter
}
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a mut [T]>> Iterator
for UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
type Item = &'a mut UniqueEntityEquivalentSlice<T>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|slice|
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(slice) })
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<'a, T: EntityEquivalent + 'a, I: ExactSizeIterator<Item = &'a mut [T]>> ExactSizeIterator
for UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
}
impl<'a, T: EntityEquivalent + 'a, I: DoubleEndedIterator<Item = &'a mut [T]>> DoubleEndedIterator
for UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back().map(|slice|
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(slice) })
}
}
impl<'a, T: EntityEquivalent + 'a, I: FusedIterator<Item = &'a mut [T]>> FusedIterator
for UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a mut [T]> + AsRef<[&'a [T]]>>
AsRef<[&'a UniqueEntityEquivalentSlice<T>]> for UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
fn as_ref(&self) -> &[&'a UniqueEntityEquivalentSlice<T>] {
unsafe { cast_slice_of_unique_entity_slice(self.iter.as_ref()) }
}
}
impl<'a, T: EntityEquivalent + 'a, I: Iterator<Item = &'a mut [T]> + AsMut<[&'a mut [T]]>>
AsMut<[&'a mut UniqueEntityEquivalentSlice<T>]>
for UniqueEntityEquivalentSliceIterMut<'a, T, I>
{
fn as_mut(&mut self) -> &mut [&'a mut UniqueEntityEquivalentSlice<T>] {
unsafe { cast_slice_of_mut_unique_entity_slice_mut(self.iter.as_mut()) }
}
}
pub type ChunksMut<'a, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::ChunksMut<'a, T>>;
pub type ChunksExactMut<'a, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::ChunksExactMut<'a, T>>;
impl<'a, T: EntityEquivalent>
UniqueEntityEquivalentSliceIterMut<'a, T, slice::ChunksExactMut<'a, T>>
{
pub fn into_remainder(self) -> &'a mut UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.iter.into_remainder()) }
}
}
pub type RChunksMut<'a, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::RChunksMut<'a, T>>;
pub type RChunksExactMut<'a, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::RChunksExactMut<'a, T>>;
impl<'a, T: EntityEquivalent>
UniqueEntityEquivalentSliceIterMut<'a, T, slice::RChunksExactMut<'a, T>>
{
pub fn into_remainder(self) -> &'a mut UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.iter.into_remainder()) }
}
}
pub type ChunkByMut<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::ChunkByMut<'a, T, P>>;
pub type SplitMut<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::SplitMut<'a, T, P>>;
pub type SplitInclusiveMut<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::SplitInclusiveMut<'a, T, P>>;
pub type RSplitMut<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::RSplitMut<'a, T, P>>;
pub type SplitNMut<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::SplitNMut<'a, T, P>>;
pub type RSplitNMut<'a, P, T = Entity> =
UniqueEntityEquivalentSliceIterMut<'a, T, slice::RSplitNMut<'a, T, P>>;