Skip to main content

topcoat_runtime/surrogate/
slice.rs

1use ref_cast::RefCast;
2use serde::ser::{SerializeSeq, SerializeStruct};
3
4use crate::{
5    BoolSurrogate, OptionSurrogate, Surrogate, Surrogated, UsizeSurrogate, VecSurrogate,
6    impl_surrogate_mut, impl_surrogate_ref,
7};
8
9/// A borrowed sequence of runtime values.
10#[derive(Debug, RefCast)]
11#[repr(transparent)]
12pub struct SliceSurrogate<T>([T]);
13
14impl<T> SliceSurrogate<T> {
15    #[must_use]
16    pub fn len(&self) -> UsizeSurrogate {
17        UsizeSurrogate::new(self.0.len())
18    }
19
20    #[must_use]
21    pub fn is_empty(&self) -> BoolSurrogate {
22        BoolSurrogate::new(self.0.is_empty())
23    }
24
25    #[must_use]
26    pub fn get(&self, index: UsizeSurrogate) -> OptionSurrogate<&T> {
27        OptionSurrogate::new(self.0.get(index.into_real()))
28    }
29
30    /// Borrows the element at `index`.
31    ///
32    /// # Panics
33    ///
34    /// Panics if `index` is out of bounds.
35    #[must_use]
36    #[track_caller]
37    pub fn index<'a>(&'a self, index: UsizeSurrogate) -> <&'a T as Surrogated>::Surrogate
38    where
39        &'a T: Surrogated,
40    {
41        (&self.0[index.into_real()]).into_surrogate()
42    }
43
44    #[must_use]
45    pub fn first(&self) -> OptionSurrogate<&T> {
46        OptionSurrogate::new(self.0.first())
47    }
48
49    #[must_use]
50    pub fn last(&self) -> OptionSurrogate<&T> {
51        OptionSurrogate::new(self.0.last())
52    }
53}
54
55impl<T: Clone> SliceSurrogate<T> {
56    #[must_use]
57    pub fn to_vec(&self) -> VecSurrogate<T> {
58        VecSurrogate::new(self.0.to_vec())
59    }
60
61    #[must_use]
62    pub fn to_owned(&self) -> VecSurrogate<T> {
63        self.to_vec()
64    }
65}
66
67impl<T> SliceSurrogate<T>
68where
69    for<'a> &'a T: Surrogated,
70    for<'a> <&'a T as Surrogated>::Surrogate: serde::Serialize,
71{
72    pub(super) fn serialize_with_tag<S>(
73        &self,
74        serializer: S,
75        tag: &'static str,
76    ) -> Result<S::Ok, S::Error>
77    where
78        S: serde::Serializer,
79    {
80        let mut value = serializer.serialize_struct("Sequence", 3)?;
81        value.serialize_field("t", tag)?;
82        value.serialize_field("bits", &usize::BITS)?;
83        value.serialize_field("v", &Elements(&self.0))?;
84        value.end()
85    }
86}
87
88impl_surrogate_ref!({ T }[T], SliceSurrogate<T>);
89impl_surrogate_mut!({ T }[T], SliceSurrogate<T>);
90
91impl<T> serde::Serialize for SliceSurrogate<T>
92where
93    for<'a> &'a T: Surrogated,
94    for<'a> <&'a T as Surrogated>::Surrogate: serde::Serialize,
95{
96    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
97    where
98        S: serde::Serializer,
99    {
100        self.serialize_with_tag(serializer, "Slice")
101    }
102}
103
104struct Elements<'a, T>(&'a [T]);
105
106impl<T> serde::Serialize for Elements<'_, T>
107where
108    for<'a> &'a T: Surrogated,
109    for<'a> <&'a T as Surrogated>::Surrogate: serde::Serialize,
110{
111    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
112    where
113        S: serde::Serializer,
114    {
115        let mut sequence = serializer.serialize_seq(Some(self.0.len()))?;
116        for element in self.0 {
117            sequence.serialize_element(&element.into_surrogate())?;
118        }
119        sequence.end()
120    }
121}