5#include "slideio/core/slideio_core_def.hpp"
6#include "slideio/base/exceptions.hpp"
8#include "slideio/base/slideio_enums.hpp"
16 inline bool isLittleEndian() {
17 uint16_t number = 0x1;
18 char* numPtr =
reinterpret_cast<char*
>(&number);
19 return (numPtr[0] == 1);
22 inline uint16_t swapBytes(uint16_t value) {
23 return (value >> 8) | (value << 8);
26 inline uint32_t swapBytes(uint32_t value) {
27 return (value >> 24) |
28 ((value << 8) & 0x00FF0000) |
29 ((value >> 8) & 0x0000FF00) |
33 inline uint64_t swapBytes(uint64_t value) {
34 return (value >> 56) |
35 ((value << 40) & 0x00FF000000000000) |
36 ((value << 24) & 0x0000FF0000000000) |
37 ((value << 8) & 0x000000FF00000000) |
38 ((value >> 8) & 0x00000000FF000000) |
39 ((value >> 24) & 0x0000000000FF0000) |
40 ((value >> 40) & 0x000000000000FF00) |
44 inline int16_t swapBytes(int16_t value) {
46 memcpy(&val, &value,
sizeof(val));
48 memcpy(&value, &val,
sizeof(val));
52 inline int32_t swapBytes(int32_t value) {
54 memcpy(&val, &value,
sizeof(val));
56 memcpy(&value, &val,
sizeof(val));
60 inline int64_t swapBytes(int64_t value) {
62 memcpy(&val, &value,
sizeof(val));
64 memcpy(&value, &val,
sizeof(val));
68 inline float swapBytes(
float value) {
70 memcpy(&val, &value,
sizeof(val));
72 memcpy(&value, &val,
sizeof(val));
76 inline double swapBytes(
double value) {
78 memcpy(&val, &value,
sizeof(val));
80 memcpy(&value, &val,
sizeof(val));
85 T fromLittleEndianToNative(T value) {
88 return swapBytes(value);
91 inline uint16_t little2BigEndian(uint16_t value) {
92 return swapBytes(value);
95 inline uint16_t bigToLittleEndian16(uint16_t bigEndianValue) {
96 return swapBytes(bigEndianValue);
99 SLIDEIO_CORE_EXPORTS std::u16string u16StringLittleToBig(
const std::u16string& inLE);
101 template <
typename T>
102 void fromLittleEndianToNative(T* data,
size_t count) {
103 if (isLittleEndian())
105 for (
size_t i = 0; i < count; ++i) {
106 data[i] = swapBytes(data[i]);
109 inline void fromLittleEndianToNative(slideio::DataType dt,
void* data,
size_t count) {
110 if (isLittleEndian()) {
114 case DataType::DT_Byte:
115 case DataType::DT_Int8:
117 case DataType::DT_Int16:
118 fromLittleEndianToNative(
static_cast<int16_t*
>(data), count /
sizeof(int16_t));
120 case DataType::DT_Int32:
121 fromLittleEndianToNative(
static_cast<int32_t*
>(data), count /
sizeof(int32_t));
123 case DataType::DT_Float32:
124 fromLittleEndianToNative(
static_cast<float*
>(data), count /
sizeof(
float));
126 case DataType::DT_Float64:
127 fromLittleEndianToNative(
static_cast<double*
>(data), count /
sizeof(
double));
129 case DataType::DT_UInt16:
130 fromLittleEndianToNative(
static_cast<uint16_t*
>(data), count /
sizeof(uint16_t));
132 case DataType::DT_UInt32:
133 fromLittleEndianToNative(
static_cast<uint32_t*
>(data), count /
sizeof(uint32_t));
135 case DataType::DT_Int64:
136 fromLittleEndianToNative(
static_cast<int64_t*
>(data), count /
sizeof(int64_t));
138 case DataType::DT_UInt64:
139 fromLittleEndianToNative(
static_cast<uint64_t*
>(data), count /
sizeof(uint64_t));
142 RAISE_RUNTIME_ERROR <<
"fromLittleEndianToNative: Unsupported data type " <<
static_cast<int>(dt);
Definition: exceptions.hpp:15