#pragma once #include #include #include "openvic-dataloader/detail/utility/TypeName.hpp" namespace ovdl::detail { [[noreturn]] inline void unreachable() { // Uses compiler specific extensions if possible. // Even if no extension is used, undefined behavior is still raised by // an empty function body and the noreturn attribute. #ifdef __GNUC__ // GCC, Clang, ICC __builtin_unreachable(); #elif defined(_MSC_VER) // MSVC __assume(false); #endif } template constexpr std::string_view get_kind_name() { constexpr auto name = type_name(); return name; } template requires std::is_enum_v constexpr std::underlying_type_t to_underlying(EnumT e) { return static_cast>(e); } template requires std::is_enum_v constexpr EnumT from_underlying(std::underlying_type_t ut) { return static_cast(ut); } }