topcoat_runtime/surrogate/
slice.rs1use 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#[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 #[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}