Path: blob/main/crates/bevy_reflect/src/impls/macros/list.rs
6600 views
macro_rules! impl_reflect_for_veclike {1($ty:ty, $insert:expr, $remove:expr, $push:expr, $pop:expr, $sub:ty) => {2const _: () = {3impl<T: $crate::from_reflect::FromReflect + $crate::type_info::MaybeTyped + $crate::type_path::TypePath + $crate::type_registry::GetTypeRegistration> $crate::list::List for $ty {4#[inline]5fn get(&self, index: usize) -> Option<&dyn $crate::reflect::PartialReflect> {6<$sub>::get(self, index).map(|value| value as &dyn $crate::reflect::PartialReflect)7}89#[inline]10fn get_mut(&mut self, index: usize) -> Option<&mut dyn $crate::reflect::PartialReflect> {11<$sub>::get_mut(self, index).map(|value| value as &mut dyn $crate::reflect::PartialReflect)12}1314fn insert(&mut self, index: usize, value: bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>) {15let value = value.try_take::<T>().unwrap_or_else(|value| {16T::from_reflect(&*value).unwrap_or_else(|| {17panic!(18"Attempted to insert invalid value of type {}.",19value.reflect_type_path()20)21})22});23$insert(self, index, value);24}2526fn remove(&mut self, index: usize) -> bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect> {27bevy_platform::prelude::Box::new($remove(self, index))28}2930fn push(&mut self, value: bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>) {31let value = T::take_from_reflect(value).unwrap_or_else(|value| {32panic!(33"Attempted to push invalid value of type {}.",34value.reflect_type_path()35)36});37$push(self, value);38}3940fn pop(&mut self) -> Option<bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>> {41$pop(self).map(|value| bevy_platform::prelude::Box::new(value) as bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>)42}4344#[inline]45fn len(&self) -> usize {46<$sub>::len(self)47}4849#[inline]50fn iter(&self) -> $crate::list::ListIter<'_> {51$crate::list::ListIter::new(self)52}5354#[inline]55fn drain(&mut self) -> alloc::vec::Vec<bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>> {56self.drain(..)57.map(|value| bevy_platform::prelude::Box::new(value) as bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>)58.collect()59}60}6162impl<T: $crate::from_reflect::FromReflect + $crate::type_info::MaybeTyped + $crate::type_path::TypePath + $crate::type_registry::GetTypeRegistration> $crate::reflect::PartialReflect for $ty {63#[inline]64fn get_represented_type_info(&self) -> Option<&'static $crate::type_info::TypeInfo> {65Some(<Self as $crate::type_info::Typed>::type_info())66}6768fn into_partial_reflect(self: bevy_platform::prelude::Box<Self>) -> bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect> {69self70}7172#[inline]73fn as_partial_reflect(&self) -> &dyn $crate::reflect::PartialReflect {74self75}7677#[inline]78fn as_partial_reflect_mut(&mut self) -> &mut dyn $crate::reflect::PartialReflect {79self80}8182fn try_into_reflect(83self: bevy_platform::prelude::Box<Self>,84) -> Result<bevy_platform::prelude::Box<dyn $crate::reflect::Reflect>, bevy_platform::prelude::Box<dyn $crate::reflect::PartialReflect>> {85Ok(self)86}8788fn try_as_reflect(&self) -> Option<&dyn $crate::reflect::Reflect> {89Some(self)90}9192fn try_as_reflect_mut(&mut self) -> Option<&mut dyn $crate::reflect::Reflect> {93Some(self)94}9596fn reflect_kind(&self) -> $crate::kind::ReflectKind {97$crate::kind::ReflectKind::List98}99100fn reflect_ref(&self) -> $crate::kind::ReflectRef<'_> {101$crate::kind::ReflectRef::List(self)102}103104fn reflect_mut(&mut self) -> $crate::kind::ReflectMut<'_> {105$crate::kind::ReflectMut::List(self)106}107108fn reflect_owned(self: bevy_platform::prelude::Box<Self>) -> $crate::kind::ReflectOwned {109$crate::kind::ReflectOwned::List(self)110}111112fn reflect_clone(&self) -> Result<bevy_platform::prelude::Box<dyn $crate::reflect::Reflect>, $crate::error::ReflectCloneError> {113Ok(bevy_platform::prelude::Box::new(114self.iter()115.map(|value| value.reflect_clone_and_take())116.collect::<Result<Self, $crate::error::ReflectCloneError>>()?,117))118}119120fn reflect_hash(&self) -> Option<u64> {121$crate::list::list_hash(self)122}123124fn reflect_partial_eq(&self, value: &dyn $crate::reflect::PartialReflect) -> Option<bool> {125$crate::list::list_partial_eq(self, value)126}127128fn apply(&mut self, value: &dyn $crate::reflect::PartialReflect) {129$crate::list::list_apply(self, value);130}131132fn try_apply(&mut self, value: &dyn $crate::reflect::PartialReflect) -> Result<(), $crate::reflect::ApplyError> {133$crate::list::list_try_apply(self, value)134}135}136137$crate::impl_full_reflect!(<T> for $ty where T: $crate::from_reflect::FromReflect + $crate::type_info::MaybeTyped + $crate::type_path::TypePath + $crate::type_registry::GetTypeRegistration);138139impl<T: $crate::from_reflect::FromReflect + $crate::type_info::MaybeTyped + $crate::type_path::TypePath + $crate::type_registry::GetTypeRegistration> $crate::type_info::Typed for $ty {140fn type_info() -> &'static $crate::type_info::TypeInfo {141static CELL: $crate::utility::GenericTypeInfoCell = $crate::utility::GenericTypeInfoCell::new();142CELL.get_or_insert::<Self, _>(|| {143$crate::type_info::TypeInfo::List(144$crate::list::ListInfo::new::<Self, T>().with_generics($crate::generics::Generics::from_iter([145$crate::generics::TypeParamInfo::new::<T>("T")146]))147)148})149}150}151152impl<T: $crate::from_reflect::FromReflect + $crate::type_info::MaybeTyped + $crate::type_path::TypePath + $crate::type_registry::GetTypeRegistration> $crate::type_registry::GetTypeRegistration153for $ty154{155fn get_type_registration() -> $crate::type_registry::TypeRegistration {156let mut registration = $crate::type_registry::TypeRegistration::of::<$ty>();157registration.insert::<$crate::type_registry::ReflectFromPtr>($crate::type_registry::FromType::<$ty>::from_type());158registration.insert::<$crate::from_reflect::ReflectFromReflect>($crate::type_registry::FromType::<$ty>::from_type());159registration160}161162fn register_type_dependencies(registry: &mut $crate::type_registry::TypeRegistry) {163registry.register::<T>();164}165}166167impl<T: $crate::from_reflect::FromReflect + $crate::type_info::MaybeTyped + $crate::type_path::TypePath + $crate::type_registry::GetTypeRegistration> $crate::from_reflect::FromReflect for $ty {168fn from_reflect(reflect: &dyn $crate::reflect::PartialReflect) -> Option<Self> {169let ref_list = reflect.reflect_ref().as_list().ok()?;170171let mut new_list = Self::with_capacity(ref_list.len());172173for field in ref_list.iter() {174$push(&mut new_list, T::from_reflect(field)?);175}176177Some(new_list)178}179}180};181};182}183184pub(crate) use impl_reflect_for_veclike;185186187