/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: SysPanic.hpp Date: 2021-6-10 Author: Reece ***/ #pragma once namespace Aurora { AUKN_SYM bool RuntimeHasStarted(); } #if defined(_AUHAS_FMT) template static inline void AU_NORETURN SysPanic(fmt::format_string msg, T&& ... args) { if (Aurora::RuntimeHasStarted()) { Aurora::Debug::AddMemoryCrunch(); AUROXTL_COMMODITY_TRY { Aurora::Logging::WriteLinef(static_cast(Aurora::Logging::ELogLevel::eError), Aurora::Console::EAnsiColor::eBoldRed, "Fatal", msg, AuForward(args)...); } AUROXTL_COMMODITY_CATCH { } } Aurora::Debug::Panic(); } template static inline void AU_NORETURN SysPanic2(AuUInt uLineHintInNonshipBinary, fmt::format_string msg, T&& ... args) { if (Aurora::RuntimeHasStarted()) { Aurora::Debug::AddMemoryCrunch(); AUROXTL_COMMODITY_TRY { Aurora::Logging::WriteLinef(static_cast(Aurora::Logging::ELogLevel::eError), Aurora::Console::EAnsiColor::eBoldRed, "Fatal", msg, AuForward(args)...); } AUROXTL_COMMODITY_CATCH { } } Aurora::Debug::Panic2(uLineHintInNonshipBinary); } static inline AU_NORETURN void SysPanic(const char *pMsg) { SysPanic("{}", pMsg); } #endif #if defined(_AUHAS_FMT) template #endif static inline void AU_NORETURN SysPanic() { Aurora::Debug::Panic(); } #if defined(_AUHAS_FMT) template #endif static inline void AU_NORETURN SysPanic2(AuUInt uLineHintInNonshipBinary) { Aurora::Debug::Panic2(uLineHintInNonshipBinary); } static inline AU_NORETURN void SysUnreachable_(int uLineHintInNonshipBinary) { Aurora::Debug::Panic2(uLineHintInNonshipBinary); } #define SysUnreachable() SysUnreachable_(SysSafeLine)