1pub trait Endianness {
2 fn as_runtime_endian(&self) -> RuntimeEndian;
3
4 #[inline]
5 fn is_little_endian(&self) -> bool {
6 self.as_runtime_endian() == RuntimeEndian::Little
7 }
8
9 #[inline]
10 fn read_u16(&self, n: u16) -> u16 {
11 match self.as_runtime_endian() {
12 RuntimeEndian::Little => u16::from_le(n),
13 RuntimeEndian::Big => u16::from_be(n),
14 }
15 }
16
17 #[inline]
18 fn read_u32(&self, n: u32) -> u32 {
19 match self.as_runtime_endian() {
20 RuntimeEndian::Little => u32::from_le(n),
21 RuntimeEndian::Big => u32::from_be(n),
22 }
23 }
24
25 #[inline]
26 fn read_u64(&self, n: u64) -> u64 {
27 match self.as_runtime_endian() {
28 RuntimeEndian::Little => u64::from_le(n),
29 RuntimeEndian::Big => u64::from_be(n),
30 }
31 }
32
33 #[inline]
34 fn read_i16(&self, n: i16) -> i16 {
35 match self.as_runtime_endian() {
36 RuntimeEndian::Little => i16::from_le(n),
37 RuntimeEndian::Big => i16::from_be(n),
38 }
39 }
40
41 #[inline]
42 fn read_i32(&self, n: i32) -> i32 {
43 match self.as_runtime_endian() {
44 RuntimeEndian::Little => i32::from_le(n),
45 RuntimeEndian::Big => i32::from_be(n),
46 }
47 }
48
49 #[inline]
50 fn read_i64(&self, n: i64) -> i64 {
51 match self.as_runtime_endian() {
52 RuntimeEndian::Little => i64::from_le(n),
53 RuntimeEndian::Big => i64::from_be(n),
54 }
55 }
56
57 #[inline]
58 fn read_u16_bytes(&self, bytes: [u8; 2]) -> u16 {
59 match self.as_runtime_endian() {
60 RuntimeEndian::Little => u16::from_le_bytes(bytes),
61 RuntimeEndian::Big => u16::from_be_bytes(bytes),
62 }
63 }
64
65 #[inline]
66 fn read_u32_bytes(&self, bytes: [u8; 4]) -> u32 {
67 match self.as_runtime_endian() {
68 RuntimeEndian::Little => u32::from_le_bytes(bytes),
69 RuntimeEndian::Big => u32::from_be_bytes(bytes),
70 }
71 }
72
73 #[inline]
74 fn read_u64_bytes(&self, bytes: [u8; 8]) -> u64 {
75 match self.as_runtime_endian() {
76 RuntimeEndian::Little => u64::from_le_bytes(bytes),
77 RuntimeEndian::Big => u64::from_be_bytes(bytes),
78 }
79 }
80
81 #[inline]
82 fn read_i16_bytes(&self, bytes: [u8; 2]) -> i16 {
83 match self.as_runtime_endian() {
84 RuntimeEndian::Little => i16::from_le_bytes(bytes),
85 RuntimeEndian::Big => i16::from_be_bytes(bytes),
86 }
87 }
88
89 #[inline]
90 fn read_i32_bytes(&self, bytes: [u8; 4]) -> i32 {
91 match self.as_runtime_endian() {
92 RuntimeEndian::Little => i32::from_le_bytes(bytes),
93 RuntimeEndian::Big => i32::from_be_bytes(bytes),
94 }
95 }
96
97 #[inline]
98 fn read_i64_bytes(&self, bytes: [u8; 8]) -> i64 {
99 match self.as_runtime_endian() {
100 RuntimeEndian::Little => i64::from_le_bytes(bytes),
101 RuntimeEndian::Big => i64::from_be_bytes(bytes),
102 }
103 }
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq)]
107pub struct LittleEndian;
108
109#[derive(Debug, Clone, Copy, PartialEq, Eq)]
110pub struct BigEndian;
111
112#[derive(Debug, Clone, Copy, PartialEq, Eq)]
113pub enum RuntimeEndian {
114 Big,
115 Little,
116}
117
118impl Endianness for LittleEndian {
119 #[inline]
120 fn as_runtime_endian(&self) -> RuntimeEndian {
121 RuntimeEndian::Little
122 }
123}
124
125impl Endianness for BigEndian {
126 #[inline]
127 fn as_runtime_endian(&self) -> RuntimeEndian {
128 RuntimeEndian::Big
129 }
130}
131
132impl Endianness for RuntimeEndian {
133 #[inline]
134 fn as_runtime_endian(&self) -> RuntimeEndian {
135 *self
136 }
137}