1use crate::{
7 alloc::Allocator,
8 fmt,
9 fs::file,
10 prelude::*,
11 sync::{
12 atomic::{
13 Atomic,
14 AtomicBasicOps,
15 AtomicType,
16 Relaxed, },
18 Arc,
19 Mutex, },
21 uaccess::{
22 UserSliceReader,
23 UserSliceWriter, },
25};
26
27use core::{
28 ops::{
29 Deref,
30 DerefMut, },
32 str::FromStr,
33};
34
35use zerocopy::Immutable;
36
37pub trait Writer {
47 fn write(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
49}
50
51impl<T: Writer> Writer for Mutex<T> {
52 fn write(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53 self.lock().write(f)
54 }
55}
56
57impl<T: fmt::Debug> Writer for T {
58 fn write(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 writeln!(f, "{self:?}")
60 }
61}
62
63pub trait BinaryWriter {
65 fn write_to_slice(
71 &self,
72 writer: &mut UserSliceWriter,
73 offset: &mut file::Offset,
74 ) -> Result<usize>;
75}
76
77impl<T: Immutable + IntoBytes> BinaryWriter for T {
79 fn write_to_slice(
80 &self,
81 writer: &mut UserSliceWriter,
82 offset: &mut file::Offset,
83 ) -> Result<usize> {
84 writer.write_slice_file(self.as_bytes(), offset)
85 }
86}
87
88impl<T: BinaryWriter> BinaryWriter for Mutex<T> {
90 fn write_to_slice(
91 &self,
92 writer: &mut UserSliceWriter,
93 offset: &mut file::Offset,
94 ) -> Result<usize> {
95 let guard = self.lock();
96
97 guard.write_to_slice(writer, offset)
98 }
99}
100
101impl<T, A> BinaryWriter for Box<T, A>
103where
104 T: BinaryWriter,
105 A: Allocator,
106{
107 fn write_to_slice(
108 &self,
109 writer: &mut UserSliceWriter,
110 offset: &mut file::Offset,
111 ) -> Result<usize> {
112 self.deref().write_to_slice(writer, offset)
113 }
114}
115
116impl<T, A> BinaryWriter for Pin<Box<T, A>>
118where
119 T: BinaryWriter,
120 A: Allocator,
121{
122 fn write_to_slice(
123 &self,
124 writer: &mut UserSliceWriter,
125 offset: &mut file::Offset,
126 ) -> Result<usize> {
127 self.deref().write_to_slice(writer, offset)
128 }
129}
130
131impl<T> BinaryWriter for Arc<T>
133where
134 T: BinaryWriter,
135{
136 fn write_to_slice(
137 &self,
138 writer: &mut UserSliceWriter,
139 offset: &mut file::Offset,
140 ) -> Result<usize> {
141 self.deref().write_to_slice(writer, offset)
142 }
143}
144
145impl<T, A> BinaryWriter for Vec<T, A>
147where
148 T: Immutable + IntoBytes,
149 A: Allocator,
150{
151 fn write_to_slice(
152 &self,
153 writer: &mut UserSliceWriter,
154 offset: &mut file::Offset,
155 ) -> Result<usize> {
156 writer.write_slice_file(self.as_bytes(), offset)
157 }
158}
159
160pub trait Reader {
167 fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result;
169}
170
171impl<T: FromStr + Unpin> Reader for Mutex<T> {
172 fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
173 let mut buf = [0u8; 128];
174 if reader.len() > buf.len() {
175 return Err(EINVAL);
176 }
177 let n = reader.len();
178 reader.read_slice(&mut buf[..n])?;
179
180 let s = core::str::from_utf8(&buf[..n]).map_err(|_| EINVAL)?;
181 let val = s.trim().parse::<T>().map_err(|_| EINVAL)?;
182 *self.lock() = val;
183 Ok(())
184 }
185}
186
187impl<T: AtomicType + FromStr> Reader for Atomic<T>
188where
189 T::Repr: AtomicBasicOps,
190{
191 fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
192 let mut buf = [0u8; 21]; if reader.len() > buf.len() {
194 return Err(EINVAL);
195 }
196 let n = reader.len();
197 reader.read_slice(&mut buf[..n])?;
198
199 let s = core::str::from_utf8(&buf[..n]).map_err(|_| EINVAL)?;
200 let val = s.trim().parse::<T>().map_err(|_| EINVAL)?;
201 self.store(val, Relaxed);
202 Ok(())
203 }
204}
205
206pub trait BinaryReaderMut {
210 fn read_from_slice_mut(
218 &mut self,
219 reader: &mut UserSliceReader,
220 offset: &mut file::Offset,
221 ) -> Result<usize>;
222}
223
224impl<T: FromBytes + IntoBytes> BinaryReaderMut for T {
226 fn read_from_slice_mut(
227 &mut self,
228 reader: &mut UserSliceReader,
229 offset: &mut file::Offset,
230 ) -> Result<usize> {
231 reader.read_slice_file(self.as_mut_bytes(), offset)
232 }
233}
234
235impl<T: ?Sized + BinaryReaderMut, A: Allocator> BinaryReaderMut for Box<T, A> {
237 fn read_from_slice_mut(
238 &mut self,
239 reader: &mut UserSliceReader,
240 offset: &mut file::Offset,
241 ) -> Result<usize> {
242 self.deref_mut().read_from_slice_mut(reader, offset)
243 }
244}
245
246impl<T, A> BinaryReaderMut for Vec<T, A>
248where
249 T: FromBytes + IntoBytes,
250 A: Allocator,
251{
252 fn read_from_slice_mut(
253 &mut self,
254 reader: &mut UserSliceReader,
255 offset: &mut file::Offset,
256 ) -> Result<usize> {
257 reader.read_slice_file(self.as_mut_bytes(), offset)
258 }
259}
260
261pub trait BinaryReader {
265 fn read_from_slice(
271 &self,
272 reader: &mut UserSliceReader,
273 offset: &mut file::Offset,
274 ) -> Result<usize>;
275}
276
277impl<T: BinaryReaderMut + Unpin> BinaryReader for Mutex<T> {
279 fn read_from_slice(
280 &self,
281 reader: &mut UserSliceReader,
282 offset: &mut file::Offset,
283 ) -> Result<usize> {
284 let mut this = self.lock();
285
286 this.read_from_slice_mut(reader, offset)
287 }
288}
289
290impl<T: ?Sized + BinaryReader, A: Allocator> BinaryReader for Box<T, A> {
292 fn read_from_slice(
293 &self,
294 reader: &mut UserSliceReader,
295 offset: &mut file::Offset,
296 ) -> Result<usize> {
297 self.deref().read_from_slice(reader, offset)
298 }
299}
300
301impl<T: ?Sized + BinaryReader, A: Allocator> BinaryReader for Pin<Box<T, A>> {
303 fn read_from_slice(
304 &self,
305 reader: &mut UserSliceReader,
306 offset: &mut file::Offset,
307 ) -> Result<usize> {
308 self.deref().read_from_slice(reader, offset)
309 }
310}
311
312impl<T: ?Sized + BinaryReader> BinaryReader for Arc<T> {
314 fn read_from_slice(
315 &self,
316 reader: &mut UserSliceReader,
317 offset: &mut file::Offset,
318 ) -> Result<usize> {
319 self.deref().read_from_slice(reader, offset)
320 }
321}