mirror_mirror/foreign_impls/
btree_map.rs1use alloc::boxed::Box;
2use alloc::collections::BTreeMap;
3use core::any::Any;
4use core::fmt;
5
6use crate::iter::PairIterMut;
7use crate::type_info::graph::MapNode;
8use crate::type_info::graph::NodeId;
9use crate::type_info::graph::TypeGraph;
10use crate::DescribeType;
11use crate::FromReflect;
12use crate::Map;
13use crate::Reflect;
14use crate::ReflectMut;
15use crate::ReflectOwned;
16use crate::ReflectRef;
17use crate::Value;
18
19impl<K, V> Map for BTreeMap<K, V>
20where
21 K: FromReflect + DescribeType + Ord,
22 V: FromReflect + DescribeType,
23{
24 fn get(&self, key: &dyn Reflect) -> Option<&dyn Reflect> {
25 let key = K::from_reflect(key)?;
26 let value = self.get(&key)?;
27 Some(value.as_reflect())
28 }
29
30 fn get_mut(&mut self, key: &dyn Reflect) -> Option<&mut dyn Reflect> {
31 let key = K::from_reflect(key)?;
32 let value = self.get_mut(&key)?;
33 Some(value.as_reflect_mut())
34 }
35
36 fn insert(&mut self, key: &dyn Reflect, value: &dyn Reflect) -> Option<Box<dyn Reflect>> {
37 let key = K::from_reflect(key)?;
38 let value = V::from_reflect(value)?;
39 let previous = BTreeMap::insert(self, key, value)?;
40 Some(Box::new(previous))
41 }
42
43 fn remove(&mut self, key: &dyn Reflect) -> Option<Box<dyn Reflect>> {
44 let key = K::from_reflect(key)?;
45 let previous = BTreeMap::remove(self, &key)?;
46 Some(Box::new(previous))
47 }
48
49 fn len(&self) -> usize {
50 self.len()
51 }
52
53 fn is_empty(&self) -> bool {
54 self.is_empty()
55 }
56
57 fn iter(&self) -> crate::map::Iter<'_> {
58 let iter = self
59 .iter()
60 .map(|(key, value)| (key.as_reflect(), value.as_reflect()));
61 Box::new(iter)
62 }
63
64 fn iter_mut(&mut self) -> PairIterMut<'_, dyn Reflect> {
65 let iter = self
66 .iter_mut()
67 .map(|(key, value)| (key.as_reflect(), value.as_reflect_mut()));
68 Box::new(iter)
69 }
70}
71
72impl<K, V> DescribeType for BTreeMap<K, V>
73where
74 K: DescribeType,
75 V: DescribeType,
76{
77 fn build(graph: &mut TypeGraph) -> NodeId {
78 graph.get_or_build_node_with::<Self, _>(|graph| MapNode::new::<Self, K, V>(graph))
79 }
80}
81
82impl<K, V> Reflect for BTreeMap<K, V>
83where
84 K: FromReflect + DescribeType + Ord,
85 V: FromReflect + DescribeType,
86{
87 trivial_reflect_methods!();
88
89 fn reflect_owned(self: Box<Self>) -> ReflectOwned {
90 ReflectOwned::Map(self)
91 }
92
93 fn reflect_ref(&self) -> ReflectRef<'_> {
94 ReflectRef::Map(self)
95 }
96
97 fn reflect_mut(&mut self) -> ReflectMut<'_> {
98 ReflectMut::Map(self)
99 }
100
101 fn patch(&mut self, value: &dyn Reflect) {
102 if let Some(map) = value.reflect_ref().as_map() {
103 for (key, new_value) in map.iter() {
104 if let Some(value) = Map::get_mut(self, key) {
105 value.patch(new_value);
106 }
107 }
108 }
109 }
110
111 fn to_value(&self) -> Value {
112 let data = self
113 .iter()
114 .map(|(key, value)| (key.to_value(), value.to_value()))
115 .collect();
116 Value::Map(data)
117 }
118
119 fn clone_reflect(&self) -> Box<dyn Reflect> {
120 let value = self.to_value();
121 Box::new(Self::from_reflect(&value).unwrap())
122 }
123
124 fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
125 f.debug_map().entries(Map::iter(self)).finish()
126 }
127}
128
129impl<K, V> FromReflect for BTreeMap<K, V>
130where
131 K: FromReflect + DescribeType + Ord,
132 V: FromReflect + DescribeType,
133{
134 fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
135 let map = reflect.as_reflect().as_map()?;
136 let mut out = BTreeMap::new();
137 for (key, value) in map.iter() {
138 out.insert(K::from_reflect(key)?, V::from_reflect(value)?);
139 }
140 Some(out)
141 }
142}
143
144impl<K, V> From<BTreeMap<K, V>> for Value
145where
146 K: Reflect,
147 V: Reflect,
148{
149 fn from(map: BTreeMap<K, V>) -> Self {
150 let map = map
151 .into_iter()
152 .map(|(key, value)| (key.to_value(), value.to_value()))
153 .collect();
154 Value::Map(map)
155 }
156}