bytepack/
lib.rs

1//! `bytepack` is a simple crate which extends the `std::io` API to be able to read and write any 
2//! data type in their memory representation. It can be seen as a generalization of the 
3//! `std::io::Read` and `std::io::Write` trait , but operating on a generic parameter `T` instead 
4//! of `u8`. This crate focus on performances by beeing no copy (except in one clearly marked case) 
5//! and offering methods to read and write arrays.
6//! 
7//! `bytepack` offers three trait famillies allowing different endianness control. 
8//! [`Unpacker`](trait.Unpacked.html) and [`Packer`](trait.Packer.html) read and write data in the 
9//! endianness of the operating system. [`LEUnpacker`](trait.LEUnpacker.html) and 
10//! [`LEPacker`](trait.LEPacker.html) always read and write data in little endian while 
11//! [`BEUnpacker`](trait.BEUnpacker.html) and [`BEPacker`](trait.BEPacker.html) do the 
12//! same in big endian. They all conform to the same API which is copied from the one of `std::io`.
13//! This means switching from one endianness to another can be done by simply bringing a different 
14//! trait in scope.
15//!
16//! Because `bytepack` is not a serialization library, it cannot read and write complex types like 
17//! `Vec`, `Rc`, etc. directly from a Reader or to Writer. Indeed those types do not contain the 
18//! underlying data directly packed inside but rather hold a reference or a pointer to it. To 
19//! identify types which holds their data "packed" together, the [`Packed`](trait.Packed.html) 
20//! trait is used. Additionnaly it provides a in-place endianness switching method. One can 
21//! implement this trait for the data types deemed safe to read and write. A custom derive for 
22//! structures made only of types implementing [`Packed`](trait.Packed.html) also exists.
23//!
24//! # Example
25//!
26//! ```no_run
27//! use std::fs::File;
28//! use std::iter::repeat;
29//!
30//! use bytepack::{LEPacker, LEUnpacker};
31//!
32//! fn write_samples(file: &str, samples: &Vec<f32>) {
33//!     let mut file = File::create(file).unwrap();
34//!     file.pack(samples.len() as u32).unwrap();
35//!     file.pack_all(&samples[..]).unwrap();
36//! }
37//!
38//! fn read_samples(file: &str) -> Vec<f32> {
39//!     let mut file = File::open(file).unwrap();
40//!     let num_samples : u32 = file.unpack().unwrap();
41//!     let mut samples : Vec<f32> = repeat(0f32).take(num_samples as usize).collect();
42//!     file.unpack_exact(&mut samples[..]).unwrap();
43//!     return samples;
44//! }
45//! ```
46
47use std::io::{Read, Write, Result, Error, ErrorKind};
48use std::mem::{zeroed, transmute, size_of, forget};
49use std::slice;
50
51/// This trait both identifies a type which holds his data packed together in memory and a type 
52/// which offers a `switch_endianness` method. This trait is voluntarily not implemented for 
53/// `isize` and `usize` because their size can vary from one system to another.
54///
55/// # Example
56///
57/// If you would like to read and write one of your struct using `bytepack`, you can derive 
58/// `Packed` for it:
59///
60/// ```no_run
61/// extern crate bytepack;
62/// #[macro_use]
63/// extern crate bytepack_derive;
64/// 
65/// use std::fs::File;
66/// use bytepack::{LEUnpacker, Packed};
67///
68/// #[derive(Packed)]
69/// struct Vector {
70///    x: f32,
71///    y: f32,
72///    z: f32,
73/// }
74///
75/// #[derive(Packed)]
76/// struct RGB(u8,u8,u8);
77///
78/// fn main() {
79///     let mut file = File::open("test").unwrap();
80///     let vector : Vector = file.unpack().unwrap();
81///     let rgb : RGB = file.unpack().unwrap();
82/// }
83///
84/// ```
85///
86/// Please note that also specifying `#[repr(packed)]` might make sense if you want to get rid of 
87/// the padding inside your structure.
88/// 
89/// `Packed` can only be derived for strutures only composed of types implementing `Packed` 
90/// themselves. If you which to circumvent this restriction you can implement `Packed` yourselve, 
91/// however you need to make sure your struct is indeed "packed" and that reading and writing it as 
92/// one continuous memory zone makes sense. For example the following structures are not "packed" 
93/// because they all hold a reference to their data.
94///
95/// ```ignore
96/// struct NotPacked1 {
97///     name: String
98/// }
99///
100/// struct NotPacked2 {
101///     numbers: Vec<f32>
102/// }
103///
104/// struct NotPacked3 {
105///     count: Rc<u64>
106/// }
107/// ```
108pub trait Packed {
109    /// Perform an in-place switch of the endianness. This might be a no-op in some cases.
110    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        // Safe because we always revert to the original type
167        unsafe {
168            *self = transmute(u32::swap_bytes(transmute(*self)));
169        }
170    }
171}
172
173impl Packed for f64 {
174    fn switch_endianness(&mut self) {
175        // Safe because we always revert to the original type
176        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
870/// `Unpacker` provides the `std::io::Read` API but for any type `T` implementing 
871/// [`Packed`](trait.Packed.html). It does not perform any endianness conversion and thus always 
872/// reads data using the system endianness.
873///
874/// # Example
875/// 
876/// Example of reading a file containing a few float samples.
877/// 
878/// ```no_run
879/// use std::fs::File;
880/// use std::iter::repeat;
881///
882/// use bytepack::Unpacker;
883///
884/// fn read_samples(file: &str) -> Vec<f32> {
885///     let mut file = File::open(file).unwrap();
886///     let num_samples : u32 = file.unpack().unwrap();
887///     let mut samples : Vec<f32> = repeat(0f32).take(num_samples as usize).collect();
888///     file.unpack_exact(&mut samples[..]).unwrap();
889///     return samples;
890/// }
891/// ```
892pub trait Unpacker {
893
894    /// Unpack a single value of type `T`.
895    ///
896    /// ```no_run
897    /// # use bytepack::Unpacker;
898    /// # use std::fs::File;
899    /// let mut file = File::open("test").unwrap();
900    /// let float : f32 = file.unpack().unwrap();
901    /// ```
902    fn unpack<T: Packed>(&mut self) -> Result<T>;
903
904    /// Unpack values of type `T` until `EOF` is reached and place them in `buf`. An error is 
905    /// returned if the number of bytes read is not a multiple of the size of `T`.
906    ///
907    /// ```no_run
908    /// # use bytepack::Unpacker;
909    /// # use std::fs::File;
910    /// let mut file = File::open("test").unwrap();
911    /// let mut buffer = Vec::<u64>::new();
912    /// file.unpack_to_end(&mut buffer).unwrap();
913    /// ```
914    fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
915
916    /// Unpack the exact number of values of type `T` to fill `buf`. An error is 
917    /// returned if not enough byte could be read.
918    ///
919    /// ```no_run
920    /// # use bytepack::Unpacker;
921    /// # use std::fs::File;
922    /// let mut file = File::open("test").unwrap();
923    /// let mut buffer = vec![0i32; 10];
924    /// file.unpack_exact(&mut buffer[..]).unwrap();
925    /// ```
926    fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
927}
928
929/// `Packer` provides the `std::io::Write` API but for any type `T` implementing 
930/// [`Packed`](trait.Packed.html). It does not perform any endianness conversion and thus always 
931/// writes data using the system endianness.
932///
933/// # Example
934/// 
935/// Example of writing a file containing a few float samples.
936/// 
937/// ```no_run
938/// use std::fs::File;
939/// use std::iter::repeat;
940///
941/// use bytepack::Packer;
942///
943/// fn write_samples(file: &str, samples: &Vec<f32>) {
944///     let mut file = File::create(file).unwrap();
945///     file.pack(samples.len() as u32).unwrap();
946///     file.pack_all(&samples[..]).unwrap();
947/// }
948/// ```
949pub trait Packer {
950
951    /// Pack a single value of type `T`.
952    ///
953    /// ```no_run
954    /// # use bytepack::Packer;
955    /// # use std::fs::File;
956    /// let mut file = File::create("test").unwrap();
957    /// file.pack(42f32).unwrap();
958    /// ```
959    fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
960
961    /// Pack a single value of type `T` passed by reference.
962    ///
963    /// ```no_run
964    /// # use bytepack::Packer;
965    /// # use std::fs::File;
966    /// let mut file = File::create("test").unwrap();
967    /// file.pack(42f32).unwrap();
968    /// ```
969    fn pack_ref<T: Packed>(&mut self, t: &T) -> Result<()>;
970
971    /// Pack all the values of type `T` from `buf`.
972    ///
973    /// ```no_run
974    /// # use bytepack::Packer;
975    /// # use std::fs::File;
976    /// let mut file = File::create("test").unwrap();
977    /// let mut float_buffer = vec![666u16; 10];
978    /// file.pack_all(&mut float_buffer[..]).unwrap();
979    /// ```
980    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        // safe because we build a slice of exactly size_of::<T> bytes
987        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        // safe because converted is always forgotten before returning, capacity and length are 
996        // always recomputed, in case of error buf is truncated to it's original data.
997        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        // safe because we build a slice of exactly buf.len() * size_of::<T> bytes
1032        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        // safe because we build a slice of exactly size_of::<T> bytes
1041        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        // safe because we build a slice of exactly size_of::<T> bytes
1049        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        // safe because we build a slice of exactly t.len() * size_of::<T> bytes
1057        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
1064/// Provides the same API and functionnality as [`Unpacker`](trait.Unpacker.html) but ensure that 
1065/// the data is in little endian format. See [`Unpacker`](trait.Unpacker.html) for more 
1066/// documentation.
1067pub 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
1073/// Provides the same API and functionnality as [`Packer`](trait.Packer.html) but ensure that 
1074/// the data is in little endian format. See [`Packer`](trait.Packer.html) for more 
1075/// documentation.
1076pub trait LEPacker {
1077    fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
1078
1079    /// Here T needs to be `Clone` because the endianness switch cannot be done in-place. This method 
1080    /// thus allocates a copy of `buf` if an endianness switch is needed.
1081    fn pack_ref<T: Packed + Clone>(&mut self, t: &T) -> Result<()>;
1082
1083    /// Here T needs to be `Clone` because the endianness switch cannot be done in-place. This method 
1084    /// thus allocates a copy of `buf` if an endianness switch is needed.
1085    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
1165/// Provides the same API and functionnality as [`Unpacker`](trait.Unpacker.html) but ensure that 
1166/// the data is in big endian format. See [`Unpacker`](trait.Unpacker.html) for more 
1167/// documentation.
1168pub 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
1174/// Provides the same API and functionnality as [`Packer`](trait.Packer.html) but ensure that 
1175/// the data is in big endian format. See [`Packer`](trait.Packer.html) for more 
1176/// documentation.
1177pub trait BEPacker {
1178    fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
1179
1180    /// Here T needs to be `Clone` because the endianness switch cannot be done in-place. This method 
1181    /// thus allocates a copy of `buf` if an endianness switch is needed.
1182    fn pack_ref<T: Packed + Clone>(&mut self, t: &T) -> Result<()>;
1183
1184    /// Here T needs to be `Clone` because the endianness switch cannot be done in-place. This method 
1185    /// thus allocates a copy of `buf` if an endianness switch is needed.
1186    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}