Path: blob/main/crates/bevy_ecs/src/entity/unique_array.rs
6849 views
//! A wrapper around entity arrays with a uniqueness invariant.12use core::{3array,4borrow::{Borrow, BorrowMut},5fmt::Debug,6ops::{7Bound, Deref, DerefMut, Index, IndexMut, Range, RangeFrom, RangeFull, RangeInclusive,8RangeTo, RangeToInclusive,9},10ptr,11};1213use alloc::{14boxed::Box,15collections::{BTreeSet, BinaryHeap, LinkedList, VecDeque},16rc::Rc,17vec::Vec,18};1920use bevy_platform::sync::Arc;2122use super::{23unique_slice::{self, UniqueEntityEquivalentSlice},24Entity, EntityEquivalent, UniqueEntityIter,25};2627/// An array that contains only unique entities.28///29/// It can be obtained through certain methods on [`UniqueEntityEquivalentSlice`],30/// and some [`TryFrom`] implementations.31///32/// When `T` is [`Entity`], use [`UniqueEntityArray`].33#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]34pub struct UniqueEntityEquivalentArray<T: EntityEquivalent, const N: usize>([T; N]);3536/// An array that contains only unique [`Entity`].37///38/// This is the default case of a [`UniqueEntityEquivalentArray`].39pub type UniqueEntityArray<const N: usize> = UniqueEntityEquivalentArray<Entity, N>;4041impl<T: EntityEquivalent, const N: usize> UniqueEntityEquivalentArray<T, N> {42/// Constructs a `UniqueEntityEquivalentArray` from a [`[T; N]`] unsafely.43///44/// # Safety45///46/// `array` must contain only unique elements.47pub const unsafe fn from_array_unchecked(array: [T; N]) -> Self {48Self(array)49}5051/// Constructs a `&UniqueEntityEquivalentArray` from a [`&[T; N]`] unsafely.52///53/// # Safety54///55/// `array` must contain only unique elements.56pub const unsafe fn from_array_ref_unchecked(array: &[T; N]) -> &Self {57// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].58unsafe { &*(ptr::from_ref(array).cast()) }59}6061/// Constructs a `Box<UniqueEntityEquivalentArray>` from a [`Box<[T; N]>`] unsafely.62///63/// # Safety64///65/// `array` must contain only unique elements.66pub unsafe fn from_boxed_array_unchecked(array: Box<[T; N]>) -> Box<Self> {67// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].68unsafe { Box::from_raw(Box::into_raw(array).cast()) }69}7071/// Casts `self` into the inner array.72pub fn into_boxed_inner(self: Box<Self>) -> Box<[T; N]> {73// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].74unsafe { Box::from_raw(Box::into_raw(self).cast()) }75}7677/// Constructs a `Arc<UniqueEntityEquivalentArray>` from a [`Arc<[T; N]>`] unsafely.78///79/// # Safety80///81/// `slice` must contain only unique elements.82pub unsafe fn from_arc_array_unchecked(slice: Arc<[T; N]>) -> Arc<Self> {83// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].84unsafe { Arc::from_raw(Arc::into_raw(slice).cast()) }85}8687/// Casts `self` to the inner array.88pub fn into_arc_inner(this: Arc<Self>) -> Arc<[T; N]> {89// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].90unsafe { Arc::from_raw(Arc::into_raw(this).cast()) }91}9293// Constructs a `Rc<UniqueEntityEquivalentArray>` from a [`Rc<[T; N]>`] unsafely.94///95/// # Safety96///97/// `slice` must contain only unique elements.98pub unsafe fn from_rc_array_unchecked(slice: Rc<[T; N]>) -> Rc<Self> {99// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].100unsafe { Rc::from_raw(Rc::into_raw(slice).cast()) }101}102103/// Casts `self` to the inner array.104pub fn into_rc_inner(self: Rc<Self>) -> Rc<[T; N]> {105// SAFETY: UniqueEntityEquivalentArray is a transparent wrapper around [T; N].106unsafe { Rc::from_raw(Rc::into_raw(self).cast()) }107}108109/// Return the inner array.110pub fn into_inner(self) -> [T; N] {111self.0112}113114/// Returns a reference to the inner array.115pub fn as_inner(&self) -> &[T; N] {116&self.0117}118119/// Returns a slice containing the entire array. Equivalent to `&s[..]`.120pub const fn as_slice(&self) -> &UniqueEntityEquivalentSlice<T> {121// SAFETY: All elements in the original array are unique.122unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.as_slice()) }123}124125/// Returns a mutable slice containing the entire array. Equivalent to126/// `&mut s[..]`.127pub fn as_mut_slice(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {128// SAFETY: All elements in the original array are unique.129unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.as_mut_slice()) }130}131132/// Borrows each element and returns an array of references with the same133/// size as `self`.134///135/// Equivalent to [`[T; N]::as_ref`](array::each_ref).136pub fn each_ref(&self) -> UniqueEntityEquivalentArray<&T, N> {137UniqueEntityEquivalentArray(self.0.each_ref())138}139}140141impl<T: EntityEquivalent, const N: usize> Deref for UniqueEntityEquivalentArray<T, N> {142type Target = UniqueEntityEquivalentSlice<T>;143144fn deref(&self) -> &Self::Target {145// SAFETY: All elements in the original array are unique.146unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(&self.0) }147}148}149150impl<T: EntityEquivalent, const N: usize> DerefMut for UniqueEntityEquivalentArray<T, N> {151fn deref_mut(&mut self) -> &mut Self::Target {152// SAFETY: All elements in the original array are unique.153unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(&mut self.0) }154}155}156157impl<T: EntityEquivalent> Default for UniqueEntityEquivalentArray<T, 0> {158fn default() -> Self {159Self(Default::default())160}161}162163impl<'a, T: EntityEquivalent, const N: usize> IntoIterator164for &'a UniqueEntityEquivalentArray<T, N>165{166type Item = &'a T;167168type IntoIter = unique_slice::Iter<'a, T>;169170fn into_iter(self) -> Self::IntoIter {171// SAFETY: All elements in the original array are unique.172unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.iter()) }173}174}175176impl<T: EntityEquivalent, const N: usize> IntoIterator for UniqueEntityEquivalentArray<T, N> {177type Item = T;178179type IntoIter = IntoIter<N, T>;180181fn into_iter(self) -> Self::IntoIter {182// SAFETY: All elements in the original array are unique.183unsafe { UniqueEntityIter::from_iterator_unchecked(self.0.into_iter()) }184}185}186187impl<T: EntityEquivalent, const N: usize> AsRef<UniqueEntityEquivalentSlice<T>>188for UniqueEntityEquivalentArray<T, N>189{190fn as_ref(&self) -> &UniqueEntityEquivalentSlice<T> {191self192}193}194195impl<T: EntityEquivalent, const N: usize> AsMut<UniqueEntityEquivalentSlice<T>>196for UniqueEntityEquivalentArray<T, N>197{198fn as_mut(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {199self200}201}202203impl<T: EntityEquivalent, const N: usize> Borrow<UniqueEntityEquivalentSlice<T>>204for UniqueEntityEquivalentArray<T, N>205{206fn borrow(&self) -> &UniqueEntityEquivalentSlice<T> {207self208}209}210211impl<T: EntityEquivalent, const N: usize> BorrowMut<UniqueEntityEquivalentSlice<T>>212for UniqueEntityEquivalentArray<T, N>213{214fn borrow_mut(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {215self216}217}218219impl<T: EntityEquivalent, const N: usize> Index<(Bound<usize>, Bound<usize>)>220for UniqueEntityEquivalentArray<T, N>221{222type Output = UniqueEntityEquivalentSlice<T>;223fn index(&self, key: (Bound<usize>, Bound<usize>)) -> &Self::Output {224// SAFETY: All elements in the original slice are unique.225unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }226}227}228229impl<T: EntityEquivalent, const N: usize> Index<Range<usize>>230for UniqueEntityEquivalentArray<T, N>231{232type Output = UniqueEntityEquivalentSlice<T>;233fn index(&self, key: Range<usize>) -> &Self::Output {234// SAFETY: All elements in the original slice are unique.235unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }236}237}238239impl<T: EntityEquivalent, const N: usize> Index<RangeFrom<usize>>240for UniqueEntityEquivalentArray<T, N>241{242type Output = UniqueEntityEquivalentSlice<T>;243fn index(&self, key: RangeFrom<usize>) -> &Self::Output {244// SAFETY: All elements in the original slice are unique.245unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }246}247}248249impl<T: EntityEquivalent, const N: usize> Index<RangeFull> for UniqueEntityEquivalentArray<T, N> {250type Output = UniqueEntityEquivalentSlice<T>;251fn index(&self, key: RangeFull) -> &Self::Output {252// SAFETY: All elements in the original slice are unique.253unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }254}255}256257impl<T: EntityEquivalent, const N: usize> Index<RangeInclusive<usize>>258for UniqueEntityEquivalentArray<T, N>259{260type Output = UniqueEntityEquivalentSlice<T>;261fn index(&self, key: RangeInclusive<usize>) -> &Self::Output {262// SAFETY: All elements in the original slice are unique.263unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }264}265}266267impl<T: EntityEquivalent, const N: usize> Index<RangeTo<usize>>268for UniqueEntityEquivalentArray<T, N>269{270type Output = UniqueEntityEquivalentSlice<T>;271fn index(&self, key: RangeTo<usize>) -> &Self::Output {272// SAFETY: All elements in the original slice are unique.273unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }274}275}276277impl<T: EntityEquivalent, const N: usize> Index<RangeToInclusive<usize>>278for UniqueEntityEquivalentArray<T, N>279{280type Output = UniqueEntityEquivalentSlice<T>;281fn index(&self, key: RangeToInclusive<usize>) -> &Self::Output {282// SAFETY: All elements in the original slice are unique.283unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.0.index(key)) }284}285}286287impl<T: EntityEquivalent, const N: usize> Index<usize> for UniqueEntityEquivalentArray<T, N> {288type Output = T;289fn index(&self, key: usize) -> &T {290self.0.index(key)291}292}293294impl<T: EntityEquivalent, const N: usize> IndexMut<(Bound<usize>, Bound<usize>)>295for UniqueEntityEquivalentArray<T, N>296{297fn index_mut(&mut self, key: (Bound<usize>, Bound<usize>)) -> &mut Self::Output {298// SAFETY: All elements in the original slice are unique.299unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }300}301}302303impl<T: EntityEquivalent, const N: usize> IndexMut<Range<usize>>304for UniqueEntityEquivalentArray<T, N>305{306fn index_mut(&mut self, key: Range<usize>) -> &mut Self::Output {307// SAFETY: All elements in the original slice are unique.308unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }309}310}311312impl<T: EntityEquivalent, const N: usize> IndexMut<RangeFrom<usize>>313for UniqueEntityEquivalentArray<T, N>314{315fn index_mut(&mut self, key: RangeFrom<usize>) -> &mut Self::Output {316// SAFETY: All elements in the original slice are unique.317unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }318}319}320321impl<T: EntityEquivalent, const N: usize> IndexMut<RangeFull>322for UniqueEntityEquivalentArray<T, N>323{324fn index_mut(&mut self, key: RangeFull) -> &mut Self::Output {325// SAFETY: All elements in the original slice are unique.326unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }327}328}329330impl<T: EntityEquivalent, const N: usize> IndexMut<RangeInclusive<usize>>331for UniqueEntityEquivalentArray<T, N>332{333fn index_mut(&mut self, key: RangeInclusive<usize>) -> &mut Self::Output {334// SAFETY: All elements in the original slice are unique.335unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }336}337}338339impl<T: EntityEquivalent, const N: usize> IndexMut<RangeTo<usize>>340for UniqueEntityEquivalentArray<T, N>341{342fn index_mut(&mut self, key: RangeTo<usize>) -> &mut Self::Output {343// SAFETY: All elements in the original slice are unique.344unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }345}346}347348impl<T: EntityEquivalent, const N: usize> IndexMut<RangeToInclusive<usize>>349for UniqueEntityEquivalentArray<T, N>350{351fn index_mut(&mut self, key: RangeToInclusive<usize>) -> &mut Self::Output {352// SAFETY: All elements in the original slice are unique.353unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked_mut(self.0.index_mut(key)) }354}355}356357impl<T: EntityEquivalent + Clone> From<&[T; 1]> for UniqueEntityEquivalentArray<T, 1> {358fn from(value: &[T; 1]) -> Self {359Self(value.clone())360}361}362363impl<T: EntityEquivalent + Clone> From<&[T; 0]> for UniqueEntityEquivalentArray<T, 0> {364fn from(value: &[T; 0]) -> Self {365Self(value.clone())366}367}368369impl<T: EntityEquivalent + Clone> From<&mut [T; 1]> for UniqueEntityEquivalentArray<T, 1> {370fn from(value: &mut [T; 1]) -> Self {371Self(value.clone())372}373}374375impl<T: EntityEquivalent + Clone> From<&mut [T; 0]> for UniqueEntityEquivalentArray<T, 0> {376fn from(value: &mut [T; 0]) -> Self {377Self(value.clone())378}379}380381impl<T: EntityEquivalent> From<[T; 1]> for UniqueEntityEquivalentArray<T, 1> {382fn from(value: [T; 1]) -> Self {383Self(value)384}385}386387impl<T: EntityEquivalent> From<[T; 0]> for UniqueEntityEquivalentArray<T, 0> {388fn from(value: [T; 0]) -> Self {389Self(value)390}391}392393impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 1>> for (T,) {394fn from(array: UniqueEntityEquivalentArray<T, 1>) -> Self {395Self::from(array.into_inner())396}397}398399impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 2>> for (T, T) {400fn from(array: UniqueEntityEquivalentArray<T, 2>) -> Self {401Self::from(array.into_inner())402}403}404405impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 3>> for (T, T, T) {406fn from(array: UniqueEntityEquivalentArray<T, 3>) -> Self {407Self::from(array.into_inner())408}409}410411impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 4>> for (T, T, T, T) {412fn from(array: UniqueEntityEquivalentArray<T, 4>) -> Self {413Self::from(array.into_inner())414}415}416417impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 5>> for (T, T, T, T, T) {418fn from(array: UniqueEntityEquivalentArray<T, 5>) -> Self {419Self::from(array.into_inner())420}421}422423impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 6>> for (T, T, T, T, T, T) {424fn from(array: UniqueEntityEquivalentArray<T, 6>) -> Self {425Self::from(array.into_inner())426}427}428429impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 7>> for (T, T, T, T, T, T, T) {430fn from(array: UniqueEntityEquivalentArray<T, 7>) -> Self {431Self::from(array.into_inner())432}433}434435impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 8>> for (T, T, T, T, T, T, T, T) {436fn from(array: UniqueEntityEquivalentArray<T, 8>) -> Self {437Self::from(array.into_inner())438}439}440441impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 9>> for (T, T, T, T, T, T, T, T, T) {442fn from(array: UniqueEntityEquivalentArray<T, 9>) -> Self {443Self::from(array.into_inner())444}445}446447impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 10>>448for (T, T, T, T, T, T, T, T, T, T)449{450fn from(array: UniqueEntityEquivalentArray<T, 10>) -> Self {451Self::from(array.into_inner())452}453}454455impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 11>>456for (T, T, T, T, T, T, T, T, T, T, T)457{458fn from(array: UniqueEntityEquivalentArray<T, 11>) -> Self {459Self::from(array.into_inner())460}461}462463impl<T: EntityEquivalent> From<UniqueEntityEquivalentArray<T, 12>>464for (T, T, T, T, T, T, T, T, T, T, T, T)465{466fn from(array: UniqueEntityEquivalentArray<T, 12>) -> Self {467Self::from(array.into_inner())468}469}470471impl<T: EntityEquivalent + Ord, const N: usize> From<UniqueEntityEquivalentArray<T, N>>472for BTreeSet<T>473{474fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {475BTreeSet::from(value.0)476}477}478479impl<T: EntityEquivalent + Ord, const N: usize> From<UniqueEntityEquivalentArray<T, N>>480for BinaryHeap<T>481{482fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {483BinaryHeap::from(value.0)484}485}486487impl<T: EntityEquivalent, const N: usize> From<UniqueEntityEquivalentArray<T, N>>488for LinkedList<T>489{490fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {491LinkedList::from(value.0)492}493}494495impl<T: EntityEquivalent, const N: usize> From<UniqueEntityEquivalentArray<T, N>> for Vec<T> {496fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {497Vec::from(value.0)498}499}500501impl<T: EntityEquivalent, const N: usize> From<UniqueEntityEquivalentArray<T, N>> for VecDeque<T> {502fn from(value: UniqueEntityEquivalentArray<T, N>) -> Self {503VecDeque::from(value.0)504}505}506507impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent, const N: usize>508PartialEq<&UniqueEntityEquivalentSlice<U>> for UniqueEntityEquivalentArray<T, N>509{510fn eq(&self, other: &&UniqueEntityEquivalentSlice<U>) -> bool {511self.0.eq(&other.as_inner())512}513}514515impl<T: EntityEquivalent + PartialEq<U>, U: EntityEquivalent, const N: usize>516PartialEq<UniqueEntityEquivalentSlice<U>> for UniqueEntityEquivalentArray<T, N>517{518fn eq(&self, other: &UniqueEntityEquivalentSlice<U>) -> bool {519self.0.eq(other.as_inner())520}521}522523impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>524PartialEq<&UniqueEntityEquivalentArray<U, N>> for Vec<T>525{526fn eq(&self, other: &&UniqueEntityEquivalentArray<U, N>) -> bool {527self.eq(&other.0)528}529}530531impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>532PartialEq<&UniqueEntityEquivalentArray<U, N>> for VecDeque<T>533{534fn eq(&self, other: &&UniqueEntityEquivalentArray<U, N>) -> bool {535self.eq(&other.0)536}537}538539impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>540PartialEq<&mut UniqueEntityEquivalentArray<U, N>> for VecDeque<T>541{542fn eq(&self, other: &&mut UniqueEntityEquivalentArray<U, N>) -> bool {543self.eq(&other.0)544}545}546547impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>548PartialEq<UniqueEntityEquivalentArray<U, N>> for Vec<T>549{550fn eq(&self, other: &UniqueEntityEquivalentArray<U, N>) -> bool {551self.eq(&other.0)552}553}554555impl<T: PartialEq<U>, U: EntityEquivalent, const N: usize>556PartialEq<UniqueEntityEquivalentArray<U, N>> for VecDeque<T>557{558fn eq(&self, other: &UniqueEntityEquivalentArray<U, N>) -> bool {559self.eq(&other.0)560}561}562563/// A by-value array iterator.564///565/// Equivalent to [`array::IntoIter`].566pub type IntoIter<const N: usize, T = Entity> = UniqueEntityIter<array::IntoIter<T, N>>;567568impl<T: EntityEquivalent, const N: usize> UniqueEntityIter<array::IntoIter<T, N>> {569/// Returns an immutable slice of all elements that have not been yielded570/// yet.571///572/// Equivalent to [`array::IntoIter::as_slice`].573pub fn as_slice(&self) -> &UniqueEntityEquivalentSlice<T> {574// SAFETY: All elements in the original slice are unique.575unsafe { UniqueEntityEquivalentSlice::from_slice_unchecked(self.as_inner().as_slice()) }576}577578/// Returns a mutable slice of all elements that have not been yielded yet.579///580/// Equivalent to [`array::IntoIter::as_mut_slice`].581pub fn as_mut_slice(&mut self) -> &mut UniqueEntityEquivalentSlice<T> {582// SAFETY: All elements in the original slice are unique.583unsafe {584UniqueEntityEquivalentSlice::from_slice_unchecked_mut(585self.as_mut_inner().as_mut_slice(),586)587}588}589}590591592