1use crate::private::layout::CapTable;
23use crate::private::layout::{
24 ListReader, PointerBuilder, PointerReader, StructBuilder, StructReader, StructSize,
25};
26use crate::Result;
27
28use core::marker::PhantomData;
29
30pub trait HasStructSize {
31 const STRUCT_SIZE: StructSize;
32}
33
34pub trait IntoInternalStructReader<'a> {
36 fn into_internal_struct_reader(self) -> StructReader<'a>;
37}
38
39pub trait IntoInternalStructBuilder<'a> {
41 fn into_internal_struct_builder(self) -> StructBuilder<'a>;
42}
43
44pub trait IntoInternalListReader<'a> {
46 fn into_internal_list_reader(self) -> ListReader<'a>;
47}
48
49pub trait FromPointerReader<'a>: Sized {
50 fn get_from_pointer(
51 reader: &PointerReader<'a>,
52 default: Option<&'a [crate::Word]>,
53 ) -> Result<Self>;
54}
55
56pub trait Owned: crate::introspect::Introspect {
67 type Reader<'a>: FromPointerReader<'a> + SetterInput<Self>;
68 type Builder<'a>: FromPointerBuilder<'a>;
69}
70
71pub trait OwnedStruct: crate::introspect::Introspect {
72 type Reader<'a>: From<StructReader<'a>> + SetterInput<Self> + IntoInternalStructReader<'a>;
73 type Builder<'a>: From<StructBuilder<'a>> + HasStructSize;
74}
75
76pub trait Pipelined {
77 type Pipeline;
78}
79
80pub trait FromPointerBuilder<'a>: Sized {
81 fn init_pointer(builder: PointerBuilder<'a>, length: u32) -> Self;
82 fn get_from_pointer(
83 builder: PointerBuilder<'a>,
84 default: Option<&'a [crate::Word]>,
85 ) -> Result<Self>;
86}
87
88pub trait SetterInput<Receiver: ?Sized> {
94 fn set_pointer_builder(
99 builder: PointerBuilder<'_>,
100 input: Self,
101 canonicalize: bool,
102 ) -> Result<()>;
103}
104
105pub trait Imbue<'a> {
111 fn imbue(&mut self, caps: &'a CapTable);
112}
113
114pub trait ImbueMut<'a> {
116 fn imbue_mut(&mut self, caps: &'a mut CapTable);
117}
118
119pub trait HasTypeId {
122 const TYPE_ID: u64;
123}
124
125pub trait IndexMove<I, T> {
126 fn index_move(&self, index: I) -> T;
127}
128
129pub struct ListIter<T, U> {
130 marker: PhantomData<U>,
131 list: T,
132 index: u32,
133 size: u32,
134}
135
136impl<T, U> ListIter<T, U> {
137 pub fn new(list: T, size: u32) -> Self {
138 Self {
139 list,
140 index: 0,
141 size,
142 marker: PhantomData,
143 }
144 }
145}
146
147impl<U, T: IndexMove<u32, U>> ::core::iter::Iterator for ListIter<T, U> {
148 type Item = U;
149 fn next(&mut self) -> ::core::option::Option<U> {
150 if self.index < self.size {
151 let result = self.list.index_move(self.index);
152 self.index += 1;
153 Some(result)
154 } else {
155 None
156 }
157 }
158
159 fn size_hint(&self) -> (usize, Option<usize>) {
160 let remaining = self.size as usize - self.index as usize;
161 (remaining, Some(remaining))
162 }
163
164 fn nth(&mut self, p: usize) -> Option<U> {
165 let Some(p) = p.try_into().ok() else {
166 self.index = self.size;
167 return None;
168 };
169 let Some(nth_index) = self.index.checked_add(p) else {
170 self.index = self.size;
171 return None;
172 };
173 if nth_index < self.size {
174 self.index = nth_index;
175 let result = self.list.index_move(self.index);
176 self.index += 1;
177 Some(result)
178 } else {
179 self.index = self.size;
180 None
181 }
182 }
183}
184
185impl<U, T: IndexMove<u32, U>> ::core::iter::ExactSizeIterator for ListIter<T, U> {
186 fn len(&self) -> usize {
187 self.size as usize - self.index as usize
188 }
189}
190
191impl<U, T: IndexMove<u32, U>> ::core::iter::DoubleEndedIterator for ListIter<T, U> {
192 fn next_back(&mut self) -> ::core::option::Option<U> {
193 if self.size > self.index {
194 self.size -= 1;
195 Some(self.list.index_move(self.size))
196 } else {
197 None
198 }
199 }
200}
201
202pub struct ShortListIter<T, U> {
204 marker: PhantomData<U>,
205 list: T,
206 index: u16,
207 size: u16,
208}
209
210impl<T, U> ShortListIter<T, U> {
211 pub fn new(list: T, size: u16) -> Self {
212 Self {
213 list,
214 index: 0,
215 size,
216 marker: PhantomData,
217 }
218 }
219}
220
221impl<U, T: IndexMove<u16, U>> ::core::iter::Iterator for ShortListIter<T, U> {
222 type Item = U;
223 fn next(&mut self) -> ::core::option::Option<U> {
224 if self.index < self.size {
225 let result = self.list.index_move(self.index);
226 self.index += 1;
227 Some(result)
228 } else {
229 None
230 }
231 }
232
233 fn size_hint(&self) -> (usize, Option<usize>) {
234 let remaining = self.size as usize - self.index as usize;
235 (remaining, Some(remaining))
236 }
237
238 fn nth(&mut self, p: usize) -> Option<U> {
239 let Some(p) = p.try_into().ok() else {
240 self.index = self.size;
241 return None;
242 };
243 let Some(nth_index) = self.index.checked_add(p) else {
244 self.index = self.size;
245 return None;
246 };
247 if nth_index < self.size {
248 self.index = nth_index;
249 let result = self.list.index_move(self.index);
250 self.index += 1;
251 Some(result)
252 } else {
253 self.index = self.size;
254 None
255 }
256 }
257}
258
259impl<U, T: IndexMove<u16, U>> ::core::iter::ExactSizeIterator for ShortListIter<T, U> {
260 fn len(&self) -> usize {
261 self.size as usize - self.index as usize
262 }
263}
264
265impl<U, T: IndexMove<u16, U>> ::core::iter::DoubleEndedIterator for ShortListIter<T, U> {
266 fn next_back(&mut self) -> ::core::option::Option<U> {
267 if self.size > self.index {
268 self.size -= 1;
269 Some(self.list.index_move(self.size))
270 } else {
271 None
272 }
273 }
274}