rw_utils/
num_write.rs

1use std::io;
2use std::io::Write;
3use std::mem::size_of;
4
5///
6/// Trait that provides various methods to write numbers.
7/// Automatically implemented for all implementations of io::Write.
8///
9pub trait NumWrite : private::Sealed {
10
11    ///
12    /// Writes one byte and treats 0 as false and any other value as true.
13    ///
14    fn write_bool(&mut self, value: bool) -> io::Result<()>;
15
16    ///
17    /// Writes 1 byte and treats it as an u8
18    ///
19    fn write_u8(&mut self, value: u8) -> io::Result<()>;
20
21    ///
22    /// Writes 2 bytes and treats them as an u16 in little endian byte order
23    ///
24    fn write_u16_le(&mut self, value: u16) -> io::Result<()>;
25
26    ///
27    /// Writes 2 bytes and treats them as an u16 in big endian byte order
28    ///
29    fn write_u16_be(&mut self, value: u16) -> io::Result<()>;
30
31    ///
32    /// Writes 2 bytes and treats them as an u16 in native byte order
33    ///
34    fn write_u16_ne(&mut self, value: u16) -> io::Result<()>;
35
36    ///
37    /// Writes 4 bytes and treats them as an u32 in little endian byte order
38    ///
39    fn write_u32_le(&mut self, value: u32) -> io::Result<()>;
40
41    ///
42    /// Writes 4 bytes and treats them as an u32 in big endian byte order
43    ///
44    fn write_u32_be(&mut self, value: u32) -> io::Result<()>;
45
46    ///
47    /// Writes 4 bytes and treats them as an u32 in native byte order
48    ///
49    fn write_u32_ne(&mut self, value: u32) -> io::Result<()>;
50
51    ///
52    /// Writes 8 bytes and treats them as an u64 in little endian byte order
53    ///
54    fn write_u64_le(&mut self, value: u64) -> io::Result<()>;
55
56    ///
57    /// Writes 8 bytes and treats them as an u64 in big endian byte order
58    ///
59    fn write_u64_be(&mut self, value: u64) -> io::Result<()>;
60
61    ///
62    /// Writes 8 bytes and treats them as an u64 in native byte order
63    ///
64    fn write_u64_ne(&mut self, value: u64) -> io::Result<()>;
65
66    ///
67    /// Writes 16 bytes and treats them as an u128 in little endian byte order
68    ///
69    fn write_u128_le(&mut self, value: u128) -> io::Result<()>;
70
71    ///
72    /// Writes 16 bytes and treats them as an u128 in big endian byte order
73    ///
74    fn write_u128_be(&mut self, value: u128) -> io::Result<()>;
75
76    ///
77    /// Writes 16 bytes and treats them as an u128 in native byte order
78    ///
79    fn write_u128_ne(&mut self, value: u128) -> io::Result<()>;
80
81    ///
82    /// Writes 1 byte and treats it as an i8
83    ///
84    fn write_i8(&mut self, value: i8) -> io::Result<()>;
85
86    ///
87    /// Writes 2 bytes and treats them as an i16 in little endian byte order
88    ///
89    fn write_i16_le(&mut self, value: i16) -> io::Result<()>;
90
91    ///
92    /// Writes 2 bytes and treats them as an i16 in big endian byte order
93    ///
94    fn write_i16_be(&mut self, value: i16) -> io::Result<()>;
95
96    ///
97    /// Writes 2 bytes and treats them as an u16 in native byte order
98    ///
99    fn write_i16_ne(&mut self, value: i16) -> io::Result<()>;
100
101    ///
102    /// Writes 4 bytes and treats them as an i32 in little endian byte order
103    ///
104    fn write_i32_le(&mut self, value: i32) -> io::Result<()>;
105
106    ///
107    /// Writes 4 bytes and treats them as an i32 in big endian byte order
108    ///
109    fn write_i32_be(&mut self, value: i32) -> io::Result<()>;
110
111    ///
112    /// Writes 4 bytes and treats them as an i32 in native byte order
113    ///
114    fn write_i32_ne(&mut self, value: i32) -> io::Result<()>;
115
116    ///
117    /// Writes 8 bytes and treats them as an i64 in little endian byte order
118    ///
119    fn write_i64_le(&mut self, value: i64) -> io::Result<()>;
120
121    ///
122    /// Writes 8 bytes and treats them as an i64 in big endian byte order
123    ///
124    fn write_i64_be(&mut self, value: i64) -> io::Result<()>;
125
126    ///
127    /// Writes 8 bytes and treats them as an u64 in native byte order
128    ///
129    fn write_i64_ne(&mut self, value: i64) -> io::Result<()>;
130
131    ///
132    /// Writes 16 bytes and treats them as an u128 in little endian byte order
133    ///
134    fn write_i128_le(&mut self, value: i128) -> io::Result<()>;
135
136    ///
137    /// Writes 16 bytes and treats them as an u128 in big endian byte order
138    ///
139    fn write_i128_be(&mut self, value: i128) -> io::Result<()>;
140
141    ///
142    /// Writes 16 bytes and treats them as an u128 in native byte order
143    ///
144    fn write_i128_ne(&mut self, value: i128) -> io::Result<()>;
145
146    ///
147    /// Writes 4 bytes and treats them as an f32 in little endian byte order
148    ///
149    fn write_f32_le(&mut self, value: f32) -> io::Result<()>;
150
151    ///
152    /// Writes 4 bytes and treats them as an f32 in big endian byte order
153    ///
154    fn write_f32_be(&mut self, value: f32) -> io::Result<()>;
155
156    ///
157    /// Writes 4 bytes and treats them as an f32 in native byte order
158    ///
159    fn write_f32_ne(&mut self, value: f32) -> io::Result<()>;
160
161    ///
162    /// Writes 8 bytes and treats them as an f64 in little endian byte order
163    ///
164    fn write_f64_le(&mut self, value: f64) -> io::Result<()>;
165
166    ///
167    /// Writes 8 bytes and treats them as an f64 in big endian byte order
168    ///
169    fn write_f64_be(&mut self, value: f64) -> io::Result<()>;
170
171    ///
172    /// Writes 8 bytes and treats them as an f64 in native byte order
173    ///
174    fn write_f64_ne(&mut self, value: f64) -> io::Result<()>;
175
176    ///
177    /// Writes the entire slice.
178    ///
179    fn write_u8_slice(&mut self, slice: &[u8]) -> io::Result<()>;
180
181    ///
182    /// Writes the entire slice.
183    ///
184    fn write_i8_slice(&mut self, slice: &[i8]) -> io::Result<()>;
185
186    ///
187    /// Writes the entire slice. Each element is encoded in little endian.
188    ///
189    fn write_u16_slice_le(&mut self, slice: &[u16]) -> io::Result<()>;
190
191    ///
192    /// Writes the entire slice. Each element is encoded in big endian.
193    ///
194    fn write_u16_slice_be(&mut self, slice: &[u16]) -> io::Result<()>;
195
196    ///
197    /// Writes the entire slice. Each element is encoded in native endian.
198    ///
199    fn write_u16_slice_ne(&mut self, slice: &[u16]) -> io::Result<()>;
200
201    ///
202    /// Writes the entire slice. Each element is encoded in little endian.
203    ///
204    fn write_u32_slice_le(&mut self, slice: &[u32]) -> io::Result<()>;
205
206    ///
207    /// Writes the entire slice. Each element is encoded in big endian.
208    ///
209    fn write_u32_slice_be(&mut self, slice: &[u32]) -> io::Result<()>;
210    ///
211    /// Writes the entire slice. Each element is encoded in native endian.
212    ///
213    fn write_u32_slice_ne(&mut self, slice: &[u32]) -> io::Result<()>;
214
215    ///
216    /// Writes the entire slice. Each element is encoded in little endian.
217    ///
218    fn write_u64_slice_le(&mut self, slice: &[u64]) -> io::Result<()>;
219    ///
220    /// Writes the entire slice. Each element is encoded in big endian.
221    ///
222    fn write_u64_slice_be(&mut self, slice: &[u64]) -> io::Result<()>;
223    ///
224    /// Writes the entire slice. Each element is encoded in native endian.
225    ///
226    fn write_u64_slice_ne(&mut self, slice: &[u64]) -> io::Result<()>;
227
228    ///
229    /// Writes the entire slice. Each element is encoded in little endian.
230    ///
231    fn write_u128_slice_le(&mut self, slice: &[u128]) -> io::Result<()>;
232    ///
233    /// Writes the entire slice. Each element is encoded in big endian.
234    ///
235    fn write_u128_slice_be(&mut self, slice: &[u128]) -> io::Result<()>;
236    ///
237    /// Writes the entire slice. Each element is encoded in native endian.
238    ///
239    fn write_u128_slice_ne(&mut self, slice: &[u128]) -> io::Result<()>;
240
241    ///
242    /// Writes the entire slice. Each element is encoded in little endian.
243    ///
244    fn write_i16_slice_le(&mut self, slice: &[i16]) -> io::Result<()>;
245    ///
246    /// Writes the entire slice. Each element is encoded in big endian.
247    ///
248    fn write_i16_slice_be(&mut self, slice: &[i16]) -> io::Result<()>;
249    ///
250    /// Writes the entire slice. Each element is encoded in native endian.
251    ///
252    fn write_i16_slice_ne(&mut self, slice: &[i16]) -> io::Result<()>;
253
254    ///
255    /// Writes the entire slice. Each element is encoded in little endian.
256    ///
257    fn write_i32_slice_le(&mut self, slice: &[i32]) -> io::Result<()>;
258    ///
259    /// Writes the entire slice. Each element is encoded in big endian.
260    ///
261    fn write_i32_slice_be(&mut self, slice: &[i32]) -> io::Result<()>;
262    ///
263    /// Writes the entire slice. Each element is encoded in native endian.
264    ///
265    fn write_i32_slice_ne(&mut self, slice: &[i32]) -> io::Result<()>;
266
267    ///
268    /// Writes the entire slice. Each element is encoded in little endian.
269    ///
270    fn write_i64_slice_le(&mut self, slice: &[i64]) -> io::Result<()>;
271    ///
272    /// Writes the entire slice. Each element is encoded in big endian.
273    ///
274    fn write_i64_slice_be(&mut self, slice: &[i64]) -> io::Result<()>;
275    ///
276    /// Writes the entire slice. Each element is encoded in native endian.
277    ///
278    fn write_i64_slice_ne(&mut self, slice: &[i64]) -> io::Result<()>;
279
280    ///
281    /// Writes the entire slice. Each element is encoded in little endian.
282    ///
283    fn write_i128_slice_le(&mut self, slice: &[i128]) -> io::Result<()>;
284    ///
285    /// Writes the entire slice. Each element is encoded in big endian.
286    ///
287    fn write_i128_slice_be(&mut self, slice: &[i128]) -> io::Result<()>;
288    ///
289    /// Writes the entire slice. Each element is encoded in native endian.
290    ///
291    fn write_i128_slice_ne(&mut self, slice: &[i128]) -> io::Result<()>;
292
293    ///
294    /// Writes the entire slice. Each element is encoded in little endian.
295    ///
296    fn write_f64_slice_le(&mut self, slice: &[f64]) -> io::Result<()>;
297    ///
298    /// Writes the entire slice. Each element is encoded in big endian.
299    ///
300    fn write_f64_slice_be(&mut self, slice: &[f64]) -> io::Result<()>;
301    ///
302    /// Writes the entire slice. Each element is encoded in native endian.
303    ///
304    fn write_f64_slice_ne(&mut self, slice: &[f64]) -> io::Result<()>;
305
306    ///
307    /// Writes the entire slice. Each element is encoded in little endian.
308    ///
309    fn write_f32_slice_le(&mut self, slice: &[f32]) -> io::Result<()>;
310    ///
311    /// Writes the entire slice. Each element is encoded in big endian.
312    ///
313    fn write_f32_slice_be(&mut self, slice: &[f32]) -> io::Result<()>;
314    ///
315    /// Writes the entire slice. Each element is encoded in native endian.
316    ///
317    fn write_f32_slice_ne(&mut self, slice: &[f32]) -> io::Result<()>;
318
319    ///
320    /// Writes the entire vec.
321    ///
322    fn write_u8_vec(&mut self, slice: &Vec<u8>) -> io::Result<()>;
323
324    ///
325    /// Writes the entire vec.
326    ///
327    fn write_i8_vec(&mut self, slice: &Vec<i8>) -> io::Result<()>;
328
329    ///
330    /// Writes the entire vec. Each element is encoded in little endian.
331    ///
332    fn write_u16_vec_le(&mut self, slice: &Vec<u16>) -> io::Result<()>;
333
334    ///
335    /// Writes the entire vec. Each element is encoded in big endian.
336    ///
337    fn write_u16_vec_be(&mut self, slice: &Vec<u16>) -> io::Result<()>;
338
339    ///
340    /// Writes the entire vec. Each element is encoded in native endian.
341    ///
342    fn write_u16_vec_ne(&mut self, slice: &Vec<u16>) -> io::Result<()>;
343    ///
344    /// Writes the entire vec. Each element is encoded in little endian.
345    ///
346    fn write_u32_vec_le(&mut self, slice: &Vec<u32>) -> io::Result<()>;
347
348    ///
349    /// Writes the entire vec. Each element is encoded in big endian.
350    ///
351    fn write_u32_vec_be(&mut self, slice: &Vec<u32>) -> io::Result<()>;
352
353    ///
354    /// Writes the entire vec. Each element is encoded in native endian.
355    ///
356    fn write_u32_vec_ne(&mut self, slice: &Vec<u32>) -> io::Result<()>;
357    ///
358    /// Writes the entire vec. Each element is encoded in little endian.
359    ///
360    fn write_u64_vec_le(&mut self, slice: &Vec<u64>) -> io::Result<()>;
361
362    ///
363    /// Writes the entire vec. Each element is encoded in big endian.
364    ///
365    fn write_u64_vec_be(&mut self, slice: &Vec<u64>) -> io::Result<()>;
366
367    ///
368    /// Writes the entire vec. Each element is encoded in native endian.
369    ///
370    fn write_u64_vec_ne(&mut self, slice: &Vec<u64>) -> io::Result<()>;
371    ///
372    /// Writes the entire vec. Each element is encoded in little endian.
373    ///
374    fn write_u128_vec_le(&mut self, slice: &Vec<u128>) -> io::Result<()>;
375
376    ///
377    /// Writes the entire vec. Each element is encoded in big endian.
378    ///
379    fn write_u128_vec_be(&mut self, slice: &Vec<u128>) -> io::Result<()>;
380
381    ///
382    /// Writes the entire vec. Each element is encoded in native endian.
383    ///
384    fn write_u128_vec_ne(&mut self, slice: &Vec<u128>) -> io::Result<()>;
385
386    ///
387    /// Writes the entire vec. Each element is encoded in little endian.
388    ///
389    fn write_i16_vec_le(&mut self, slice: &Vec<i16>) -> io::Result<()>;
390
391    ///
392    /// Writes the entire vec. Each element is encoded in big endian.
393    ///
394    fn write_i16_vec_be(&mut self, slice: &Vec<i16>) -> io::Result<()>;
395
396    ///
397    /// Writes the entire vec. Each element is encoded in native endian.
398    ///
399    fn write_i16_vec_ne(&mut self, slice: &Vec<i16>) -> io::Result<()>;
400
401    ///
402    /// Writes the entire vec. Each element is encoded in little endian.
403    ///
404    fn write_i32_vec_le(&mut self, slice: &Vec<i32>) -> io::Result<()>;
405
406    ///
407    /// Writes the entire vec. Each element is encoded in big endian.
408    ///
409    fn write_i32_vec_be(&mut self, slice: &Vec<i32>) -> io::Result<()>;
410
411    ///
412    /// Writes the entire vec. Each element is encoded in native endian.
413    ///
414    fn write_i32_vec_ne(&mut self, slice: &Vec<i32>) -> io::Result<()>;
415
416    ///
417    /// Writes the entire vec. Each element is encoded in little endian.
418    ///
419    fn write_i64_vec_le(&mut self, slice: &Vec<i64>) -> io::Result<()>;
420
421    ///
422    /// Writes the entire vec. Each element is encoded in big endian.
423    ///
424    fn write_i64_vec_be(&mut self, slice: &Vec<i64>) -> io::Result<()>;
425
426    ///
427    /// Writes the entire vec. Each element is encoded in native endian.
428    ///
429    fn write_i64_vec_ne(&mut self, slice: &Vec<i64>) -> io::Result<()>;
430
431    ///
432    /// Writes the entire vec. Each element is encoded in little endian.
433    ///
434    fn write_i128_vec_le(&mut self, slice: &Vec<i128>) -> io::Result<()>;
435
436    ///
437    /// Writes the entire vec. Each element is encoded in big endian.
438    ///
439    fn write_i128_vec_be(&mut self, slice: &Vec<i128>) -> io::Result<()>;
440
441    ///
442    /// Writes the entire vec. Each element is encoded in native endian.
443    ///
444    fn write_i128_vec_ne(&mut self, slice: &Vec<i128>) -> io::Result<()>;
445
446    ///
447    /// Writes the entire vec. Each element is encoded in little endian.
448    ///
449    fn write_f64_vec_le(&mut self, slice: &Vec<f64>) -> io::Result<()>;
450
451    ///
452    /// Writes the entire vec. Each element is encoded in big endian.
453    ///
454    fn write_f64_vec_be(&mut self, slice: &Vec<f64>) -> io::Result<()>;
455
456    ///
457    /// Writes the entire vec. Each element is encoded in native endian.
458    ///
459    fn write_f64_vec_ne(&mut self, slice: &Vec<f64>) -> io::Result<()>;
460
461    ///
462    /// Writes the entire vec. Each element is encoded in little endian.
463    ///
464    fn write_f32_vec_le(&mut self, slice: &Vec<f32>) -> io::Result<()>;
465
466    ///
467    /// Writes the entire vec. Each element is encoded in big endian.
468    ///
469    fn write_f32_vec_be(&mut self, slice: &Vec<f32>) -> io::Result<()>;
470
471    ///
472    /// Writes the entire vec. Each element is encoded in native endian.
473    ///
474    fn write_f32_vec_ne(&mut self, slice: &Vec<f32>) -> io::Result<()>;
475}
476
477macro_rules! define_endian_numeric_write_functions {
478    ($type:ty, $le_name:ident, $be_name:ident, $ne_name:ident) => {
479        #[cfg(target_endian = "big")]
480        fn $le_name(&mut self, value: $type) -> io::Result<()> {
481            self.write_all(value.to_le_bytes().as_slice())
482        }
483
484        #[cfg(target_endian = "little")]
485        fn $le_name(&mut self, value: $type) -> io::Result<()> {
486            return self.write_all(unsafe { std::slice::from_raw_parts::<u8>(((&value) as *const $type).cast(), size_of::<$type>()) });
487        }
488
489        #[cfg(target_endian = "big")]
490        fn $be_name(&mut self, value: $type) -> io::Result<()> {
491            return self.write_all(unsafe { std::slice::from_raw_parts::<u8>(((&value) as *const $type).cast(), size_of::<$type>()) });
492        }
493
494        #[cfg(target_endian = "little")]
495        fn $be_name(&mut self, value: $type) -> io::Result<()> {
496            self.write_all(value.to_be_bytes().as_slice())
497        }
498
499        fn $ne_name(&mut self, value: $type) -> io::Result<()> {
500            return self.write_all(unsafe { std::slice::from_raw_parts::<u8>(((&value) as *const $type).cast(), size_of::<$type>()) });
501        }
502    };
503}
504
505macro_rules! define_endian_slice_write_functions {
506    ($type:ty, $helper:ty, $le_name:ident, $be_name:ident, $ne_name:ident) => {
507        #[cfg(target_endian = "little")]
508        fn $le_name(&mut self, slice: &[$type]) -> io::Result<()> {
509            let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len() * size_of::<$type>()) };
510            self.write_all(sl)
511        }
512
513        #[cfg(target_endian = "big")]
514        fn $le_name(&mut self, slice: &[$type]) -> io::Result<()> {
515            let mut copy : Vec<$helper> = Vec::with_capacity(slice.len());
516            let helper :&[$helper] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len()) };
517            copy.copy_from_slice(helper);
518            for i in 0 .. copy.len() {
519                copy[i] = copy[i].to_le();
520            }
521            let sl :&[u8] = unsafe { std::slice::from_raw_parts(copy.as_ptr().cast(), copy.len() * size_of::<$type>()) };
522            self.write_all(sl)
523        }
524
525        #[cfg(target_endian = "little")]
526        fn $be_name(&mut self, slice: &[$type]) -> io::Result<()> {
527            let mut copy : Vec<$helper> = Vec::with_capacity(slice.len());
528            let helper :&[$helper] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len()) };
529            copy.copy_from_slice(helper);
530            for i in 0 .. copy.len() {
531                copy[i] = copy[i].to_be();
532            }
533            let sl :&[u8] = unsafe { std::slice::from_raw_parts(copy.as_ptr().cast(), copy.len() * size_of::<$type>()) };
534            self.write_all(sl)
535        }
536
537        #[cfg(target_endian = "big")]
538        fn $be_name(&mut self, slice: &[$type]) -> io::Result<()> {
539            let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len() * size_of::<$type>()) };
540            self.write_all(sl)
541        }
542
543        fn $ne_name(&mut self, slice: &[$type]) -> io::Result<()> {
544            let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len() * size_of::<$type>()) };
545            self.write_all(sl)
546        }
547    };
548}
549
550macro_rules! define_endian_vec_write_functions {
551    ($type:ty, $helper:ty, $le_name:ident, $be_name:ident, $ne_name:ident) => {
552        #[cfg(target_endian = "little")]
553        fn $le_name(&mut self, slice: &Vec<$type>) -> io::Result<()> {
554            let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len() * size_of::<$type>()) };
555            self.write_all(sl)
556        }
557
558        #[cfg(target_endian = "big")]
559        fn $le_name(&mut self, slice: &Vec<$type>) -> io::Result<()> {
560            let mut copy : Vec<$helper> = Vec::with_capacity(slice.len());
561            let helper :&[$helper] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len()) };
562            copy.copy_from_slice(helper);
563            for i in 0 .. copy.len() {
564                copy[i] = copy[i].to_le();
565            }
566            let sl :&[u8] = unsafe { std::slice::from_raw_parts(copy.as_ptr().cast(), copy.len() * size_of::<$type>()) };
567            self.write_all(sl)
568        }
569
570        #[cfg(target_endian = "little")]
571        fn $be_name(&mut self, slice: &Vec<$type>) -> io::Result<()> {
572            let mut copy : Vec<$helper> = Vec::with_capacity(slice.len());
573            let helper :&[$helper] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len()) };
574            copy.copy_from_slice(helper);
575            for i in 0 .. copy.len() {
576                copy[i] = copy[i].to_be();
577            }
578            let sl :&[u8] = unsafe { std::slice::from_raw_parts(copy.as_ptr().cast(), copy.len() * size_of::<$type>()) };
579            self.write_all(sl)
580        }
581
582        #[cfg(target_endian = "big")]
583        fn $be_name(&mut self, slice: &Vec<$type>) -> io::Result<()> {
584            let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len() * size_of::<$type>()) };
585            self.write_all(sl)
586        }
587
588        fn $ne_name(&mut self, slice: &Vec<$type>) -> io::Result<()> {
589            let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len() * size_of::<$type>()) };
590            self.write_all(sl)
591        }
592    };
593}
594
595impl<T> NumWrite for T where T: Write {
596    fn write_bool(&mut self, value: bool) -> io::Result<()> {
597        if value {
598            return self.write_all(&[1u8]);
599        } else {
600            return self.write_all(&[0u8]);
601        }
602    }
603
604    fn write_u8(&mut self, value: u8) -> io::Result<()> {
605        return self.write_all(&[value]);
606    }
607
608    fn write_i8(&mut self, value: i8) -> io::Result<()> {
609        return self.write_all(&[value as u8]);
610    }
611
612    define_endian_numeric_write_functions!(u16, write_u16_le, write_u16_be, write_u16_ne);
613    define_endian_numeric_write_functions!(u32, write_u32_le, write_u32_be, write_u32_ne);
614    define_endian_numeric_write_functions!(u64, write_u64_le, write_u64_be, write_u64_ne);
615    define_endian_numeric_write_functions!(u128, write_u128_le, write_u128_be, write_u128_ne);
616
617    define_endian_numeric_write_functions!(i16, write_i16_le, write_i16_be, write_i16_ne);
618    define_endian_numeric_write_functions!(i32, write_i32_le, write_i32_be, write_i32_ne);
619    define_endian_numeric_write_functions!(i64, write_i64_le, write_i64_be, write_i64_ne);
620    define_endian_numeric_write_functions!(i128, write_i128_le, write_i128_be, write_i128_ne);
621
622    define_endian_numeric_write_functions!(f32, write_f32_le, write_f32_be, write_f32_ne);
623    define_endian_numeric_write_functions!(f64, write_f64_le, write_f64_be, write_f64_ne);
624
625
626    define_endian_slice_write_functions!(u16, u16, write_u16_slice_le, write_u16_slice_be, write_u16_slice_ne);
627    define_endian_slice_write_functions!(u32, u32, write_u32_slice_le, write_u32_slice_be, write_u32_slice_ne);
628    define_endian_slice_write_functions!(u64, u64, write_u64_slice_le, write_u64_slice_be, write_u64_slice_ne);
629    define_endian_slice_write_functions!(u128, u128, write_u128_slice_le, write_u128_slice_be, write_u128_slice_ne);
630
631    define_endian_slice_write_functions!(i16, i16, write_i16_slice_le, write_i16_slice_be, write_i16_slice_ne);
632    define_endian_slice_write_functions!(i32, i32, write_i32_slice_le, write_i32_slice_be, write_i32_slice_ne);
633    define_endian_slice_write_functions!(i64, i64, write_i64_slice_le, write_i64_slice_be, write_i64_slice_ne);
634    define_endian_slice_write_functions!(i128, i128, write_i128_slice_le, write_i128_slice_be, write_i128_slice_ne);
635
636    define_endian_slice_write_functions!(f32, u32, write_f32_slice_le, write_f32_slice_be, write_f32_slice_ne);
637    define_endian_slice_write_functions!(f64, u64, write_f64_slice_le, write_f64_slice_be, write_f64_slice_ne);
638
639    define_endian_vec_write_functions!(u16, u16, write_u16_vec_le, write_u16_vec_be, write_u16_vec_ne);
640    define_endian_vec_write_functions!(u32, u32, write_u32_vec_le, write_u32_vec_be, write_u32_vec_ne);
641    define_endian_vec_write_functions!(u64, u64, write_u64_vec_le, write_u64_vec_be, write_u64_vec_ne);
642    define_endian_vec_write_functions!(u128, u128, write_u128_vec_le, write_u128_vec_be, write_u128_vec_ne);
643
644    define_endian_vec_write_functions!(i16, i16, write_i16_vec_le, write_i16_vec_be, write_i16_vec_ne);
645    define_endian_vec_write_functions!(i32, i32, write_i32_vec_le, write_i32_vec_be, write_i32_vec_ne);
646    define_endian_vec_write_functions!(i64, i64, write_i64_vec_le, write_i64_vec_be, write_i64_vec_ne);
647    define_endian_vec_write_functions!(i128, i128, write_i128_vec_le, write_i128_vec_be, write_i128_vec_ne);
648
649    define_endian_vec_write_functions!(f32, u32, write_f32_vec_le, write_f32_vec_be, write_f32_vec_ne);
650    define_endian_vec_write_functions!(f64, u64, write_f64_vec_le, write_f64_vec_be, write_f64_vec_ne);
651
652    fn write_u8_slice(&mut self, slice: &[u8]) -> io::Result<()> {
653        return self.write_all(slice);
654    }
655
656    fn write_i8_slice(&mut self, slice: &[i8]) -> io::Result<()> {
657        let sl :&[u8] = unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), slice.len()) };
658        return self.write_all(sl);
659    }
660
661    fn write_u8_vec(&mut self, value: &Vec<u8>) -> io::Result<()> {
662        return self.write_all(value.as_slice());
663    }
664
665    fn write_i8_vec(&mut self, slice: &Vec<i8>) -> io::Result<()> {
666        return self.write_i8_slice(slice.as_slice());
667    }
668}
669
670mod private {
671    use std::io::Write;
672
673    impl <T> Sealed for T where T: Write {}
674    pub trait Sealed {
675
676    }
677}