summaryrefslogtreecommitdiff
path: root/kms++util
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>2022-12-02 12:43:31 +0200
committerTomi Valkeinen <tomi.valkeinen@ideasonboard.com>2022-12-18 15:45:10 +0200
commit1b22980cb57576955423a1778ede1f7c106085e2 (patch)
tree4aba6f59f69deeb3f86e9488ade5e1a39958e725 /kms++util
parentdc8d3e0089f2382028e68cdc0fbb26ac675bf1e6 (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.h46
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);
+}