common: make BitCast constexpr

This commit is contained in:
Liam 2023-03-07 19:53:32 -05:00
parent a7792e5ff8
commit 64dcb40db1
1 changed files with 11 additions and 9 deletions

View File

@ -3,19 +3,21 @@
#pragma once #pragma once
#include <cstring> #include <version>
#include <type_traits>
#ifdef __cpp_lib_bit_cast
#include <bit>
#endif
namespace Common { namespace Common {
template <typename To, typename From> template <typename To, typename From>
[[nodiscard]] std::enable_if_t<sizeof(To) == sizeof(From) && std::is_trivially_copyable_v<From> && constexpr inline To BitCast(const From& from) {
std::is_trivially_copyable_v<To>, #ifdef __cpp_lib_bit_cast
To> return std::bit_cast<To>(from);
BitCast(const From& src) noexcept { #else
To dst; return __builtin_bit_cast(To, from);
std::memcpy(&dst, &src, sizeof(To)); #endif
return dst;
} }
} // namespace Common } // namespace Common