aboutsummaryrefslogtreecommitdiffstats
path: root/common/albit.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/albit.h')
-rw-r--r--common/albit.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/common/albit.h b/common/albit.h
index ad596208..82a4a00d 100644
--- a/common/albit.h
+++ b/common/albit.h
@@ -2,7 +2,9 @@
#define AL_BIT_H
#include <cstdint>
+#include <cstring>
#include <limits>
+#include <new>
#include <type_traits>
#if !defined(__GNUC__) && (defined(_WIN32) || defined(_WIN64))
#include <intrin.h>
@@ -10,6 +12,16 @@
namespace al {
+template<typename To, typename From>
+std::enable_if_t<sizeof(To) == sizeof(From) && std::is_trivially_copyable_v<From>
+ && std::is_trivially_copyable_v<To>,
+To> bit_cast(const From &src) noexcept
+{
+ alignas(To) char dst[sizeof(To)];
+ std::memcpy(&dst[0], &src, sizeof(To));
+ return *std::launder(reinterpret_cast<To*>(&dst[0]));
+}
+
#ifdef __BYTE_ORDER__
enum class endian {
little = __ORDER_LITTLE_ENDIAN__,