libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
endianess_converters.h
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5
6#include "libmicroemu/types.h"
7
8namespace libmicroemu::internal {
9
13class BigToLittleEndianConverter {
14public:
22 template <typename T> static constexpr inline T Convert(const T &value) = delete;
23
24private:
28 BigToLittleEndianConverter() = delete;
29
33 ~BigToLittleEndianConverter() = delete;
34
39 BigToLittleEndianConverter(const BigToLittleEndianConverter &r_src) = delete;
40
45 BigToLittleEndianConverter &operator=(const BigToLittleEndianConverter &r_src) = delete;
46
51 BigToLittleEndianConverter(BigToLittleEndianConverter &&r_src) = delete;
52
57 BigToLittleEndianConverter &operator=(BigToLittleEndianConverter &&r_src) = delete;
58};
59
64template <> constexpr inline u8 BigToLittleEndianConverter::Convert(const u8 &value) {
65 return value;
66}
67
71template <> constexpr inline u16 BigToLittleEndianConverter::Convert<u16>(const u16 &value) {
72 return ((value << 8U) & 0xFF00U) | ((value >> 8U) & 0x00FFU);
73}
74
79template <> constexpr inline u32 BigToLittleEndianConverter::Convert<u32>(const u32 &value) {
80 return ((value << 24U) & 0xFF000000U) | ((value << 8U) & 0x00FF0000U) |
81 ((value >> 8U) & 0x0000FF00U) | ((value >> 24U) & 0x000000FFU);
82}
83
88template <> constexpr inline u64 BigToLittleEndianConverter::Convert<u64>(const u64 &value) {
89 return ((value << 56U) & 0xFF00000000000000U) | ((value << 40U) & 0x00FF000000000000U) |
90 ((value << 24U) & 0x0000FF0000000000U) | ((value << 8U) & 0x000000FF00000000U) |
91 ((value >> 8U) & 0x00000000FF000000U) | ((value >> 24U) & 0x0000000000FF0000U) |
92 ((value >> 40U) & 0x000000000000FF00U) | ((value >> 56U) & 0x00000000000000FFU);
93}
94
95// -----------------------------------------------------------------------------
96
102class LittleToLittleEndianConverter {
103public:
112 template <typename T> static constexpr inline T Convert(const T &value) = delete;
113
114private:
118 LittleToLittleEndianConverter() = delete;
119
123 ~LittleToLittleEndianConverter() = delete;
124
129 LittleToLittleEndianConverter(const LittleToLittleEndianConverter &r_src) = delete;
130
135 LittleToLittleEndianConverter &operator=(const LittleToLittleEndianConverter &r_src) = delete;
136
141 LittleToLittleEndianConverter(LittleToLittleEndianConverter &&r_src) = delete;
142
147 LittleToLittleEndianConverter &operator=(LittleToLittleEndianConverter &&r_src) = delete;
148};
149
154template <> constexpr inline u8 LittleToLittleEndianConverter::Convert(const u8 &value) {
155 return value;
156}
157
162template <> constexpr inline u16 LittleToLittleEndianConverter::Convert<u16>(const u16 &value) {
163 return value;
164}
165
170template <> constexpr inline u32 LittleToLittleEndianConverter::Convert<u32>(const u32 &value) {
171 return value;
172}
173
178template <> constexpr inline u64 LittleToLittleEndianConverter::Convert<u64>(const u64 &value) {
179 return value;
180}
181
182} // namespace libmicroemu::internal
static constexpr T Convert(const T &value)=delete
Converts an arbitrary value from big endian to little endian representation.
static constexpr T Convert(const T &value)=delete
Converts an arbitrary value from little endian to little endian representation.
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6