1use std::io;
2use std::io::Write;
3use std::mem::size_of;
4
5pub trait NumWrite : private::Sealed {
10
11 fn write_bool(&mut self, value: bool) -> io::Result<()>;
15
16 fn write_u8(&mut self, value: u8) -> io::Result<()>;
20
21 fn write_u16_le(&mut self, value: u16) -> io::Result<()>;
25
26 fn write_u16_be(&mut self, value: u16) -> io::Result<()>;
30
31 fn write_u16_ne(&mut self, value: u16) -> io::Result<()>;
35
36 fn write_u32_le(&mut self, value: u32) -> io::Result<()>;
40
41 fn write_u32_be(&mut self, value: u32) -> io::Result<()>;
45
46 fn write_u32_ne(&mut self, value: u32) -> io::Result<()>;
50
51 fn write_u64_le(&mut self, value: u64) -> io::Result<()>;
55
56 fn write_u64_be(&mut self, value: u64) -> io::Result<()>;
60
61 fn write_u64_ne(&mut self, value: u64) -> io::Result<()>;
65
66 fn write_u128_le(&mut self, value: u128) -> io::Result<()>;
70
71 fn write_u128_be(&mut self, value: u128) -> io::Result<()>;
75
76 fn write_u128_ne(&mut self, value: u128) -> io::Result<()>;
80
81 fn write_i8(&mut self, value: i8) -> io::Result<()>;
85
86 fn write_i16_le(&mut self, value: i16) -> io::Result<()>;
90
91 fn write_i16_be(&mut self, value: i16) -> io::Result<()>;
95
96 fn write_i16_ne(&mut self, value: i16) -> io::Result<()>;
100
101 fn write_i32_le(&mut self, value: i32) -> io::Result<()>;
105
106 fn write_i32_be(&mut self, value: i32) -> io::Result<()>;
110
111 fn write_i32_ne(&mut self, value: i32) -> io::Result<()>;
115
116 fn write_i64_le(&mut self, value: i64) -> io::Result<()>;
120
121 fn write_i64_be(&mut self, value: i64) -> io::Result<()>;
125
126 fn write_i64_ne(&mut self, value: i64) -> io::Result<()>;
130
131 fn write_i128_le(&mut self, value: i128) -> io::Result<()>;
135
136 fn write_i128_be(&mut self, value: i128) -> io::Result<()>;
140
141 fn write_i128_ne(&mut self, value: i128) -> io::Result<()>;
145
146 fn write_f32_le(&mut self, value: f32) -> io::Result<()>;
150
151 fn write_f32_be(&mut self, value: f32) -> io::Result<()>;
155
156 fn write_f32_ne(&mut self, value: f32) -> io::Result<()>;
160
161 fn write_f64_le(&mut self, value: f64) -> io::Result<()>;
165
166 fn write_f64_be(&mut self, value: f64) -> io::Result<()>;
170
171 fn write_f64_ne(&mut self, value: f64) -> io::Result<()>;
175
176 fn write_u8_slice(&mut self, slice: &[u8]) -> io::Result<()>;
180
181 fn write_i8_slice(&mut self, slice: &[i8]) -> io::Result<()>;
185
186 fn write_u16_slice_le(&mut self, slice: &[u16]) -> io::Result<()>;
190
191 fn write_u16_slice_be(&mut self, slice: &[u16]) -> io::Result<()>;
195
196 fn write_u16_slice_ne(&mut self, slice: &[u16]) -> io::Result<()>;
200
201 fn write_u32_slice_le(&mut self, slice: &[u32]) -> io::Result<()>;
205
206 fn write_u32_slice_be(&mut self, slice: &[u32]) -> io::Result<()>;
210 fn write_u32_slice_ne(&mut self, slice: &[u32]) -> io::Result<()>;
214
215 fn write_u64_slice_le(&mut self, slice: &[u64]) -> io::Result<()>;
219 fn write_u64_slice_be(&mut self, slice: &[u64]) -> io::Result<()>;
223 fn write_u64_slice_ne(&mut self, slice: &[u64]) -> io::Result<()>;
227
228 fn write_u128_slice_le(&mut self, slice: &[u128]) -> io::Result<()>;
232 fn write_u128_slice_be(&mut self, slice: &[u128]) -> io::Result<()>;
236 fn write_u128_slice_ne(&mut self, slice: &[u128]) -> io::Result<()>;
240
241 fn write_i16_slice_le(&mut self, slice: &[i16]) -> io::Result<()>;
245 fn write_i16_slice_be(&mut self, slice: &[i16]) -> io::Result<()>;
249 fn write_i16_slice_ne(&mut self, slice: &[i16]) -> io::Result<()>;
253
254 fn write_i32_slice_le(&mut self, slice: &[i32]) -> io::Result<()>;
258 fn write_i32_slice_be(&mut self, slice: &[i32]) -> io::Result<()>;
262 fn write_i32_slice_ne(&mut self, slice: &[i32]) -> io::Result<()>;
266
267 fn write_i64_slice_le(&mut self, slice: &[i64]) -> io::Result<()>;
271 fn write_i64_slice_be(&mut self, slice: &[i64]) -> io::Result<()>;
275 fn write_i64_slice_ne(&mut self, slice: &[i64]) -> io::Result<()>;
279
280 fn write_i128_slice_le(&mut self, slice: &[i128]) -> io::Result<()>;
284 fn write_i128_slice_be(&mut self, slice: &[i128]) -> io::Result<()>;
288 fn write_i128_slice_ne(&mut self, slice: &[i128]) -> io::Result<()>;
292
293 fn write_f64_slice_le(&mut self, slice: &[f64]) -> io::Result<()>;
297 fn write_f64_slice_be(&mut self, slice: &[f64]) -> io::Result<()>;
301 fn write_f64_slice_ne(&mut self, slice: &[f64]) -> io::Result<()>;
305
306 fn write_f32_slice_le(&mut self, slice: &[f32]) -> io::Result<()>;
310 fn write_f32_slice_be(&mut self, slice: &[f32]) -> io::Result<()>;
314 fn write_f32_slice_ne(&mut self, slice: &[f32]) -> io::Result<()>;
318
319 fn write_u8_vec(&mut self, slice: &Vec<u8>) -> io::Result<()>;
323
324 fn write_i8_vec(&mut self, slice: &Vec<i8>) -> io::Result<()>;
328
329 fn write_u16_vec_le(&mut self, slice: &Vec<u16>) -> io::Result<()>;
333
334 fn write_u16_vec_be(&mut self, slice: &Vec<u16>) -> io::Result<()>;
338
339 fn write_u16_vec_ne(&mut self, slice: &Vec<u16>) -> io::Result<()>;
343 fn write_u32_vec_le(&mut self, slice: &Vec<u32>) -> io::Result<()>;
347
348 fn write_u32_vec_be(&mut self, slice: &Vec<u32>) -> io::Result<()>;
352
353 fn write_u32_vec_ne(&mut self, slice: &Vec<u32>) -> io::Result<()>;
357 fn write_u64_vec_le(&mut self, slice: &Vec<u64>) -> io::Result<()>;
361
362 fn write_u64_vec_be(&mut self, slice: &Vec<u64>) -> io::Result<()>;
366
367 fn write_u64_vec_ne(&mut self, slice: &Vec<u64>) -> io::Result<()>;
371 fn write_u128_vec_le(&mut self, slice: &Vec<u128>) -> io::Result<()>;
375
376 fn write_u128_vec_be(&mut self, slice: &Vec<u128>) -> io::Result<()>;
380
381 fn write_u128_vec_ne(&mut self, slice: &Vec<u128>) -> io::Result<()>;
385
386 fn write_i16_vec_le(&mut self, slice: &Vec<i16>) -> io::Result<()>;
390
391 fn write_i16_vec_be(&mut self, slice: &Vec<i16>) -> io::Result<()>;
395
396 fn write_i16_vec_ne(&mut self, slice: &Vec<i16>) -> io::Result<()>;
400
401 fn write_i32_vec_le(&mut self, slice: &Vec<i32>) -> io::Result<()>;
405
406 fn write_i32_vec_be(&mut self, slice: &Vec<i32>) -> io::Result<()>;
410
411 fn write_i32_vec_ne(&mut self, slice: &Vec<i32>) -> io::Result<()>;
415
416 fn write_i64_vec_le(&mut self, slice: &Vec<i64>) -> io::Result<()>;
420
421 fn write_i64_vec_be(&mut self, slice: &Vec<i64>) -> io::Result<()>;
425
426 fn write_i64_vec_ne(&mut self, slice: &Vec<i64>) -> io::Result<()>;
430
431 fn write_i128_vec_le(&mut self, slice: &Vec<i128>) -> io::Result<()>;
435
436 fn write_i128_vec_be(&mut self, slice: &Vec<i128>) -> io::Result<()>;
440
441 fn write_i128_vec_ne(&mut self, slice: &Vec<i128>) -> io::Result<()>;
445
446 fn write_f64_vec_le(&mut self, slice: &Vec<f64>) -> io::Result<()>;
450
451 fn write_f64_vec_be(&mut self, slice: &Vec<f64>) -> io::Result<()>;
455
456 fn write_f64_vec_ne(&mut self, slice: &Vec<f64>) -> io::Result<()>;
460
461 fn write_f32_vec_le(&mut self, slice: &Vec<f32>) -> io::Result<()>;
465
466 fn write_f32_vec_be(&mut self, slice: &Vec<f32>) -> io::Result<()>;
470
471 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}