Path: blob/main/crates/bevy_reflect/src/impls/alloc/collections/btree/map.rs
9395 views
use crate::{1error::ReflectCloneError,2generics::{Generics, TypeParamInfo},3kind::{ReflectKind, ReflectMut, ReflectOwned, ReflectRef},4map::{map_apply, map_partial_cmp, map_partial_eq, map_try_apply, Map, MapInfo},5prelude::*,6reflect::{impl_full_reflect, ApplyError},7type_info::{MaybeTyped, TypeInfo, Typed},8type_registry::{FromType, GetTypeRegistration, ReflectFromPtr, TypeRegistration},9utility::GenericTypeInfoCell,10};11use alloc::vec::Vec;12use bevy_platform::prelude::*;13use bevy_reflect_derive::impl_type_path;1415impl<K, V> Map for ::alloc::collections::BTreeMap<K, V>16where17K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,18V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,19{20fn get(&self, key: &dyn PartialReflect) -> Option<&dyn PartialReflect> {21key.try_downcast_ref::<K>()22.and_then(|key| Self::get(self, key))23.map(|value| value as &dyn PartialReflect)24}2526fn get_mut(&mut self, key: &dyn PartialReflect) -> Option<&mut dyn PartialReflect> {27key.try_downcast_ref::<K>()28.and_then(move |key| Self::get_mut(self, key))29.map(|value| value as &mut dyn PartialReflect)30}3132fn len(&self) -> usize {33Self::len(self)34}3536fn iter(&self) -> Box<dyn Iterator<Item = (&dyn PartialReflect, &dyn PartialReflect)> + '_> {37Box::new(38self.iter()39.map(|(k, v)| (k as &dyn PartialReflect, v as &dyn PartialReflect)),40)41}4243fn drain(&mut self) -> Vec<(Box<dyn PartialReflect>, Box<dyn PartialReflect>)> {44// BTreeMap doesn't have a `drain` function. See45// https://github.com/rust-lang/rust/issues/81074. So we have to fake one by popping46// elements off one at a time.47let mut result = Vec::with_capacity(self.len());48while let Some((k, v)) = self.pop_first() {49result.push((50Box::new(k) as Box<dyn PartialReflect>,51Box::new(v) as Box<dyn PartialReflect>,52));53}54result55}5657fn retain(&mut self, f: &mut dyn FnMut(&dyn PartialReflect, &mut dyn PartialReflect) -> bool) {58self.retain(move |k, v| f(k, v));59}6061fn insert_boxed(62&mut self,63key: Box<dyn PartialReflect>,64value: Box<dyn PartialReflect>,65) -> Option<Box<dyn PartialReflect>> {66let key = K::take_from_reflect(key).unwrap_or_else(|key| {67panic!(68"Attempted to insert invalid key of type {}.",69key.reflect_type_path()70)71});72let value = V::take_from_reflect(value).unwrap_or_else(|value| {73panic!(74"Attempted to insert invalid value of type {}.",75value.reflect_type_path()76)77});78self.insert(key, value)79.map(|old_value| Box::new(old_value) as Box<dyn PartialReflect>)80}8182fn remove(&mut self, key: &dyn PartialReflect) -> Option<Box<dyn PartialReflect>> {83let mut from_reflect = None;84key.try_downcast_ref::<K>()85.or_else(|| {86from_reflect = K::from_reflect(key);87from_reflect.as_ref()88})89.and_then(|key| self.remove(key))90.map(|value| Box::new(value) as Box<dyn PartialReflect>)91}92}9394impl<K, V> PartialReflect for ::alloc::collections::BTreeMap<K, V>95where96K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,97V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,98{99fn get_represented_type_info(&self) -> Option<&'static TypeInfo> {100Some(<Self as Typed>::type_info())101}102#[inline]103fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect> {104self105}106107fn as_partial_reflect(&self) -> &dyn PartialReflect {108self109}110111fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect {112self113}114#[inline]115fn try_into_reflect(self: Box<Self>) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>> {116Ok(self)117}118119fn try_as_reflect(&self) -> Option<&dyn Reflect> {120Some(self)121}122123fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect> {124Some(self)125}126fn reflect_kind(&self) -> ReflectKind {127ReflectKind::Map128}129130fn reflect_ref(&self) -> ReflectRef<'_> {131ReflectRef::Map(self)132}133134fn reflect_mut(&mut self) -> ReflectMut<'_> {135ReflectMut::Map(self)136}137138fn reflect_owned(self: Box<Self>) -> ReflectOwned {139ReflectOwned::Map(self)140}141142fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError> {143let mut map = Self::new();144for (key, value) in self.iter() {145let key = key.reflect_clone_and_take()?;146let value = value.reflect_clone_and_take()?;147map.insert(key, value);148}149150Ok(Box::new(map))151}152153fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool> {154map_partial_eq(self, value)155}156157fn reflect_partial_cmp(&self, value: &dyn PartialReflect) -> Option<::core::cmp::Ordering> {158map_partial_cmp(self, value)159}160161fn apply(&mut self, value: &dyn PartialReflect) {162map_apply(self, value);163}164165fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError> {166map_try_apply(self, value)167}168}169170impl_full_reflect!(171<K, V> for ::alloc::collections::BTreeMap<K, V>172where173K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,174V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,175);176177impl<K, V> Typed for ::alloc::collections::BTreeMap<K, V>178where179K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,180V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,181{182fn type_info() -> &'static TypeInfo {183static CELL: GenericTypeInfoCell = GenericTypeInfoCell::new();184CELL.get_or_insert::<Self, _>(|| {185TypeInfo::Map(186MapInfo::new::<Self, K, V>().with_generics(Generics::from_iter([187TypeParamInfo::new::<K>("K"),188TypeParamInfo::new::<V>("V"),189])),190)191})192}193}194195impl<K, V> GetTypeRegistration for ::alloc::collections::BTreeMap<K, V>196where197K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,198V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,199{200fn get_type_registration() -> TypeRegistration {201let mut registration = TypeRegistration::of::<Self>();202registration.insert::<ReflectFromPtr>(FromType::<Self>::from_type());203registration.insert::<ReflectFromReflect>(FromType::<Self>::from_type());204registration205}206}207208impl<K, V> FromReflect for ::alloc::collections::BTreeMap<K, V>209where210K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,211V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,212{213fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {214let ref_map = reflect.reflect_ref().as_map().ok()?;215216let mut new_map = Self::new();217218for (key, value) in ref_map.iter() {219let new_key = K::from_reflect(key)?;220let new_value = V::from_reflect(value)?;221new_map.insert(new_key, new_value);222}223224Some(new_map)225}226}227228impl_type_path!(::alloc::collections::BTreeMap<K, V>);229#[cfg(feature = "functions")]230crate::func::macros::impl_function_traits!(::alloc::collections::BTreeMap<K, V>;231<232K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,233V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration234>235);236237238