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 IntoInternalListReader<'a> {
41 fn into_internal_list_reader(self) -> ListReader<'a>;
42}
43
44pub trait FromPointerReader<'a>: Sized {
45 fn get_from_pointer(
46 reader: &PointerReader<'a>,
47 default: Option<&'a [crate::Word]>,
48 ) -> Result<Self>;
49}
50
51pub trait Owned: crate::introspect::Introspect {
62 type Reader<'a>: FromPointerReader<'a> + SetterInput<Self>;
63 type Builder<'a>: FromPointerBuilder<'a>;
64}
65
66pub trait OwnedStruct: crate::introspect::Introspect {
67 type Reader<'a>: From<StructReader<'a>> + SetterInput<Self> + IntoInternalStructReader<'a>;
68 type Builder<'a>: From<StructBuilder<'a>> + HasStructSize;
69}
70
71pub trait Pipelined {
72 type Pipeline;
73}
74
75pub trait FromPointerBuilder<'a>: Sized {
76 fn init_pointer(builder: PointerBuilder<'a>, length: u32) -> Self;
77 fn get_from_pointer(
78 builder: PointerBuilder<'a>,
79 default: Option<&'a [crate::Word]>,
80 ) -> Result<Self>;
81}
82
83pub trait SetterInput<Receiver: ?Sized> {
89 fn set_pointer_builder(
94 builder: PointerBuilder<'_>,
95 input: Self,
96 canonicalize: bool,
97 ) -> Result<()>;
98}
99
100pub trait Imbue<'a> {
106 fn imbue(&mut self, caps: &'a CapTable);
107}
108
109pub trait ImbueMut<'a> {
111 fn imbue_mut(&mut self, caps: &'a mut CapTable);
112}
113
114pub trait HasTypeId {
117 const TYPE_ID: u64;
118}
119
120pub trait IndexMove<I, T> {
121 fn index_move(&self, index: I) -> T;
122}
123
124pub struct ListIter<T, U> {
125 marker: PhantomData<U>,
126 list: T,
127 index: u32,
128 size: u32,
129}
130
131impl<T, U> ListIter<T, U> {
132 pub fn new(list: T, size: u32) -> Self {
133 Self {
134 list,
135 index: 0,
136 size,
137 marker: PhantomData,
138 }
139 }
140}
141
142impl<U, T: IndexMove<u32, U>> ::core::iter::Iterator for ListIter<T, U> {
143 type Item = U;
144 fn next(&mut self) -> ::core::option::Option<U> {
145 if self.index < self.size {
146 let result = self.list.index_move(self.index);
147 self.index += 1;
148 Some(result)
149 } else {
150 None
151 }
152 }
153
154 fn size_hint(&self) -> (usize, Option<usize>) {
155 (self.size as usize, Some(self.size as usize))
156 }
157
158 fn nth(&mut self, p: usize) -> Option<U> {
159 if self.index + (p as u32) < self.size {
160 self.index += p as u32;
161 let result = self.list.index_move(self.index);
162 self.index += 1;
163 Some(result)
164 } else {
165 self.index = self.size;
166 None
167 }
168 }
169}
170
171impl<U, T: IndexMove<u32, U>> ::core::iter::ExactSizeIterator for ListIter<T, U> {
172 fn len(&self) -> usize {
173 self.size as usize - self.index as usize
174 }
175}
176
177impl<U, T: IndexMove<u32, U>> ::core::iter::DoubleEndedIterator for ListIter<T, U> {
178 fn next_back(&mut self) -> ::core::option::Option<U> {
179 if self.size > self.index {
180 self.size -= 1;
181 Some(self.list.index_move(self.size))
182 } else {
183 None
184 }
185 }
186}
187
188pub struct ShortListIter<T, U> {
190 marker: PhantomData<U>,
191 list: T,
192 index: u16,
193 size: u16,
194}
195
196impl<T, U> ShortListIter<T, U> {
197 pub fn new(list: T, size: u16) -> Self {
198 Self {
199 list,
200 index: 0,
201 size,
202 marker: PhantomData,
203 }
204 }
205}
206
207impl<U, T: IndexMove<u16, U>> ::core::iter::Iterator for ShortListIter<T, U> {
208 type Item = U;
209 fn next(&mut self) -> ::core::option::Option<U> {
210 if self.index < self.size {
211 let result = self.list.index_move(self.index);
212 self.index += 1;
213 Some(result)
214 } else {
215 None
216 }
217 }
218
219 fn size_hint(&self) -> (usize, Option<usize>) {
220 (self.size as usize, Some(self.size as usize))
221 }
222
223 fn nth(&mut self, p: usize) -> Option<U> {
224 if self.index + (p as u16) < self.size {
225 self.index += p as u16;
226 let result = self.list.index_move(self.index);
227 self.index += 1;
228 Some(result)
229 } else {
230 self.index = self.size;
231 None
232 }
233 }
234}
235
236impl<U, T: IndexMove<u16, U>> ::core::iter::ExactSizeIterator for ShortListIter<T, U> {
237 fn len(&self) -> usize {
238 self.size as usize - self.index as usize
239 }
240}
241
242impl<U, T: IndexMove<u16, U>> ::core::iter::DoubleEndedIterator for ShortListIter<T, U> {
243 fn next_back(&mut self) -> ::core::option::Option<U> {
244 if self.size > self.index {
245 self.size -= 1;
246 Some(self.list.index_move(self.size))
247 } else {
248 None
249 }
250 }
251}