1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
build_enum!{
    @ARRAY
    @ENUM Endian {
        Little,
        Big
    }
    @TOFUNC to_endian => Endian {
        b"\x01" => Endian::Little,
        b"\x02" => Endian::Big
        ;
        "\n\nValue {:?} is non-standard for EI_DATA\n\n"
    }
    @PUB
        read_endian;
        1
}

macro_rules! define_func {
    ($name: ident, $kind:ty) => {
        #[inline(always)]
        #[allow(dead_code)]
        pub fn $name<'a>(&self,x: &'a [u8]) -> $kind {
            #[allow(unused_imports)]
            use super::super::byteorder::{ReadBytesExt,BigEndian,LittleEndian};
            use std::io::Cursor;
            let mut rdr = Cursor::new(x);
            match *self {
                Endian::Little => match rdr.$name::<LittleEndian>() {
                    Ok(x) => x,
                    Err(_) => unreachable!()
                },
                Endian::Big => match rdr.$name::<BigEndian>() {
                    Ok(x) => x,
                    Err(_) => unreachable!()
                },
            }
        }
    }
}

impl Endian {
    define_func!(read_u32, u32);
    define_func!(read_u16, u16);
    define_func!(read_u64, u64);
    define_func!(read_i32, i32);
    define_func!(read_i16, i16);
    define_func!(read_i64, i64);
}