semf
endian.h
Go to the documentation of this file.
1
10#ifndef SEMF_UTILS_PROCESSING_ENDIAN_ENDIAN_H_
11#define SEMF_UTILS_PROCESSING_ENDIAN_ENDIAN_H_
12
15#include <semf/utils/processing/stdworkarounds/bit>
16#include <algorithm>
17#include <cstdint>
18
19namespace semf
20{
36class Endian
37{
38public:
39 virtual ~Endian() = default;
40
48 template <typename T>
49 static void fromBigEndian(const void* data, size_t size, void* buffer);
56 template <typename T>
57 static T fromBigEndian(const void* data);
64 template <typename T>
65 static T fromBigEndian(T data);
73 template <typename T>
74 static void fromLittleEndian(const void* data, size_t size, void* buffer);
81 template <typename T>
82 static T fromLittleEndian(const void* data);
89 template <typename T>
90 static T fromLittleEndian(T data);
98 template <typename T>
99 static void toBigEndian(const void* data, size_t size, void* buffer);
106 template <typename T>
107 static void toBigEndian(T data, void* buffer);
114 template <typename T>
115 static T toBigEndian(T data);
123 template <typename T>
124 static void toLittleEndian(const void* data, size_t size, void* buffer);
131 template <typename T>
132 static void toLittleEndian(T data, void* buffer);
139 template <typename T>
140 static T toLittleEndian(T data);
141
142private:
143 Endian() = default;
144};
145
146template <typename T>
147void Endian::fromBigEndian(const void* data, size_t size, void* buffer)
148{
149 const T* typedData = reinterpret_cast<const T*>(data);
150 T* typedBuffer = reinterpret_cast<T*>(buffer);
151
152 if (std::endian::big == std::endian::native)
153 {
154 std::copy(typedData, typedData + size, typedBuffer);
155 }
156 else
157 {
158 std::for_each(typedData, typedData + size,
159 [&](T value)
160 {
161 std::reverse_copy(reinterpret_cast<uint8_t*>(&value), reinterpret_cast<uint8_t*>(&value) + sizeof(T),
162 reinterpret_cast<uint8_t*>(typedBuffer));
163 typedBuffer++;
164 });
165 }
166}
167
168template <typename T>
169T Endian::fromBigEndian(const void* data)
170{
171 T value;
172 Endian::fromBigEndian<T>(data, 1, &value);
173 return value;
174}
175
176template <typename T>
178{
179 return Endian::fromBigEndian<T>(&data);
180}
181
182template <typename T>
183void Endian::fromLittleEndian(const void* data, size_t size, void* buffer)
184{
185 const T* typedData = reinterpret_cast<const T*>(data);
186 T* typedBuffer = reinterpret_cast<T*>(buffer);
187
188 if (std::endian::little == std::endian::native)
189 {
190 std::copy(typedData, typedData + size, typedBuffer);
191 }
192 else
193 {
194 std::for_each(typedData, typedData + size,
195 [&](T value)
196 {
197 std::reverse_copy(reinterpret_cast<uint8_t*>(&value), reinterpret_cast<uint8_t*>(&value) + sizeof(T),
198 reinterpret_cast<uint8_t*>(typedBuffer));
199 typedBuffer++;
200 });
201 }
202}
203
204template <typename T>
205T Endian::fromLittleEndian(const void* data)
206{
207 T value;
208 Endian::fromLittleEndian<T>(data, 1, &value);
209 return value;
210}
211
212template <typename T>
214{
215 return Endian::fromLittleEndian<T>(&data);
216}
217
218template <typename T>
219void Endian::toBigEndian(const void* data, size_t size, void* buffer)
220{
221 Endian::fromBigEndian<T>(data, size, buffer);
222}
223
224template <typename T>
225void Endian::toBigEndian(T data, void* buffer)
226{
227 Endian::toBigEndian<T>(&data, 1, buffer);
228}
229
230template <typename T>
232{
233 T value;
234 Endian::toBigEndian<T>(data, &value);
235 return value;
236}
237
238template <typename T>
239void Endian::toLittleEndian(const void* data, size_t size, void* buffer)
240{
241 Endian::fromLittleEndian<T>(data, size, buffer);
242}
243
244template <typename T>
245void Endian::toLittleEndian(T data, void* buffer)
246{
247 Endian::toLittleEndian<T>(&data, 1, buffer);
248}
249
250template <typename T>
252{
253 T value;
254 Endian::toLittleEndian<T>(data, &value);
255 return value;
256}
257} // namespace semf
258#endif // SEMF_UTILS_PROCESSING_ENDIAN_ENDIAN_H_
Class for representing big-endian numbers.
The Endian class provides a set of functions for handeling the conversion of data with a specific end...
Definition: endian.h:37
static void fromBigEndian(const void *data, size_t size, void *buffer)
Reads size big-endian numbers from data an stores them in a native representation in buffer.
Definition: endian.h:147
virtual ~Endian()=default
static void toBigEndian(const void *data, size_t size, void *buffer)
Reads size native stored numbers and converts them into big endian numbers.
Definition: endian.h:219
static void toLittleEndian(const void *data, size_t size, void *buffer)
Reads size native stored numbers and converts them into little-endian numbers.
Definition: endian.h:239
static void fromLittleEndian(const void *data, size_t size, void *buffer)
Reads size little-endian numbers from data an stores them in a native representation in buffer.
Definition: endian.h:183
Class for representing little-endian numbers.