2023-08-19 12:30:46 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
2025-11-27 01:50:45 +01:00
|
|
|
#include <type_traits>
|
|
|
|
|
|
2023-08-19 12:30:46 +02:00
|
|
|
namespace utils
|
|
|
|
|
{
|
|
|
|
|
// Hack. Pointer cast util to workaround UB. Use with extreme care.
|
2025-11-27 01:50:45 +01:00
|
|
|
template <typename T, typename U> requires (std::is_pointer_v<std::remove_reference_t<U>>)
|
|
|
|
|
[[nodiscard]] inline T* bless(const U& ptr)
|
2023-08-19 12:30:46 +02:00
|
|
|
{
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
|
return (T*)ptr;
|
|
|
|
|
#elif defined(ARCH_X64)
|
|
|
|
|
T* result;
|
|
|
|
|
__asm__("movq %1, %0;" : "=r" (result) : "r" (ptr) : "memory");
|
|
|
|
|
return result;
|
|
|
|
|
#elif defined(ARCH_ARM64)
|
|
|
|
|
T* result;
|
|
|
|
|
__asm__("mov %0, %1" : "=r" (result) : "r" (ptr) : "memory");
|
|
|
|
|
return result;
|
2025-06-01 20:45:05 +02:00
|
|
|
#else
|
|
|
|
|
#error "Missing utils::bless() implementation"
|
2023-08-19 12:30:46 +02:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-11-27 01:50:45 +01:00
|
|
|
|