diff options
| author | Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com> | 2022-12-02 12:43:31 +0200 |
|---|---|---|
| committer | Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> | 2022-12-18 15:45:10 +0200 |
| commit | 1b22980cb57576955423a1778ede1f7c106085e2 (patch) | |
| tree | 4aba6f59f69deeb3f86e9488ade5e1a39958e725 /kms++util | |
| parent | dc8d3e0089f2382028e68cdc0fbb26ac675bf1e6 (diff) | |
kms++util: Add endian.h
Add simple endianness supporting write function, and, for now, only one
shortcut helper, write16le().
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Diffstat (limited to 'kms++util')
| -rw-r--r-- | kms++util/inc/kms++util/endian.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/kms++util/inc/kms++util/endian.h b/kms++util/inc/kms++util/endian.h new file mode 100644 index 0000000..0f7aecd --- /dev/null +++ b/kms++util/inc/kms++util/endian.h @@ -0,0 +1,46 @@ +#pragma once + +#include <type_traits> +#include <byteswap.h> +#include <stdint.h> + +static_assert((__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || + (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__), + "Unable to detect endianness"); + +enum class endian { + little = __ORDER_LITTLE_ENDIAN__, + big = __ORDER_BIG_ENDIAN__, + native = __BYTE_ORDER__ +}; + +template<typename T> +constexpr T byteswap(T value) noexcept +{ + static_assert(std::is_integral<T>(), "Type is not integral"); + static_assert(sizeof(T) == 2 || + sizeof(T) == 4 || + sizeof(T) == 8, + "Illegal value size"); + + switch (sizeof(T)) { + case 2: return bswap_16(value); + case 4: return bswap_32(value); + case 8: return bswap_64(value); + } +} + +template<endian E, typename T> +static void write_endian(T* dst, T val) +{ + if constexpr (E != endian::native) + val = byteswap(val); + + *dst = val; +} + +[[maybe_unused]] +static void write16le(uint16_t* dst, uint16_t val) +{ + write_endian<endian::little, uint16_t>(dst, val); +} |
