1use std::io::{Read, Write, Result, Error, ErrorKind};
48use std::mem::{zeroed, transmute, size_of, forget};
49use std::slice;
50
51pub trait Packed {
109 fn switch_endianness(&mut self);
111}
112
113impl Packed for bool {
114 fn switch_endianness(&mut self) {
115 }
116}
117
118impl Packed for u8 {
119 fn switch_endianness(&mut self) {
120 }
121}
122
123impl Packed for i8 {
124 fn switch_endianness(&mut self) {
125 }
126}
127
128impl Packed for u16 {
129 fn switch_endianness(&mut self) {
130 *self = u16::swap_bytes(*self);
131 }
132}
133
134impl Packed for i16 {
135 fn switch_endianness(&mut self) {
136 *self = i16::swap_bytes(*self);
137 }
138}
139
140impl Packed for u32 {
141 fn switch_endianness(&mut self) {
142 *self = u32::swap_bytes(*self);
143 }
144}
145
146impl Packed for i32 {
147 fn switch_endianness(&mut self) {
148 *self = i32::swap_bytes(*self);
149 }
150}
151
152impl Packed for u64 {
153 fn switch_endianness(&mut self) {
154 *self = u64::swap_bytes(*self);
155 }
156}
157
158impl Packed for i64 {
159 fn switch_endianness(&mut self) {
160 *self = i64::swap_bytes(*self);
161 }
162}
163
164impl Packed for f32 {
165 fn switch_endianness(&mut self) {
166 unsafe {
168 *self = transmute(u32::swap_bytes(transmute(*self)));
169 }
170 }
171}
172
173impl Packed for f64 {
174 fn switch_endianness(&mut self) {
175 unsafe {
177 *self = transmute(u64::swap_bytes(transmute(*self)));
178 }
179 }
180}
181
182impl<T> Packed for [T;1] where T: Packed {
183 fn switch_endianness(&mut self) {
184 self[0].switch_endianness();
185 }
186}
187
188impl<T> Packed for [T;2] where T: Packed {
189 fn switch_endianness(&mut self) {
190 self[0].switch_endianness();
191 self[1].switch_endianness();
192 }
193}
194
195impl<T> Packed for [T;3] where T: Packed {
196 fn switch_endianness(&mut self) {
197 self[0].switch_endianness();
198 self[1].switch_endianness();
199 self[2].switch_endianness();
200 }
201}
202
203impl<T> Packed for [T;4] where T: Packed {
204 fn switch_endianness(&mut self) {
205 self[0].switch_endianness();
206 self[1].switch_endianness();
207 self[2].switch_endianness();
208 self[3].switch_endianness();
209 }
210}
211
212impl<T> Packed for [T;5] where T: Packed {
213 fn switch_endianness(&mut self) {
214 self[0].switch_endianness();
215 self[1].switch_endianness();
216 self[2].switch_endianness();
217 self[3].switch_endianness();
218 self[4].switch_endianness();
219 }
220}
221
222impl<T> Packed for [T;6] where T: Packed {
223 fn switch_endianness(&mut self) {
224 self[0].switch_endianness();
225 self[1].switch_endianness();
226 self[2].switch_endianness();
227 self[3].switch_endianness();
228 self[4].switch_endianness();
229 self[5].switch_endianness();
230 }
231}
232
233impl<T> Packed for [T;7] where T: Packed {
234 fn switch_endianness(&mut self) {
235 self[0].switch_endianness();
236 self[1].switch_endianness();
237 self[2].switch_endianness();
238 self[3].switch_endianness();
239 self[4].switch_endianness();
240 self[5].switch_endianness();
241 self[6].switch_endianness();
242 }
243}
244
245impl<T> Packed for [T;8] where T: Packed {
246 fn switch_endianness(&mut self) {
247 self[0].switch_endianness();
248 self[1].switch_endianness();
249 self[2].switch_endianness();
250 self[3].switch_endianness();
251 self[4].switch_endianness();
252 self[5].switch_endianness();
253 self[6].switch_endianness();
254 self[7].switch_endianness();
255 }
256}
257
258impl<T> Packed for [T;9] where T: Packed {
259 fn switch_endianness(&mut self) {
260 self[0].switch_endianness();
261 self[1].switch_endianness();
262 self[2].switch_endianness();
263 self[3].switch_endianness();
264 self[4].switch_endianness();
265 self[5].switch_endianness();
266 self[6].switch_endianness();
267 self[7].switch_endianness();
268 self[8].switch_endianness();
269 }
270}
271
272impl<T> Packed for [T;10] where T: Packed {
273 fn switch_endianness(&mut self) {
274 self[0].switch_endianness();
275 self[1].switch_endianness();
276 self[2].switch_endianness();
277 self[3].switch_endianness();
278 self[4].switch_endianness();
279 self[5].switch_endianness();
280 self[6].switch_endianness();
281 self[7].switch_endianness();
282 self[8].switch_endianness();
283 self[9].switch_endianness();
284 }
285}
286
287impl<T> Packed for [T;11] where T: Packed {
288 fn switch_endianness(&mut self) {
289 self[0].switch_endianness();
290 self[1].switch_endianness();
291 self[2].switch_endianness();
292 self[3].switch_endianness();
293 self[4].switch_endianness();
294 self[5].switch_endianness();
295 self[6].switch_endianness();
296 self[7].switch_endianness();
297 self[8].switch_endianness();
298 self[9].switch_endianness();
299 self[10].switch_endianness();
300 }
301}
302
303impl<T> Packed for [T;12] where T: Packed {
304 fn switch_endianness(&mut self) {
305 self[0].switch_endianness();
306 self[1].switch_endianness();
307 self[2].switch_endianness();
308 self[3].switch_endianness();
309 self[4].switch_endianness();
310 self[5].switch_endianness();
311 self[6].switch_endianness();
312 self[7].switch_endianness();
313 self[8].switch_endianness();
314 self[9].switch_endianness();
315 self[10].switch_endianness();
316 self[11].switch_endianness();
317 }
318}
319
320impl<T> Packed for [T;13] where T: Packed {
321 fn switch_endianness(&mut self) {
322 self[0].switch_endianness();
323 self[1].switch_endianness();
324 self[2].switch_endianness();
325 self[3].switch_endianness();
326 self[4].switch_endianness();
327 self[5].switch_endianness();
328 self[6].switch_endianness();
329 self[7].switch_endianness();
330 self[8].switch_endianness();
331 self[9].switch_endianness();
332 self[10].switch_endianness();
333 self[11].switch_endianness();
334 self[12].switch_endianness();
335 }
336}
337
338impl<T> Packed for [T;14] where T: Packed {
339 fn switch_endianness(&mut self) {
340 self[0].switch_endianness();
341 self[1].switch_endianness();
342 self[2].switch_endianness();
343 self[3].switch_endianness();
344 self[4].switch_endianness();
345 self[5].switch_endianness();
346 self[6].switch_endianness();
347 self[7].switch_endianness();
348 self[8].switch_endianness();
349 self[9].switch_endianness();
350 self[10].switch_endianness();
351 self[11].switch_endianness();
352 self[12].switch_endianness();
353 self[13].switch_endianness();
354 }
355}
356
357impl<T> Packed for [T;15] where T: Packed {
358 fn switch_endianness(&mut self) {
359 self[0].switch_endianness();
360 self[1].switch_endianness();
361 self[2].switch_endianness();
362 self[3].switch_endianness();
363 self[4].switch_endianness();
364 self[5].switch_endianness();
365 self[6].switch_endianness();
366 self[7].switch_endianness();
367 self[8].switch_endianness();
368 self[9].switch_endianness();
369 self[10].switch_endianness();
370 self[11].switch_endianness();
371 self[12].switch_endianness();
372 self[13].switch_endianness();
373 self[14].switch_endianness();
374 }
375}
376
377impl<T> Packed for [T;16] where T: Packed {
378 fn switch_endianness(&mut self) {
379 self[0].switch_endianness();
380 self[1].switch_endianness();
381 self[2].switch_endianness();
382 self[3].switch_endianness();
383 self[4].switch_endianness();
384 self[5].switch_endianness();
385 self[6].switch_endianness();
386 self[7].switch_endianness();
387 self[8].switch_endianness();
388 self[9].switch_endianness();
389 self[10].switch_endianness();
390 self[11].switch_endianness();
391 self[12].switch_endianness();
392 self[13].switch_endianness();
393 self[14].switch_endianness();
394 self[15].switch_endianness();
395 }
396}
397
398impl<T> Packed for [T;17] where T: Packed {
399 fn switch_endianness(&mut self) {
400 self[0].switch_endianness();
401 self[1].switch_endianness();
402 self[2].switch_endianness();
403 self[3].switch_endianness();
404 self[4].switch_endianness();
405 self[5].switch_endianness();
406 self[6].switch_endianness();
407 self[7].switch_endianness();
408 self[8].switch_endianness();
409 self[9].switch_endianness();
410 self[10].switch_endianness();
411 self[11].switch_endianness();
412 self[12].switch_endianness();
413 self[13].switch_endianness();
414 self[14].switch_endianness();
415 self[15].switch_endianness();
416 self[16].switch_endianness();
417 }
418}
419
420impl<T> Packed for [T;18] where T: Packed {
421 fn switch_endianness(&mut self) {
422 self[0].switch_endianness();
423 self[1].switch_endianness();
424 self[2].switch_endianness();
425 self[3].switch_endianness();
426 self[4].switch_endianness();
427 self[5].switch_endianness();
428 self[6].switch_endianness();
429 self[7].switch_endianness();
430 self[8].switch_endianness();
431 self[9].switch_endianness();
432 self[10].switch_endianness();
433 self[11].switch_endianness();
434 self[12].switch_endianness();
435 self[13].switch_endianness();
436 self[14].switch_endianness();
437 self[15].switch_endianness();
438 self[16].switch_endianness();
439 self[17].switch_endianness();
440 }
441}
442
443impl<T> Packed for [T;19] where T: Packed {
444 fn switch_endianness(&mut self) {
445 self[0].switch_endianness();
446 self[1].switch_endianness();
447 self[2].switch_endianness();
448 self[3].switch_endianness();
449 self[4].switch_endianness();
450 self[5].switch_endianness();
451 self[6].switch_endianness();
452 self[7].switch_endianness();
453 self[8].switch_endianness();
454 self[9].switch_endianness();
455 self[10].switch_endianness();
456 self[11].switch_endianness();
457 self[12].switch_endianness();
458 self[13].switch_endianness();
459 self[14].switch_endianness();
460 self[15].switch_endianness();
461 self[16].switch_endianness();
462 self[17].switch_endianness();
463 self[18].switch_endianness();
464 }
465}
466
467impl<T> Packed for [T;20] where T: Packed {
468 fn switch_endianness(&mut self) {
469 self[0].switch_endianness();
470 self[1].switch_endianness();
471 self[2].switch_endianness();
472 self[3].switch_endianness();
473 self[4].switch_endianness();
474 self[5].switch_endianness();
475 self[6].switch_endianness();
476 self[7].switch_endianness();
477 self[8].switch_endianness();
478 self[9].switch_endianness();
479 self[10].switch_endianness();
480 self[11].switch_endianness();
481 self[12].switch_endianness();
482 self[13].switch_endianness();
483 self[14].switch_endianness();
484 self[15].switch_endianness();
485 self[16].switch_endianness();
486 self[17].switch_endianness();
487 self[18].switch_endianness();
488 self[19].switch_endianness();
489 }
490}
491
492impl<T> Packed for [T;21] where T: Packed {
493 fn switch_endianness(&mut self) {
494 self[0].switch_endianness();
495 self[1].switch_endianness();
496 self[2].switch_endianness();
497 self[3].switch_endianness();
498 self[4].switch_endianness();
499 self[5].switch_endianness();
500 self[6].switch_endianness();
501 self[7].switch_endianness();
502 self[8].switch_endianness();
503 self[9].switch_endianness();
504 self[10].switch_endianness();
505 self[11].switch_endianness();
506 self[12].switch_endianness();
507 self[13].switch_endianness();
508 self[14].switch_endianness();
509 self[15].switch_endianness();
510 self[16].switch_endianness();
511 self[17].switch_endianness();
512 self[18].switch_endianness();
513 self[19].switch_endianness();
514 self[20].switch_endianness();
515 }
516}
517
518impl<T> Packed for [T;22] where T: Packed {
519 fn switch_endianness(&mut self) {
520 self[0].switch_endianness();
521 self[1].switch_endianness();
522 self[2].switch_endianness();
523 self[3].switch_endianness();
524 self[4].switch_endianness();
525 self[5].switch_endianness();
526 self[6].switch_endianness();
527 self[7].switch_endianness();
528 self[8].switch_endianness();
529 self[9].switch_endianness();
530 self[10].switch_endianness();
531 self[11].switch_endianness();
532 self[12].switch_endianness();
533 self[13].switch_endianness();
534 self[14].switch_endianness();
535 self[15].switch_endianness();
536 self[16].switch_endianness();
537 self[17].switch_endianness();
538 self[18].switch_endianness();
539 self[19].switch_endianness();
540 self[20].switch_endianness();
541 self[21].switch_endianness();
542 }
543}
544
545impl<T> Packed for [T;23] where T: Packed {
546 fn switch_endianness(&mut self) {
547 self[0].switch_endianness();
548 self[1].switch_endianness();
549 self[2].switch_endianness();
550 self[3].switch_endianness();
551 self[4].switch_endianness();
552 self[5].switch_endianness();
553 self[6].switch_endianness();
554 self[7].switch_endianness();
555 self[8].switch_endianness();
556 self[9].switch_endianness();
557 self[10].switch_endianness();
558 self[11].switch_endianness();
559 self[12].switch_endianness();
560 self[13].switch_endianness();
561 self[14].switch_endianness();
562 self[15].switch_endianness();
563 self[16].switch_endianness();
564 self[17].switch_endianness();
565 self[18].switch_endianness();
566 self[19].switch_endianness();
567 self[20].switch_endianness();
568 self[21].switch_endianness();
569 self[22].switch_endianness();
570 }
571}
572
573impl<T> Packed for [T;24] where T: Packed {
574 fn switch_endianness(&mut self) {
575 self[0].switch_endianness();
576 self[1].switch_endianness();
577 self[2].switch_endianness();
578 self[3].switch_endianness();
579 self[4].switch_endianness();
580 self[5].switch_endianness();
581 self[6].switch_endianness();
582 self[7].switch_endianness();
583 self[8].switch_endianness();
584 self[9].switch_endianness();
585 self[10].switch_endianness();
586 self[11].switch_endianness();
587 self[12].switch_endianness();
588 self[13].switch_endianness();
589 self[14].switch_endianness();
590 self[15].switch_endianness();
591 self[16].switch_endianness();
592 self[17].switch_endianness();
593 self[18].switch_endianness();
594 self[19].switch_endianness();
595 self[20].switch_endianness();
596 self[21].switch_endianness();
597 self[22].switch_endianness();
598 self[23].switch_endianness();
599 }
600}
601
602impl<T> Packed for [T;25] where T: Packed {
603 fn switch_endianness(&mut self) {
604 self[0].switch_endianness();
605 self[1].switch_endianness();
606 self[2].switch_endianness();
607 self[3].switch_endianness();
608 self[4].switch_endianness();
609 self[5].switch_endianness();
610 self[6].switch_endianness();
611 self[7].switch_endianness();
612 self[8].switch_endianness();
613 self[9].switch_endianness();
614 self[10].switch_endianness();
615 self[11].switch_endianness();
616 self[12].switch_endianness();
617 self[13].switch_endianness();
618 self[14].switch_endianness();
619 self[15].switch_endianness();
620 self[16].switch_endianness();
621 self[17].switch_endianness();
622 self[18].switch_endianness();
623 self[19].switch_endianness();
624 self[20].switch_endianness();
625 self[21].switch_endianness();
626 self[22].switch_endianness();
627 self[23].switch_endianness();
628 self[24].switch_endianness();
629 }
630}
631
632impl<T> Packed for [T;26] where T: Packed {
633 fn switch_endianness(&mut self) {
634 self[0].switch_endianness();
635 self[1].switch_endianness();
636 self[2].switch_endianness();
637 self[3].switch_endianness();
638 self[4].switch_endianness();
639 self[5].switch_endianness();
640 self[6].switch_endianness();
641 self[7].switch_endianness();
642 self[8].switch_endianness();
643 self[9].switch_endianness();
644 self[10].switch_endianness();
645 self[11].switch_endianness();
646 self[12].switch_endianness();
647 self[13].switch_endianness();
648 self[14].switch_endianness();
649 self[15].switch_endianness();
650 self[16].switch_endianness();
651 self[17].switch_endianness();
652 self[18].switch_endianness();
653 self[19].switch_endianness();
654 self[20].switch_endianness();
655 self[21].switch_endianness();
656 self[22].switch_endianness();
657 self[23].switch_endianness();
658 self[24].switch_endianness();
659 self[25].switch_endianness();
660 }
661}
662
663impl<T> Packed for [T;27] where T: Packed {
664 fn switch_endianness(&mut self) {
665 self[0].switch_endianness();
666 self[1].switch_endianness();
667 self[2].switch_endianness();
668 self[3].switch_endianness();
669 self[4].switch_endianness();
670 self[5].switch_endianness();
671 self[6].switch_endianness();
672 self[7].switch_endianness();
673 self[8].switch_endianness();
674 self[9].switch_endianness();
675 self[10].switch_endianness();
676 self[11].switch_endianness();
677 self[12].switch_endianness();
678 self[13].switch_endianness();
679 self[14].switch_endianness();
680 self[15].switch_endianness();
681 self[16].switch_endianness();
682 self[17].switch_endianness();
683 self[18].switch_endianness();
684 self[19].switch_endianness();
685 self[20].switch_endianness();
686 self[21].switch_endianness();
687 self[22].switch_endianness();
688 self[23].switch_endianness();
689 self[24].switch_endianness();
690 self[25].switch_endianness();
691 self[26].switch_endianness();
692 }
693}
694
695impl<T> Packed for [T;28] where T: Packed {
696 fn switch_endianness(&mut self) {
697 self[0].switch_endianness();
698 self[1].switch_endianness();
699 self[2].switch_endianness();
700 self[3].switch_endianness();
701 self[4].switch_endianness();
702 self[5].switch_endianness();
703 self[6].switch_endianness();
704 self[7].switch_endianness();
705 self[8].switch_endianness();
706 self[9].switch_endianness();
707 self[10].switch_endianness();
708 self[11].switch_endianness();
709 self[12].switch_endianness();
710 self[13].switch_endianness();
711 self[14].switch_endianness();
712 self[15].switch_endianness();
713 self[16].switch_endianness();
714 self[17].switch_endianness();
715 self[18].switch_endianness();
716 self[19].switch_endianness();
717 self[20].switch_endianness();
718 self[21].switch_endianness();
719 self[22].switch_endianness();
720 self[23].switch_endianness();
721 self[24].switch_endianness();
722 self[25].switch_endianness();
723 self[26].switch_endianness();
724 self[27].switch_endianness();
725 }
726}
727
728impl<T> Packed for [T;29] where T: Packed {
729 fn switch_endianness(&mut self) {
730 self[0].switch_endianness();
731 self[1].switch_endianness();
732 self[2].switch_endianness();
733 self[3].switch_endianness();
734 self[4].switch_endianness();
735 self[5].switch_endianness();
736 self[6].switch_endianness();
737 self[7].switch_endianness();
738 self[8].switch_endianness();
739 self[9].switch_endianness();
740 self[10].switch_endianness();
741 self[11].switch_endianness();
742 self[12].switch_endianness();
743 self[13].switch_endianness();
744 self[14].switch_endianness();
745 self[15].switch_endianness();
746 self[16].switch_endianness();
747 self[17].switch_endianness();
748 self[18].switch_endianness();
749 self[19].switch_endianness();
750 self[20].switch_endianness();
751 self[21].switch_endianness();
752 self[22].switch_endianness();
753 self[23].switch_endianness();
754 self[24].switch_endianness();
755 self[25].switch_endianness();
756 self[26].switch_endianness();
757 self[27].switch_endianness();
758 self[28].switch_endianness();
759 }
760}
761
762impl<T> Packed for [T;30] where T: Packed {
763 fn switch_endianness(&mut self) {
764 self[0].switch_endianness();
765 self[1].switch_endianness();
766 self[2].switch_endianness();
767 self[3].switch_endianness();
768 self[4].switch_endianness();
769 self[5].switch_endianness();
770 self[6].switch_endianness();
771 self[7].switch_endianness();
772 self[8].switch_endianness();
773 self[9].switch_endianness();
774 self[10].switch_endianness();
775 self[11].switch_endianness();
776 self[12].switch_endianness();
777 self[13].switch_endianness();
778 self[14].switch_endianness();
779 self[15].switch_endianness();
780 self[16].switch_endianness();
781 self[17].switch_endianness();
782 self[18].switch_endianness();
783 self[19].switch_endianness();
784 self[20].switch_endianness();
785 self[21].switch_endianness();
786 self[22].switch_endianness();
787 self[23].switch_endianness();
788 self[24].switch_endianness();
789 self[25].switch_endianness();
790 self[26].switch_endianness();
791 self[27].switch_endianness();
792 self[28].switch_endianness();
793 self[29].switch_endianness();
794 }
795}
796
797impl<T> Packed for [T;31] where T: Packed {
798 fn switch_endianness(&mut self) {
799 self[0].switch_endianness();
800 self[1].switch_endianness();
801 self[2].switch_endianness();
802 self[3].switch_endianness();
803 self[4].switch_endianness();
804 self[5].switch_endianness();
805 self[6].switch_endianness();
806 self[7].switch_endianness();
807 self[8].switch_endianness();
808 self[9].switch_endianness();
809 self[10].switch_endianness();
810 self[11].switch_endianness();
811 self[12].switch_endianness();
812 self[13].switch_endianness();
813 self[14].switch_endianness();
814 self[15].switch_endianness();
815 self[16].switch_endianness();
816 self[17].switch_endianness();
817 self[18].switch_endianness();
818 self[19].switch_endianness();
819 self[20].switch_endianness();
820 self[21].switch_endianness();
821 self[22].switch_endianness();
822 self[23].switch_endianness();
823 self[24].switch_endianness();
824 self[25].switch_endianness();
825 self[26].switch_endianness();
826 self[27].switch_endianness();
827 self[28].switch_endianness();
828 self[29].switch_endianness();
829 self[30].switch_endianness();
830 }
831}
832
833impl<T> Packed for [T;32] where T: Packed {
834 fn switch_endianness(&mut self) {
835 self[0].switch_endianness();
836 self[1].switch_endianness();
837 self[2].switch_endianness();
838 self[3].switch_endianness();
839 self[4].switch_endianness();
840 self[5].switch_endianness();
841 self[6].switch_endianness();
842 self[7].switch_endianness();
843 self[8].switch_endianness();
844 self[9].switch_endianness();
845 self[10].switch_endianness();
846 self[11].switch_endianness();
847 self[12].switch_endianness();
848 self[13].switch_endianness();
849 self[14].switch_endianness();
850 self[15].switch_endianness();
851 self[16].switch_endianness();
852 self[17].switch_endianness();
853 self[18].switch_endianness();
854 self[19].switch_endianness();
855 self[20].switch_endianness();
856 self[21].switch_endianness();
857 self[22].switch_endianness();
858 self[23].switch_endianness();
859 self[24].switch_endianness();
860 self[25].switch_endianness();
861 self[26].switch_endianness();
862 self[27].switch_endianness();
863 self[28].switch_endianness();
864 self[29].switch_endianness();
865 self[30].switch_endianness();
866 self[31].switch_endianness();
867 }
868}
869
870pub trait Unpacker {
893
894 fn unpack<T: Packed>(&mut self) -> Result<T>;
903
904 fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
915
916 fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
927}
928
929pub trait Packer {
950
951 fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
960
961 fn pack_ref<T: Packed>(&mut self, t: &T) -> Result<()>;
970
971 fn pack_all<T: Packed>(&mut self, buf: &[T]) -> Result<()>;
981}
982
983impl<R> Unpacker for R where R: Read {
984 fn unpack<T: Packed>(&mut self) -> Result<T> {
985 let mut res: T;
986 unsafe {
988 res = zeroed();
989 self.read_exact(slice::from_raw_parts_mut(transmute::<&mut T, *mut u8>(&mut res), size_of::<T>()))?;
990 }
991 return Ok(res);
992 }
993
994 fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize> {
995 unsafe {
998 let length = buf.len();
999 let capacity = buf.capacity();
1000 let mut converted = Vec::<u8>::from_raw_parts(buf.as_mut_ptr() as *mut u8, length * size_of::<T>(), capacity * size_of::<T>());
1001 match self.read_to_end(&mut converted) {
1002 Ok(size) => {
1003 if converted.len() % size_of::<T>() != 0 {
1004 converted.truncate(length * size_of::<T>());
1005 let new_capacity = converted.len() / size_of::<T>();
1006 *buf = Vec::from_raw_parts(converted.as_mut_ptr() as *mut T, length, new_capacity);
1007 forget(converted);
1008 return Err(Error::new(
1009 ErrorKind::UnexpectedEof,
1010 format!("read_to_end() returned a number of bytes ({}) which is not a multiple of the size of T ({})", size, size_of::<T>())
1011 ));
1012 }
1013 },
1014 Err(e) => {
1015 converted.truncate(length * size_of::<T>());
1016 let new_capacity = converted.len() / size_of::<T>();
1017 *buf = Vec::from_raw_parts(converted.as_mut_ptr() as *mut T, length, new_capacity);
1018 forget(converted);
1019 return Err(e);
1020 }
1021 };
1022 let new_length = converted.len() / size_of::<T>();
1023 let new_capacity = converted.len() / size_of::<T>();
1024 *buf = Vec::from_raw_parts(converted.as_mut_ptr() as *mut T, new_length, new_capacity);
1025 forget(converted);
1026 return Ok(new_length - length);
1027 }
1028 }
1029
1030 fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()> {
1031 unsafe {
1033 self.read_exact(slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut u8, buf.len() * size_of::<T>()))
1034 }
1035 }
1036}
1037
1038impl<W> Packer for W where W: Write {
1039 fn pack<T: Packed>(&mut self, t: T) -> Result<()> {
1040 unsafe {
1042 self.write_all(slice::from_raw_parts(transmute::<&T, *const u8>(&t), size_of::<T>()))?;
1043 }
1044 return Ok(());
1045 }
1046
1047 fn pack_ref<T: Packed>(&mut self, t: &T) -> Result<()> {
1048 unsafe {
1050 self.write_all(slice::from_raw_parts(transmute::<&T, *const u8>(t), size_of::<T>()))?;
1051 }
1052 return Ok(());
1053 }
1054
1055 fn pack_all<T: Packed>(&mut self, t: &[T]) -> Result<()> {
1056 unsafe {
1058 self.write_all(slice::from_raw_parts(transmute::<*const T, *const u8>(t.as_ptr()), t.len() * size_of::<T>()))?;
1059 }
1060 return Ok(());
1061 }
1062}
1063
1064pub trait LEUnpacker {
1068 fn unpack<T: Packed>(&mut self) -> Result<T>;
1069 fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
1070 fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
1071}
1072
1073pub trait LEPacker {
1077 fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
1078
1079 fn pack_ref<T: Packed + Clone>(&mut self, t: &T) -> Result<()>;
1082
1083 fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()>;
1086}
1087
1088impl<R> LEUnpacker for R where R: Read {
1089 fn unpack<T: Packed>(&mut self) -> Result<T> {
1090 if cfg!(target_endian = "big") {
1091 let mut t = Unpacker::unpack::<T>(self)?;
1092 t.switch_endianness();
1093 Ok(t)
1094 }
1095 else {
1096 Unpacker::unpack(self)
1097 }
1098 }
1099
1100 fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize> {
1101 if cfg!(target_endian = "big") {
1102 let size = Unpacker::unpack_to_end(self, buf)?;
1103 let start = buf.len() - size;
1104 for i in start..buf.len() {
1105 buf[i].switch_endianness();
1106 }
1107 Ok(size)
1108 }
1109 else {
1110 Unpacker::unpack_to_end(self, buf)
1111 }
1112 }
1113
1114 fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()> {
1115 if cfg!(target_endian = "big") {
1116 Unpacker::unpack_exact(self, buf)?;
1117 for i in 0..buf.len() {
1118 buf[i].switch_endianness();
1119 }
1120 Ok(())
1121 }
1122 else {
1123 Unpacker::unpack_exact(self, buf)
1124 }
1125 }
1126}
1127
1128impl<W> LEPacker for W where W: Write {
1129 fn pack<T: Packed>(&mut self, t: T) -> Result<()> {
1130 if cfg!(target_endian = "big") {
1131 let mut t_copy = t;
1132 t_copy.switch_endianness();
1133 Packer::pack(self, t_copy)
1134 }
1135 else {
1136 Packer::pack(self, t)
1137 }
1138 }
1139
1140 fn pack_ref<T: Packed + Clone>(&mut self, t: &T) -> Result<()> {
1141 if cfg!(target_endian = "big") {
1142 let mut t_copy = t.clone();
1143 t_copy.switch_endianness();
1144 Packer::pack(self, t_copy)
1145 }
1146 else {
1147 Packer::pack_ref(self, t)
1148 }
1149 }
1150
1151 fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()> {
1152 if cfg!(target_endian = "big") {
1153 let mut buf_copy = buf.to_vec();
1154 for i in 0..buf_copy.len() {
1155 buf_copy[i].switch_endianness();
1156 }
1157 Packer::pack_all(self, &buf_copy[..])
1158 }
1159 else {
1160 Packer::pack_all(self, buf)
1161 }
1162 }
1163}
1164
1165pub trait BEUnpacker {
1169 fn unpack<T: Packed>(&mut self) -> Result<T>;
1170 fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
1171 fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
1172}
1173
1174pub trait BEPacker {
1178 fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
1179
1180 fn pack_ref<T: Packed + Clone>(&mut self, t: &T) -> Result<()>;
1183
1184 fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()>;
1187}
1188
1189impl<R> BEUnpacker for R where R: Read {
1190 fn unpack<T: Packed>(&mut self) -> Result<T> {
1191 if cfg!(target_endian = "little") {
1192 let mut t = Unpacker::unpack::<T>(self)?;
1193 t.switch_endianness();
1194 Ok(t)
1195 }
1196 else {
1197 Unpacker::unpack(self)
1198 }
1199 }
1200
1201 fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize> {
1202 if cfg!(target_endian = "little") {
1203 let size = Unpacker::unpack_to_end(self, buf)?;
1204 let start = buf.len() - size;
1205 for i in start..buf.len() {
1206 buf[i].switch_endianness();
1207 }
1208 Ok(size)
1209 }
1210 else {
1211 Unpacker::unpack_to_end(self, buf)
1212 }
1213 }
1214
1215 fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()> {
1216 if cfg!(target_endian = "little") {
1217 Unpacker::unpack_exact(self, buf)?;
1218 for i in 0..buf.len() {
1219 buf[i].switch_endianness();
1220 }
1221 Ok(())
1222 }
1223 else {
1224 Unpacker::unpack_exact(self, buf)
1225 }
1226 }
1227}
1228
1229impl<W> BEPacker for W where W: Write {
1230 fn pack<T: Packed>(&mut self, t: T) -> Result<()> {
1231 if cfg!(target_endian = "little") {
1232 let mut t_copy = t;
1233 t_copy.switch_endianness();
1234 Packer::pack(self, t_copy)
1235 }
1236 else {
1237 Packer::pack(self, t)
1238 }
1239 }
1240
1241 fn pack_ref<T: Packed + Clone>(&mut self, t: &T) -> Result<()> {
1242 if cfg!(target_endian = "little") {
1243 let mut t_copy = t.clone();
1244 t_copy.switch_endianness();
1245 Packer::pack(self, t_copy)
1246 }
1247 else {
1248 Packer::pack_ref(self, t)
1249 }
1250 }
1251
1252 fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()> {
1253 if cfg!(target_endian = "little") {
1254 let mut buf_copy = buf.to_vec();
1255 for i in 0..buf_copy.len() {
1256 buf_copy[i].switch_endianness();
1257 }
1258 Packer::pack_all(self, &buf_copy[..])
1259 }
1260 else {
1261 Packer::pack_all(self, buf)
1262 }
1263 }
1264}