26#ifndef MYSQL_HARNESS_STDX_BIT_H_
27#define MYSQL_HARNESS_STDX_BIT_H_
52template <std::
integral T>
54 static_assert(std::has_unique_object_representations_v<
decltype(num)>,
55 "T may not have padding bits");
57 if constexpr (
sizeof(
T) == 1) {
60 }
else if constexpr (
sizeof(
T) == 2) {
61 return __builtin_bswap16(num);
62 }
else if constexpr (
sizeof(
T) == 4) {
63 return __builtin_bswap32(num);
64 }
else if constexpr (
sizeof(
T) == 8) {
65 return __builtin_bswap64(num);
67 }
else if constexpr (
sizeof(
T) == 2) {
68 return (num & UINT16_C(0x00ff)) << (1 * 8) |
69 (num & UINT16_C(0xff00)) >> (1 * 8);
70 }
else if constexpr (
sizeof(
T) == 4) {
71 return (num & UINT32_C(0x0000'00ff)) << (3 * 8) |
72 (num & UINT32_C(0x0000'ff00)) << (1 * 8) |
73 (num & UINT32_C(0x00ff'0000)) >> (1 * 8) |
74 (num & UINT32_C(0xff00'0000)) >> (3 * 8);
75 }
else if constexpr (
sizeof(
T) == 8) {
76 return (num & UINT64_C(0x0000'0000'0000'00ff)) << (7 * 8) |
77 (num & UINT64_C(0x0000'0000'0000'ff00)) << (5 * 8) |
78 (num & UINT64_C(0x0000'0000'00ff'0000)) << (3 * 8) |
79 (num & UINT64_C(0x0000'0000'ff00'0000)) << (1 * 8) |
80 (num & UINT64_C(0x0000'00ff'0000'0000)) >> (1 * 8) |
81 (num & UINT64_C(0x0000'ff00'0000'0000)) >> (3 * 8) |
82 (num & UINT64_C(0x00ff'0000'0000'0000)) >> (5 * 8) |
83 (num & UINT64_C(0xff00'0000'0000'0000)) >> (7 * 8);
85 static_assert(
sizeof(num) == 0,
86 "byteswap not implemented for integral types of this size");
#define T
Definition: jit_executor_value.cc:373
constexpr T byteswap(T num) noexcept
Definition: bit.h:53