SlideIO 2.0.0
Open-source library for reading of medical images
Loading...
Searching...
No Matches
endian.hpp
1// This file is part of slideio project.
2// It is subject to the license terms in the LICENSE file found in the top-level directory
3// of this distribution and at http://slideio.com/license.html.
4#pragma once
5#include "slideio/core/slideio_core_def.hpp"
6#include "slideio/base/exceptions.hpp"
7#include <cstdint>
8#include "slideio/base/slideio_enums.hpp"
9
10namespace slideio
11{
12 enum class DataType;
13
14 namespace Endian
15 {
16 inline bool isLittleEndian() {
17 uint16_t number = 0x1;
18 char* numPtr = reinterpret_cast<char*>(&number);
19 return (numPtr[0] == 1);
20 }
21
22 inline uint16_t swapBytes(uint16_t value) {
23 return (value >> 8) | (value << 8);
24 }
25
26 inline uint32_t swapBytes(uint32_t value) {
27 return (value >> 24) |
28 ((value << 8) & 0x00FF0000) |
29 ((value >> 8) & 0x0000FF00) |
30 (value << 24);
31 }
32
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) |
41 (value << 56);
42 }
43
44 inline int16_t swapBytes(int16_t value) {
45 uint16_t val(0);
46 memcpy(&val, &value, sizeof(val));
47 val = swapBytes(val);
48 memcpy(&value, &val, sizeof(val));
49 return value;
50 }
51
52 inline int32_t swapBytes(int32_t value) {
53 uint32_t val(0);
54 memcpy(&val, &value, sizeof(val));
55 val = swapBytes(val);
56 memcpy(&value, &val, sizeof(val));
57 return value;
58 }
59
60 inline int64_t swapBytes(int64_t value) {
61 uint64_t val(0);
62 memcpy(&val, &value, sizeof(val));
63 val = swapBytes(val);
64 memcpy(&value, &val, sizeof(val));
65 return value;
66 }
67
68 inline float swapBytes(float value) {
69 uint32_t val(0);
70 memcpy(&val, &value, sizeof(val));
71 val = swapBytes(val);
72 memcpy(&value, &val, sizeof(val));
73 return value;
74 }
75
76 inline double swapBytes(double value) {
77 uint64_t val(0);
78 memcpy(&val, &value, sizeof(val));
79 val = swapBytes(val);
80 memcpy(&value, &val, sizeof(val));
81 return value;
82 }
83
84 template<typename T>
85 T fromLittleEndianToNative(T value) {
86 if(isLittleEndian())
87 return value;
88 return swapBytes(value);
89 }
90
91 inline uint16_t little2BigEndian(uint16_t value) {
92 return swapBytes(value);
93 }
94
95 inline uint16_t bigToLittleEndian16(uint16_t bigEndianValue) {
96 return swapBytes(bigEndianValue);
97 }
98
99 SLIDEIO_CORE_EXPORTS std::u16string u16StringLittleToBig(const std::u16string& inLE);
100
101 template <typename T>
102 void fromLittleEndianToNative(T* data, size_t count) {
103 if (isLittleEndian())
104 return;
105 for (size_t i = 0; i < count; ++i) {
106 data[i] = swapBytes(data[i]);
107 }
108 }
109 inline void fromLittleEndianToNative(slideio::DataType dt, void* data, size_t count) {
110 if (isLittleEndian()) {
111 return;
112 }
113 switch (dt) {
114 case DataType::DT_Byte:
115 case DataType::DT_Int8:
116 break;
117 case DataType::DT_Int16:
118 fromLittleEndianToNative(static_cast<int16_t*>(data), count / sizeof(int16_t));
119 break;
120 case DataType::DT_Int32:
121 fromLittleEndianToNative(static_cast<int32_t*>(data), count / sizeof(int32_t));
122 break;
123 case DataType::DT_Float32:
124 fromLittleEndianToNative(static_cast<float*>(data), count / sizeof(float));
125 break;
126 case DataType::DT_Float64:
127 fromLittleEndianToNative(static_cast<double*>(data), count / sizeof(double));
128 break;
129 case DataType::DT_UInt16:
130 fromLittleEndianToNative(static_cast<uint16_t*>(data), count / sizeof(uint16_t));
131 break;
132 case DataType::DT_UInt32:
133 fromLittleEndianToNative(static_cast<uint32_t*>(data), count / sizeof(uint32_t));
134 break;
135 case DataType::DT_Int64:
136 fromLittleEndianToNative(static_cast<int64_t*>(data), count / sizeof(int64_t));
137 break;
138 case DataType::DT_UInt64:
139 fromLittleEndianToNative(static_cast<uint64_t*>(data), count / sizeof(uint64_t));
140 break;
141 default:
142 RAISE_RUNTIME_ERROR << "fromLittleEndianToNative: Unsupported data type " << static_cast<int>(dt);
143 break;
144 }
145 }
146 };
147}
Definition: exceptions.hpp:15