use core::{
borrow::{Borrow, BorrowMut},
mem::MaybeUninit,
ops::{
Bound, Deref, DerefMut, Index, IndexMut, Range, RangeBounds, RangeFrom, RangeFull,
RangeInclusive, RangeTo, RangeToInclusive,
},
};
use alloc::{
borrow::{Cow, ToOwned},
boxed::Box,
collections::{BTreeSet, BinaryHeap, TryReserveError, VecDeque},
rc::Rc,
vec::{self, Vec},
};
use bevy_platform::sync::Arc;
use super::{
unique_slice::{self, UniqueEntityEquivalentSlice},
Entity, EntityEquivalent, EntitySet, FromEntitySetIterator, UniqueEntityEquivalentArray,
UniqueEntityIter,
};
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct UniqueEntityEquivalentVec<T: EntityEquivalent>(Vec<T>);
pub type UniqueEntityVec = UniqueEntityEquivalentVec<Entity>;
impl<T: EntityEquivalent> UniqueEntityEquivalentVec<T> {
pub const fn new() -> Self {
Self(Vec::new())
}
pub fn with_capacity(capacity: usize) -> Self {
Self(Vec::with_capacity(capacity))
}
pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Self {
Self(unsafe { Vec::from_raw_parts(ptr, length, capacity) })
}
pub unsafe fn from_vec_unchecked(vec: Vec<T>) -> Self {
Self(vec)
}
pub fn into_inner(self) -> Vec<T> {
self.0
}
pub fn as_vec(&self) -> &Vec<T> {
&self.0
}
pub unsafe fn as_mut_vec(&mut self) -> &mut Vec<T> {
&mut self.0
}
pub fn capacity(&self) -> usize {
self.0.capacity()
}
pub fn reserve(&mut self, additional: usize) {
self.0.reserve(additional);
}
pub fn reserve_exact(&mut self, additional: usize) {
self.0.reserve_exact(additional);
}
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
self.0.try_reserve(additional)
}
pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
self.0.try_reserve_exact(additional)
}
pub fn shrink_to_fit(&mut self) {
self.0.shrink_to_fit();
}
pub fn shrink_to(&mut self, min_capacity: usize) {
self.0.shrink_to(min_capacity);
}
pub fn into_boxed_slice(self) -> Box<UniqueEntityEquivalentSlice<T>> {
unsafe {
UniqueEntityEquivalentSlice::from_boxed_slice_unchecked(self.0.into_boxed_slice())
}
}
pub fn as_slice(&self) -> &UniqueEntityEquivalentSlice<T> {
self
}
pub fn as_mut_slice(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {
self
}
pub fn truncate(&mut self, len: usize) {
self.0.truncate(len);
}
pub fn as_ptr(&self) -> *const T {
self.0.as_ptr()
}
pub fn as_mut_ptr(&mut self) -> *mut T {
self.0.as_mut_ptr()
}
pub unsafe fn set_len(&mut self, new_len: usize) {
unsafe { self.0.set_len(new_len) };
}
pub fn swap_remove(&mut self, index: usize) -> T {
self.0.swap_remove(index)
}
pub unsafe fn insert(&mut self, index: usize, element: T) {
self.0.insert(index, element);
}
pub fn remove(&mut self, index: usize) -> T {
self.0.remove(index)
}
pub fn retain<F>(&mut self, f: F)
where
F: FnMut(&T) -> bool,
{
self.0.retain(f);
}
pub unsafe fn retain_mut<F>(&mut self, f: F)
where
F: FnMut(&mut T) -> bool,
{
self.0.retain_mut(f);
}
pub unsafe fn dedup_by_key<F, K>(&mut self, key: F)
where
F: FnMut(&mut T) -> K,
K: PartialEq,
{
self.0.dedup_by_key(key);
}
pub unsafe fn dedup_by<F>(&mut self, same_bucket: F)
where
F: FnMut(&mut T, &mut T) -> bool,
{
self.0.dedup_by(same_bucket);
}
pub unsafe fn push(&mut self, value: T) {
self.0.push(value);
}
pub unsafe fn append(&mut self, other: &mut UniqueEntityEquivalentVec<T>) {
self.0.append(&mut other.0);
}
pub fn pop(&mut self) -> Option<T> {
self.0.pop()
}
pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
where
R: RangeBounds<usize>,
{
unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.drain(range)) }
}
pub fn clear(&mut self) {
self.0.clear();
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn split_off(&mut self, at: usize) -> Self {
Self(self.0.split_off(at))
}
pub unsafe fn resize_with<F>(&mut self, new_len: usize, f: F)
where
F: FnMut() -> T,
{
self.0.resize_with(new_len, f);
}
pub fn leak<'a>(self) -> &'a mut UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.leak()) }
}
pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
self.0.spare_capacity_mut()
}
pub unsafe fn splice<R, I>(
&mut self,
range: R,
replace_with: I,
) -> Splice<'_, <I as IntoIterator>::IntoIter>
where
R: RangeBounds<usize>,
I: EntitySet<Item = T>,
{
unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.splice(range, replace_with)) }
}
}
impl<T: EntityEquivalent> Default for UniqueEntityEquivalentVec<T> {
fn default() -> Self {
Self(Vec::default())
}
}
impl<T: EntityEquivalent> Deref for UniqueEntityEquivalentVec<T> {
type Target = UniqueEntityEquivalentSlice<T>;
fn deref(&self) -> &Self::Target {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(&self.0) }
}
}
impl<T: EntityEquivalent> DerefMut for UniqueEntityEquivalentVec<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(&mut self.0) }
}
}
impl<'a, T: EntityEquivalent> IntoIterator for &'a UniqueEntityEquivalentVec<T>
where
&'a T: EntityEquivalent,
{
type Item = &'a T;
type IntoIter = unique_slice::Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.iter()) }
}
}
impl<T: EntityEquivalent> IntoIterator for UniqueEntityEquivalentVec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.into_iter()) }
}
}
impl<T: EntityEquivalent> AsMut<Self> for UniqueEntityEquivalentVec<T> {
fn as_mut(&mut self) -> &mut UniqueEntityEquivalentVec<T> {
self
}
}
impl<T: EntityEquivalent> AsMut<UniqueEntityEquivalentSlice<T>> for UniqueEntityEquivalentVec<T> {
fn as_mut(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {
self
}
}
impl<T: EntityEquivalent> AsRef<Self> for UniqueEntityEquivalentVec<T> {
fn as_ref(&self) -> &Self {
self
}
}
impl<T: EntityEquivalent> AsRef<Vec<T>> for UniqueEntityEquivalentVec<T> {
fn as_ref(&self) -> &Vec<T> {
&self.0
}
}
impl<T: EntityEquivalent> Borrow<Vec<T>> for UniqueEntityEquivalentVec<T> {
fn borrow(&self) -> &Vec<T> {
&self.0
}
}
impl<T: EntityEquivalent> AsRef<[T]> for UniqueEntityEquivalentVec<T> {
fn as_ref(&self) -> &[T] {
&self.0
}
}
impl<T: EntityEquivalent> AsRef<UniqueEntityEquivalentSlice<T>> for UniqueEntityEquivalentVec<T> {
fn as_ref(&self) -> &UniqueEntityEquivalentSlice<T> {
self
}
}
impl<T: EntityEquivalent> Borrow<[T]> for UniqueEntityEquivalentVec<T> {
fn borrow(&self) -> &[T] {
&self.0
}
}
impl<T: EntityEquivalent> Borrow<UniqueEntityEquivalentSlice<T>> for UniqueEntityEquivalentVec<T> {
fn borrow(&self) -> &UniqueEntityEquivalentSlice<T> {
self
}
}
impl<T: EntityEquivalent> BorrowMut<UniqueEntityEquivalentSlice<T>>
for UniqueEntityEquivalentVec<T>
{
fn borrow_mut(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {
self
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<Vec<U>> for UniqueEntityEquivalentVec<T> {
fn eq(&self, other: &Vec<U>) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<&[U]> for UniqueEntityEquivalentVec<T> {
fn eq(&self, other: &&[U]) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<&UniqueEntityEquivalentSlice<U>> for UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<&mut [U]> for UniqueEntityEquivalentVec<T> {
fn eq(&self, other: &&mut [U]) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<&mut UniqueEntityEquivalentSlice<U>> for UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &&mut UniqueEntityEquivalentSlice<U>) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U, const N: usize> PartialEq<&[U; N]>
for UniqueEntityEquivalentVec<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 UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &&UniqueEntityEquivalentArray<U, N>) -> bool {
self.0.eq(&other.as_inner())
}
}
impl<T: EntityEquivalent + PartialEq<U>, U, const N: usize> PartialEq<&mut [U; N]>
for UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &&mut [U; N]) -> bool {
self.0.eq(&**other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent, const N: usize>
PartialEq<&mut UniqueEntityEquivalentArray<U, N>> for UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &&mut UniqueEntityEquivalentArray<U, N>) -> bool {
self.0.eq(other.as_inner())
}
}
impl<T: EntityEquivalent + PartialEq<U>, U> PartialEq<[U]> for UniqueEntityEquivalentVec<T> {
fn eq(&self, other: &[U]) -> bool {
self.0.eq(other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentSlice<U>> for UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &UniqueEntityEquivalentSlice<U>) -> bool {
self.0.eq(&**other)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U, const N: usize> PartialEq<[U; N]>
for UniqueEntityEquivalentVec<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 UniqueEntityEquivalentVec<T>
{
fn eq(&self, other: &UniqueEntityEquivalentArray<U, N>) -> bool {
self.0.eq(other.as_inner())
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<UniqueEntityEquivalentVec<U>> for Vec<T> {
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<UniqueEntityEquivalentVec<U>> for &[T] {
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<UniqueEntityEquivalentVec<U>> for &mut [T] {
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent>
PartialEq<UniqueEntityEquivalentVec<U>> for [T]
{
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U> + Clone, U: EntityEquivalent> PartialEq<UniqueEntityEquivalentVec<U>>
for Cow<'_, [T]>
{
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: PartialEq<U>, U: EntityEquivalent> PartialEq<UniqueEntityEquivalentVec<U>> for VecDeque<T> {
fn eq(&self, other: &UniqueEntityEquivalentVec<U>) -> bool {
self.eq(&other.0)
}
}
impl<T: EntityEquivalent + Clone> From<&UniqueEntityEquivalentSlice<T>>
for UniqueEntityEquivalentVec<T>
{
fn from(value: &UniqueEntityEquivalentSlice<T>) -> Self {
value.to_vec()
}
}
impl<T: EntityEquivalent + Clone> From<&mut UniqueEntityEquivalentSlice<T>>
for UniqueEntityEquivalentVec<T>
{
fn from(value: &mut UniqueEntityEquivalentSlice<T>) -> Self {
value.to_vec()
}
}
impl<T: EntityEquivalent> From<Box<UniqueEntityEquivalentSlice<T>>>
for UniqueEntityEquivalentVec<T>
{
fn from(value: Box<UniqueEntityEquivalentSlice<T>>) -> Self {
value.into_vec()
}
}
impl<T: EntityEquivalent> From<Cow<'_, UniqueEntityEquivalentSlice<T>>>
for UniqueEntityEquivalentVec<T>
where
UniqueEntityEquivalentSlice<T>: ToOwned<Owned = UniqueEntityEquivalentVec<T>>,
{
fn from(value: Cow<UniqueEntityEquivalentSlice<T>>) -> Self {
value.into_owned()
}
}
impl<T: EntityEquivalent + Clone> From<&[T; 1]> for UniqueEntityEquivalentVec<T> {
fn from(value: &[T; 1]) -> Self {
Self(Vec::from(value))
}
}
impl<T: EntityEquivalent + Clone> From<&[T; 0]> for UniqueEntityEquivalentVec<T> {
fn from(value: &[T; 0]) -> Self {
Self(Vec::from(value))
}
}
impl<T: EntityEquivalent + Clone> From<&mut [T; 1]> for UniqueEntityEquivalentVec<T> {
fn from(value: &mut [T; 1]) -> Self {
Self(Vec::from(value))
}
}
impl<T: EntityEquivalent + Clone> From<&mut [T; 0]> for UniqueEntityEquivalentVec<T> {
fn from(value: &mut [T; 0]) -> Self {
Self(Vec::from(value))
}
}
impl<T: EntityEquivalent> From<[T; 1]> for UniqueEntityEquivalentVec<T> {
fn from(value: [T; 1]) -> Self {
Self(Vec::from(value))
}
}
impl<T: EntityEquivalent> From<[T; 0]> for UniqueEntityEquivalentVec<T> {
fn from(value: [T; 0]) -> Self {
Self(Vec::from(value))
}
}
impl<T: EntityEquivalent + Clone, const N: usize> From<&UniqueEntityEquivalentArray<T, N>>
for UniqueEntityEquivalentVec<T>
{
fn from(value: &UniqueEntityEquivalentArray<T, N>) -> Self {
Self(Vec::from(value.as_inner().clone()))
}
}
impl<T: EntityEquivalent + Clone, const N: usize> From<&mut UniqueEntityEquivalentArray<T, N>>
for UniqueEntityEquivalentVec<T>
{
fn from(value: &mut UniqueEntityEquivalentArray<T, N>) -> Self {
Self(Vec::from(value.as_inner().clone()))
}
}
impl<T: EntityEquivalent, const N: usize> From<UniqueEntityEquivalentArray<T, N>>
for UniqueEntityEquivalentVec<T>
{
fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {
Self(Vec::from(value.into_inner()))
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>> for Vec<T> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
value.0
}
}
impl<'a, T: EntityEquivalent + Clone> From<UniqueEntityEquivalentVec<T>> for Cow<'a, [T]> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
Cow::from(value.0)
}
}
impl<'a, T: EntityEquivalent + Clone> From<UniqueEntityEquivalentVec<T>>
for Cow<'a, UniqueEntityEquivalentSlice<T>>
{
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
Cow::Owned(value)
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>> for Arc<[T]> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
Arc::from(value.0)
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>>
for Arc<UniqueEntityEquivalentSlice<T>>
{
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
unsafe { UniqueEntityEquivalentSlice::from_arc_slice_unchecked(Arc::from(value.0)) }
}
}
impl<T: EntityEquivalent + Ord> From<UniqueEntityEquivalentVec<T>> for BinaryHeap<T> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
BinaryHeap::from(value.0)
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>> for Box<[T]> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
Box::from(value.0)
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>> for Rc<[T]> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
Rc::from(value.0)
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>>
for Rc<UniqueEntityEquivalentSlice<T>>
{
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
unsafe { UniqueEntityEquivalentSlice::from_rc_slice_unchecked(Rc::from(value.0)) }
}
}
impl<T: EntityEquivalent> From<UniqueEntityEquivalentVec<T>> for VecDeque<T> {
fn from(value: UniqueEntityEquivalentVec<T>) -> Self {
VecDeque::from(value.0)
}
}
impl<T: EntityEquivalent, const N: usize> TryFrom<UniqueEntityEquivalentVec<T>> for Box<[T; N]> {
type Error = UniqueEntityEquivalentVec<T>;
fn try_from(value: UniqueEntityEquivalentVec<T>) -> Result<Self, Self::Error> {
Box::try_from(value.0).map_err(UniqueEntityEquivalentVec)
}
}
impl<T: EntityEquivalent, const N: usize> TryFrom<UniqueEntityEquivalentVec<T>>
for Box<UniqueEntityEquivalentArray<T, N>>
{
type Error = UniqueEntityEquivalentVec<T>;
fn try_from(value: UniqueEntityEquivalentVec<T>) -> Result<Self, Self::Error> {
Box::try_from(value.0)
.map(|v|
unsafe { UniqueEntityEquivalentArray::from_boxed_array_unchecked(v) })
.map_err(UniqueEntityEquivalentVec)
}
}
impl<T: EntityEquivalent, const N: usize> TryFrom<UniqueEntityEquivalentVec<T>> for [T; N] {
type Error = UniqueEntityEquivalentVec<T>;
fn try_from(value: UniqueEntityEquivalentVec<T>) -> Result<Self, Self::Error> {
<[T; N] as TryFrom<Vec<T>>>::try_from(value.0).map_err(UniqueEntityEquivalentVec)
}
}
impl<T: EntityEquivalent, const N: usize> TryFrom<UniqueEntityEquivalentVec<T>>
for UniqueEntityEquivalentArray<T, N>
{
type Error = UniqueEntityEquivalentVec<T>;
fn try_from(value: UniqueEntityEquivalentVec<T>) -> Result<Self, Self::Error> {
<[T; N] as TryFrom<Vec<T>>>::try_from(value.0)
.map(|v|
unsafe { UniqueEntityEquivalentArray::from_array_unchecked(v) })
.map_err(UniqueEntityEquivalentVec)
}
}
impl<T: EntityEquivalent> From<BTreeSet<T>> for UniqueEntityEquivalentVec<T> {
fn from(value: BTreeSet<T>) -> Self {
Self(value.into_iter().collect::<Vec<T>>())
}
}
impl<T: EntityEquivalent> FromIterator<T> for UniqueEntityEquivalentVec<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let iter = iter.into_iter();
let unique_vec = Self::with_capacity(iter.size_hint().0);
iter.fold(unique_vec, |mut unique_vec, item| {
if !unique_vec.0.contains(&item) {
unique_vec.0.push(item);
}
unique_vec
})
}
}
impl<T: EntityEquivalent> FromEntitySetIterator<T> for UniqueEntityEquivalentVec<T> {
fn from_entity_set_iter<I: EntitySet<Item = T>>(iter: I) -> Self {
unsafe { Self::from_vec_unchecked(Vec::from_iter(iter)) }
}
}
impl<T: EntityEquivalent> Extend<T> for UniqueEntityEquivalentVec<T> {
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
let iter = iter.into_iter();
let reserve = if self.is_empty() {
iter.size_hint().0
} else {
iter.size_hint().0.div_ceil(2)
};
self.reserve(reserve);
iter.for_each(move |item| {
if !self.0.contains(&item) {
self.0.push(item);
}
});
}
}
impl<'a, T: EntityEquivalent + Copy + 'a> Extend<&'a T> for UniqueEntityEquivalentVec<T> {
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
let iter = iter.into_iter();
let reserve = if self.is_empty() {
iter.size_hint().0
} else {
iter.size_hint().0.div_ceil(2)
};
self.reserve(reserve);
iter.for_each(move |item| {
if !self.0.contains(item) {
self.0.push(*item);
}
});
}
}
impl<T: EntityEquivalent> Index<(Bound<usize>, Bound<usize>)> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: (Bound<usize>, Bound<usize>)) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<Range<usize>> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: Range<usize>) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeFrom<usize>> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeFrom<usize>) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeFull> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeFull) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeInclusive<usize>> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeInclusive<usize>) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeTo<usize>> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeTo<usize>) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<RangeToInclusive<usize>> for UniqueEntityEquivalentVec<T> {
type Output = UniqueEntityEquivalentSlice<T>;
fn index(&self, key: RangeToInclusive<usize>) -> &Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }
}
}
impl<T: EntityEquivalent> Index<usize> for UniqueEntityEquivalentVec<T> {
type Output = T;
fn index(&self, key: usize) -> &T {
self.0.index(key)
}
}
impl<T: EntityEquivalent> IndexMut<(Bound<usize>, Bound<usize>)> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: (Bound<usize>, Bound<usize>)) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<Range<usize>> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: Range<usize>) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeFrom<usize>> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: RangeFrom<usize>) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeFull> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: RangeFull) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeInclusive<usize>> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: RangeInclusive<usize>) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeTo<usize>> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: RangeTo<usize>) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
impl<T: EntityEquivalent> IndexMut<RangeToInclusive<usize>> for UniqueEntityEquivalentVec<T> {
fn index_mut(&mut self, key: RangeToInclusive<usize>) -> &mut Self::Output {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }
}
}
pub type IntoIter<T = Entity> = UniqueEntityIter<vec::IntoIter<T>>;
impl<T: EntityEquivalent> UniqueEntityIter<vec::IntoIter<T>> {
pub fn as_slice(&self) -> &UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.as_inner().as_slice()) }
}
pub fn as_mut_slice(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {
unsafe {
UniqueEntityEquivalentSlice::from_slice_unchecked_mut(
self.as_mut_inner().as_mut_slice(),
)
}
}
}
pub type Drain<'a, T = Entity> = UniqueEntityIter<vec::Drain<'a, T>>;
impl<'a, T: EntityEquivalent> UniqueEntityIter<vec::Drain<'a, T>> {
pub fn as_slice(&self) -> &UniqueEntityEquivalentSlice<T> {
unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.as_inner().as_slice()) }
}
}
pub type Splice<'a, I> = UniqueEntityIter<vec::Splice<'a, I>>;