annotate include/core/endian.h @ 373:fbc8c617de80

dep/animone: exception handling is the worst c++ anti-feature
author Paper <paper@tflc.us>
date Fri, 25 Jul 2025 11:03:05 -0400
parents 47c9f8502269
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
1 #ifndef MINORI_CORE_ENDIAN_H_
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
2 #define MINORI_CORE_ENDIAN_H_
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
3
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
4 /* definition of endian-related stuff. primarily used for x11
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
5 * binary structures */
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
6
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
7 #include "core/bit_cast.h"
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
8 #include <cstdint>
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
9 #include <type_traits>
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
10
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
11 class Endian {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
12 private:
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
13 /* check for compiler builtins for byteswapping */
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
14 #ifdef __has_builtin
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
15 # if __has_builtin(__builtin_bswap16)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
16 # define COMPILER_BUILTIN_BSWAP16(x) __builtin_bswap16(x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
17 # endif
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
18 # if __has_builtin(__builtin_bswap32)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
19 # define COMPILER_BUILTIN_BSWAP32(x) __builtin_bswap32(x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
20 # endif
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
21 # if __has_builtin(__builtin_bswap64)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
22 # define COMPILER_BUILTIN_BSWAP64(x) __builtin_bswap64(x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
23 # endif
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
24 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
25
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
26 static constexpr uint16_t byteswap_16(uint16_t x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
27 {
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
28 #ifdef COMPILER_BUILTIN_BSWAP16
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
29 return COMPILER_BUILTIN_BSWAP16(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
30 #else
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
31 return (((x & UINT16_C(0x00FF)) << 8) | ((x & UINT16_C(0xFF00)) >> 8));
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
32 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
33 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
34
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
35 static constexpr uint32_t byteswap_32(uint32_t x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
36 {
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
37 #ifdef COMPILER_BUILTIN_BSWAP32
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
38 return COMPILER_BUILTIN_BSWAP32(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
39 #else
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
40 return (((x & UINT32_C(0x000000FF)) << 24) | ((x & UINT32_C(0x0000FF00)) << 8) |
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
41 ((x & UINT32_C(0x00FF0000)) >> 8) | ((x & UINT32_C(0xFF000000)) >> 24));
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
42 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
43 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
44
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
45 static constexpr uint64_t byteswap_64(uint64_t x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
46 {
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
47 #ifdef COMPILER_BUILTIN_BSWAP64
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
48 return COMPILER_BUILTIN_BSWAP64(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
49 #else
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
50 return (((x & UINT64_C(0x00000000000000FF)) << 56) | ((x & UINT64_C(0x000000000000FF00)) << 40) |
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
51 ((x & UINT64_C(0x0000000000FF0000)) << 24) | ((x & UINT64_C(0x00000000FF000000)) << 8) |
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
52 ((x & UINT64_C(0x000000FF00000000)) >> 8) | ((x & UINT64_C(0x0000FF0000000000)) >> 24) |
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
53 ((x & UINT64_C(0x00FF000000000000)) >> 40) | ((x & UINT64_C(0xFF00000000000000)) >> 56));
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
54 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
55 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
56
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
57 #ifdef COMPILER_BUILTIN_BSWAP16
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
58 # undef COMPILER_BUILTIN_BSWAP16
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
59 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
60 #ifdef COMPILER_BUILTIN_BSWAP32
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
61 # undef COMPILER_BUILTIN_BSWAP32
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
62 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
63 #ifdef COMPILER_BUILTIN_BSWAP64
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
64 # undef COMPILER_BUILTIN_BSWAP64
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
65 #endif
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
66 public:
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
67 #if defined(BYTE_ORDER_BIG)
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
68 static constexpr bool big = true;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
69 static constexpr bool little = false;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
70 #elif defined(BYTE_ORDER_LITTLE)
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
71 static constexpr bool big = false;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
72 static constexpr bool little = true;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
73 #else
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
74 # error "unsupported endianness"
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
75 #endif
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
76
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
77 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
78 static constexpr T byteswap(T x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
79 {
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
80 static_assert(std::is_integral<T>::value);
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
81 static_assert(std::is_unsigned<T>::value, "use signed_byteswap");
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
82
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
83 if constexpr (std::is_same<T, uint8_t>::value) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
84 return x;
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
85 } else if constexpr (std::is_same<T, uint16_t>::value) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
86 return byteswap_16(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
87 } else if constexpr (std::is_same<T, uint32_t>::value) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
88 return byteswap_32(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
89 } else if constexpr (std::is_same<T, uint64_t>::value) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
90 return byteswap_64(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
91 } else {
354
9aaf1e788896 core/endian: fix compile error under clang
Paper <paper@paper.us.eu.org>
parents: 351
diff changeset
92 static_assert(!sizeof(T), "invalid integer type given to byteswap");
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
93 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
94 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
95
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
96 /* this can't be constexpr */
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
97 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
98 static T signed_byteswap(T x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
99 {
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
100 static_assert(std::is_integral<T>::value);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
101 static_assert(std::is_signed<T>::value, "use regular byteswap");
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
102
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
103 using uT = typename std::make_unsigned<T>::type;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
104 return minori::BitCast<T, uT>(byteswap<uT>(minori::BitCast<uT, T>(x)));
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
105 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
106
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
107 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
108 static constexpr T byteswap_little_to_host(T x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
109 {
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
110 if constexpr (little) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
111 return x;
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
112 } else if constexpr (big) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
113 return byteswap(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
114 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
115 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
116
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
117 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
118 static constexpr T byteswap_big_to_host(T x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
119 {
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
120 if constexpr (big) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
121 return x;
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
122 } else if constexpr (little) {
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
123 return byteswap(x);
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
124 }
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
125 }
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
126
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
127 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
128 static T signed_byteswap_little_to_host(T x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
129 {
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
130 if constexpr (little) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
131 return x;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
132 } else if constexpr (big) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
133 return signed_byteswap(x);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
134 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
135 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
136
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
137 template<typename T>
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
138 static T signed_byteswap_big_to_host(T x)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
139 {
364
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
140 if constexpr (big) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
141 return x;
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
142 } else if constexpr (little) {
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
143 return signed_byteswap(x);
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
144 }
99c961c91809 core: refactor out byte stream into its own file
Paper <paper@paper.us.eu.org>
parents: 354
diff changeset
145 }
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 364
diff changeset
146
351
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
147 private:
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
148 Endian() = delete;
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
149 };
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
150
c844f8bb87ce gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
diff changeset
151 #endif /* MINORI_CORE_ENDIAN_H_ */