1use crate::reflection::{FromValue, ReflectValueType, ToValue, UnsafeFromValue};
2use crate::value::{Array, ValuePtr, ValueType, ValueTypeInfo};
3use crate::vm::{RawRefGuard, Ref, StackError, Vm};
4
5impl<T> ReflectValueType for Array<T> {
6 fn value_type() -> ValueType {
7 ValueType::Array
8 }
9
10 fn value_type_info() -> ValueTypeInfo {
11 ValueTypeInfo::Array
12 }
13}
14
15impl<'a, T> ReflectValueType for &'a Array<T> {
16 fn value_type() -> ValueType {
17 ValueType::Array
18 }
19
20 fn value_type_info() -> ValueTypeInfo {
21 ValueTypeInfo::Array
22 }
23}
24
25impl<'a, T> ReflectValueType for &'a mut Array<T> {
26 fn value_type() -> ValueType {
27 ValueType::Array
28 }
29
30 fn value_type_info() -> ValueTypeInfo {
31 ValueTypeInfo::Array
32 }
33}
34
35impl<T> FromValue for Array<T>
36where
37 T: FromValue,
38{
39 fn from_value(value: ValuePtr, vm: &mut Vm) -> Result<Self, StackError> {
40 let slot = value.into_array(vm)?;
41 let array = vm.array_take(slot)?;
42
43 let mut output = Array::with_capacity(array.len());
44
45 for value in array {
46 output.push(T::from_value(value, vm)?);
47 }
48
49 Ok(output)
50 }
51}
52
53impl<'a> UnsafeFromValue for &'a Array<ValuePtr> {
54 type Guard = RawRefGuard;
55
56 unsafe fn unsafe_from_value(
57 value: ValuePtr,
58 vm: &mut Vm,
59 ) -> Result<(Self, Self::Guard), StackError> {
60 let slot = value.into_array(vm)?;
61 Ok(Ref::unsafe_into_ref(vm.array_ref(slot)?))
62 }
63}
64
65impl<T> ToValue for Array<T>
66where
67 T: ToValue,
68{
69 fn to_value(self, vm: &mut Vm) -> Result<ValuePtr, StackError> {
70 let mut array = Array::with_capacity(self.len());
71
72 for value in self {
73 array.push(value.to_value(vm)?);
74 }
75
76 Ok(vm.array_allocate(array))
77 }
78}