vminer_core/
endian.rs

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}