13 #include <type_traits>
15 #if __cpp_lib_bit_cast
22 template <
typename To,
typename From>
23 #if __cpp_lib_bit_cast || __has_builtin(__builtin_bit_cast)
28 static_assert(
sizeof(To) ==
sizeof(From),
29 "Sizes of To and From must be equal");
30 static_assert(std::is_trivially_copyable<From>::value,
31 "From must be trivially copyable");
32 static_assert(std::is_trivially_copyable<To>::value,
33 "To must be trivially copyable");
34 #if __cpp_lib_bit_cast
35 return std::bit_cast<To>(from);
36 #else // __cpp_lib_bit_cast
38 #if __has_builtin(__builtin_bit_cast)
39 return __builtin_bit_cast(To, from);
40 #else // __has_builtin(__builtin_bit_cast)
41 static_assert(std::is_trivially_default_constructible<To>::value,
42 "To must be trivially default constructible");
46 #endif // __has_builtin(__builtin_bit_cast)
48 #endif // __cpp_lib_bit_cast
52 template <
typename To,
typename From>
54 #if __cpp_lib_bit_cast || __has_builtin(__builtin_bit_cast)
58 return sycl::bit_cast<To>(from);