1use crate::stable_with_metadata_of::WithMetadataOf;
2
3use std::{
4 any::Any,
5 io::{BufRead, Read, Seek},
6};
7
8pub struct Reader<R> {
45 inner: R,
46 read: *mut dyn Read,
47 vtable: OptTable,
48}
49
50#[derive(Clone, Copy)]
51struct OptTable {
52 seek: Option<*mut dyn Seek>,
53 buf: Option<*mut dyn BufRead>,
54 any: Option<*mut dyn Any>,
55}
56
57pub struct ReaderMut<'lt> {
68 inner: &'lt mut dyn Read,
69 vtable: OptTable,
70}
71
72pub struct ReaderBox<'lt> {
74 inner: Box<dyn Read + 'lt>,
75 vtable: OptTable,
76}
77
78impl<R: Read> Reader<R> {
79 pub fn new(mut reader: R) -> Self {
81 let read = lifetime_erase_trait_vtable!((&mut reader): '_ as Read);
82
83 Reader {
84 inner: reader,
85 read,
86 vtable: OptTable {
87 seek: None,
88 buf: None,
89 any: None,
90 },
91 }
92 }
93}
94
95impl<R> Reader<R> {
96 pub fn get_ref(&self) -> &R {
98 &self.inner
99 }
100
101 pub fn get_mut(&mut self) -> &mut R {
103 &mut self.inner
104 }
105
106 pub fn as_mut(&mut self) -> ReaderMut<'_> {
112 let Reader {
115 inner: _,
116 read: _,
117 vtable,
118 } = *self;
119
120 ReaderMut {
121 inner: self.as_read_mut(),
122 vtable,
123 }
124 }
125
126 pub fn into_boxed<'lt>(self) -> ReaderBox<'lt>
132 where
133 R: 'lt,
134 {
135 let Reader {
136 inner,
137 read,
138 vtable,
139 } = self;
140
141 let ptr = Box::into_raw(Box::new(inner));
142 let ptr = WithMetadataOf::with_metadata_of_on_stable(ptr, read);
143 let inner = unsafe { Box::from_raw(ptr) };
144
145 ReaderBox { inner, vtable }
146 }
147
148 pub fn set_buf(&mut self)
152 where
153 R: BufRead,
154 {
155 self.vtable.buf = Some(lifetime_erase_trait_vtable!((&mut self.inner): '_ as BufRead));
156 }
157
158 pub fn set_seek(&mut self)
162 where
163 R: Seek,
164 {
165 self.vtable.seek = Some(lifetime_erase_trait_vtable!((&mut self.inner): '_ as Seek));
166 }
167
168 pub fn set_any(&mut self)
172 where
173 R: Any,
174 {
175 self.vtable.any = Some(lifetime_erase_trait_vtable!((&mut self.inner): '_ as Any));
176 }
177}
178
179impl<R> Reader<R> {
180 pub fn as_read(&self) -> &(dyn Read + '_) {
182 let ptr = &self.inner as *const R;
183 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.read);
184 unsafe { &*local }
185 }
186
187 pub fn as_read_mut(&mut self) -> &mut (dyn Read + '_) {
189 let ptr = &mut self.inner as *mut R;
190 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.read);
191 unsafe { &mut *local }
192 }
193
194 pub fn as_buf(&self) -> Option<&(dyn BufRead + '_)> {
199 let ptr = &self.inner as *const R;
200 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.buf?);
201 Some(unsafe { &*local })
202 }
203
204 pub fn as_buf_mut(&mut self) -> Option<&mut (dyn BufRead + '_)> {
209 let ptr = &mut self.inner as *mut R;
210 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.buf?);
211 Some(unsafe { &mut *local })
212 }
213
214 pub fn as_seek(&self) -> Option<&(dyn Seek + '_)> {
219 let ptr = &self.inner as *const R;
220 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.seek?);
221 Some(unsafe { &*local })
222 }
223
224 pub fn as_seek_mut(&mut self) -> Option<&mut (dyn Seek + '_)> {
229 let ptr = &mut self.inner as *mut R;
230 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.seek?);
231 Some(unsafe { &mut *local })
232 }
233
234 pub fn as_any(&self) -> Option<&'_ dyn Any> {
236 let ptr = &self.inner as *const R;
237 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.any?);
238 Some(unsafe { &*local })
239 }
240
241 pub fn as_any_mut(&mut self) -> Option<&'_ mut dyn Any> {
243 let ptr = &mut self.inner as *mut R;
244 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.any?);
245 Some(unsafe { &mut *local })
246 }
247
248 pub fn into_inner(self) -> R {
250 self.inner
251 }
252}
253
254impl ReaderMut<'_> {
255 pub fn as_read_mut(&mut self) -> &mut (dyn Read + '_) {
256 &mut *self.inner
257 }
258
259 pub fn as_buf_mut(&mut self) -> Option<&mut (dyn BufRead + '_)> {
260 let ptr = self.inner as *mut dyn Read;
261 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.buf?);
262 Some(unsafe { &mut *local })
263 }
264
265 pub fn as_seek_mut(&mut self) -> Option<&mut (dyn Seek + '_)> {
266 let ptr = self.inner as *mut dyn Read;
267 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.seek?);
268 Some(unsafe { &mut *local })
269 }
270
271 pub fn as_any(&self) -> Option<&'_ dyn Any> {
273 let ptr = self.inner as *const dyn Read;
274 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.any?);
275 Some(unsafe { &*local })
276 }
277
278 pub fn as_any_mut(&mut self) -> Option<&'_ mut dyn Any> {
280 let ptr = self.inner as *mut dyn Read;
281 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.any?);
282 Some(unsafe { &mut *local })
283 }
284}
285
286impl ReaderBox<'_> {
287 pub fn as_mut(&mut self) -> ReaderMut<'_> {
288 ReaderMut {
289 vtable: self.vtable,
290 inner: self.as_read_mut(),
291 }
292 }
293
294 pub fn as_read_mut(&mut self) -> &mut (dyn Read + '_) {
295 &mut *self.inner
296 }
297
298 pub fn as_buf_mut(&mut self) -> Option<&mut (dyn BufRead + '_)> {
299 let ptr = self.inner.as_mut() as *mut _;
300 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.buf?);
301 Some(unsafe { &mut *local })
302 }
303
304 pub fn as_seek_mut(&mut self) -> Option<&mut (dyn Seek + '_)> {
305 let ptr = self.inner.as_mut() as *mut _;
306 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.seek?);
307 Some(unsafe { &mut *local })
308 }
309
310 pub fn as_any(&self) -> Option<&'_ dyn Any> {
312 let ptr = self.inner.as_ref() as *const _;
313 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.any?);
314 Some(unsafe { &*local })
315 }
316
317 pub fn as_any_mut(&mut self) -> Option<&'_ mut dyn Any> {
319 let ptr = self.inner.as_mut() as *mut _;
320 let local = WithMetadataOf::with_metadata_of_on_stable(ptr, self.vtable.any?);
321 Some(unsafe { &mut *local })
322 }
323}
324
325impl<'lt, R> From<&'lt mut Reader<R>> for ReaderMut<'lt> {
326 fn from(value: &'lt mut Reader<R>) -> Self {
327 value.as_mut()
328 }
329}
330
331impl<'lt, R: 'lt> From<Reader<R>> for ReaderBox<'lt> {
332 fn from(value: Reader<R>) -> Self {
333 value.into_boxed()
334 }
335}
336
337impl<'lt> From<&'lt mut ReaderBox<'_>> for ReaderMut<'lt> {
338 fn from(value: &'lt mut ReaderBox<'_>) -> Self {
339 value.as_mut()
340 }
341}