mirror_mirror/foreign_impls/
array.rs1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::any::Any;
4use core::fmt;
5
6use crate::array::Array;
7use crate::iter::ValueIterMut;
8use crate::type_info::graph::ArrayNode;
9use crate::type_info::graph::NodeId;
10use crate::type_info::graph::TypeGraph;
11use crate::DescribeType;
12use crate::FromReflect;
13use crate::Reflect;
14use crate::ReflectMut;
15use crate::ReflectOwned;
16use crate::ReflectRef;
17use crate::Value;
18
19impl<T, const N: usize> DescribeType for [T; N]
20where
21 T: DescribeType,
22{
23 fn build(graph: &mut TypeGraph) -> NodeId {
24 graph.get_or_build_node_with::<Self, _>(|graph| ArrayNode::new::<Self, T, N>(graph))
25 }
26}
27
28impl<T, const N: usize> Reflect for [T; N]
29where
30 T: FromReflect + DescribeType,
31{
32 trivial_reflect_methods!();
33
34 fn reflect_owned(self: Box<Self>) -> ReflectOwned {
35 ReflectOwned::Array(self)
36 }
37
38 fn reflect_ref(&self) -> ReflectRef<'_> {
39 ReflectRef::Array(self)
40 }
41
42 fn reflect_mut(&mut self) -> ReflectMut<'_> {
43 ReflectMut::Array(self)
44 }
45
46 fn patch(&mut self, value: &dyn Reflect) {
47 if let Some(array) = value.reflect_ref().as_array() {
48 for (idx, new_value) in array.iter().enumerate() {
49 if let Some(value) = self.get_mut(idx) {
50 value.patch(new_value);
51 }
52 }
53 }
54 }
55
56 fn to_value(&self) -> Value {
57 let data = self.iter().map(Reflect::to_value).collect();
58 Value::List(data)
59 }
60
61 fn clone_reflect(&self) -> Box<dyn Reflect> {
62 let value = self.to_value();
63 Box::new(Self::from_reflect(&value).unwrap())
64 }
65
66 fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67 f.debug_list().entries(self.iter()).finish()
68 }
69}
70
71impl<T, const N: usize> Array for [T; N]
72where
73 T: FromReflect + DescribeType,
74{
75 fn get(&self, index: usize) -> Option<&dyn Reflect> {
76 self.as_slice().get(index).map(|value| value.as_reflect())
77 }
78
79 fn get_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
80 self.as_mut_slice()
81 .get_mut(index)
82 .map(|value| value.as_reflect_mut())
83 }
84
85 fn len(&self) -> usize {
86 N
87 }
88
89 fn is_empty(&self) -> bool {
90 N == 0
91 }
92
93 fn iter(&self) -> crate::array::Iter<'_> {
94 crate::array::Iter::new(self)
95 }
96
97 fn iter_mut(&mut self) -> ValueIterMut<'_> {
98 let iter = self
99 .as_mut_slice()
100 .iter_mut()
101 .map(|value| value.as_reflect_mut());
102 Box::new(iter)
103 }
104}
105
106impl<T, const N: usize> FromReflect for [T; N]
107where
108 T: FromReflect + DescribeType,
109{
110 fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
111 Vec::<T>::from_reflect(reflect)?.try_into().ok()
112 }
113}
114
115impl<T, const N: usize> From<[T; N]> for Value
116where
117 T: Reflect,
118{
119 fn from(list: [T; N]) -> Self {
120 let list = list
121 .iter()
122 .map(|value| value.to_value())
123 .collect::<Vec<_>>();
124 Value::List(list)
125 }
126}