Path: blob/main/crates/bevy_reflect/src/impls/alloc/collections/btree/map.rs
6604 views
use crate::{1error::ReflectCloneError,2generics::{Generics, TypeParamInfo},3kind::{ReflectKind, ReflectMut, ReflectOwned, ReflectRef},4map::{map_apply, 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 apply(&mut self, value: &dyn PartialReflect) {158map_apply(self, value);159}160161fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError> {162map_try_apply(self, value)163}164}165166impl_full_reflect!(167<K, V> for ::alloc::collections::BTreeMap<K, V>168where169K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,170V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,171);172173impl<K, V> Typed for ::alloc::collections::BTreeMap<K, V>174where175K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,176V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,177{178fn type_info() -> &'static TypeInfo {179static CELL: GenericTypeInfoCell = GenericTypeInfoCell::new();180CELL.get_or_insert::<Self, _>(|| {181TypeInfo::Map(182MapInfo::new::<Self, K, V>().with_generics(Generics::from_iter([183TypeParamInfo::new::<K>("K"),184TypeParamInfo::new::<V>("V"),185])),186)187})188}189}190191impl<K, V> GetTypeRegistration for ::alloc::collections::BTreeMap<K, V>192where193K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,194V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,195{196fn get_type_registration() -> TypeRegistration {197let mut registration = TypeRegistration::of::<Self>();198registration.insert::<ReflectFromPtr>(FromType::<Self>::from_type());199registration.insert::<ReflectFromReflect>(FromType::<Self>::from_type());200registration201}202}203204impl<K, V> FromReflect for ::alloc::collections::BTreeMap<K, V>205where206K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,207V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,208{209fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {210let ref_map = reflect.reflect_ref().as_map().ok()?;211212let mut new_map = Self::new();213214for (key, value) in ref_map.iter() {215let new_key = K::from_reflect(key)?;216let new_value = V::from_reflect(value)?;217new_map.insert(new_key, new_value);218}219220Some(new_map)221}222}223224impl_type_path!(::alloc::collections::BTreeMap<K, V>);225#[cfg(feature = "functions")]226crate::func::macros::impl_function_traits!(::alloc::collections::BTreeMap<K, V>;227<228K: FromReflect + MaybeTyped + TypePath + GetTypeRegistration + Eq + Ord,229V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration230>231);232233234