stk/reflection/
array.rs

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}