|
9 | 9 |
|
10 | 10 | #pragma clang system_header |
11 | 11 |
|
| 12 | +extern "C" { |
| 13 | + unsigned int __ezcxx_bswap24(unsigned int) noexcept __attribute__((__const__)); |
| 14 | + unsigned __int48 __ezcxx_bswap48(unsigned __int48) noexcept __attribute__((__const__)); |
| 15 | +} |
| 16 | + |
12 | 17 | namespace std { |
13 | 18 |
|
14 | 19 | enum class endian { |
@@ -144,6 +149,33 @@ int popcount(unsigned long long __t) noexcept { |
144 | 149 | return __builtin_popcountll(__t); |
145 | 150 | } |
146 | 151 |
|
| 152 | +//------------------------------------------------------------------------------ |
| 153 | +// byteswap |
| 154 | +//------------------------------------------------------------------------------ |
| 155 | + |
| 156 | +#if __cplusplus >= 201703L |
| 157 | + |
| 158 | +template<class _Tp> _EZCXX_NODISCARD _EZCXX_INLINE constexpr |
| 159 | +_Tp byteswap(_Tp __val) noexcept { |
| 160 | + if constexpr (sizeof(_Tp) == 1) { |
| 161 | + return __val; |
| 162 | + } else if constexpr (sizeof(_Tp) == 2) { |
| 163 | + return __builtin_bswap16(__val); |
| 164 | + } else if constexpr (sizeof(_Tp) == 3) { |
| 165 | + return __ezcxx_bswap24(__val); |
| 166 | + } else if constexpr (sizeof(_Tp) == 4) { |
| 167 | + return __builtin_bswap32(__val); |
| 168 | + } else if constexpr (sizeof(_Tp) == 6) { |
| 169 | + return __ezcxx_bswap48(__val); |
| 170 | + } else if constexpr (sizeof(_Tp) == 8) { |
| 171 | + return __builtin_bswap64(__val); |
| 172 | + } else { |
| 173 | + static_assert(sizeof(_Tp) == 0, "byteswap is unimplemented for integral types of this size"); |
| 174 | + } |
| 175 | +} |
| 176 | + |
| 177 | +#endif /* __cplusplus >= 201703L */ |
| 178 | + |
147 | 179 | //------------------------------------------------------------------------------ |
148 | 180 | // has_single_bit |
149 | 181 | //------------------------------------------------------------------------------ |
|
0 commit comments