#pragma once
#include <cstddef>
#include <format>
#include <string>
namespace vel {
enum class VelLogLevel {
Trace,
Debug,
Info,
Warn,
Error,
Critical
};
class Logger {
public:
static void init();
static void shutdown();
static void log(VelLogLevel level, const char *file, std::size_t line, const std::string &message);
template <typename... Args>
static void
log(VelLogLevel level, const char *file, std::size_t line, std::format_string<Args...> fmt, Args &&...args) {
log(level, file, line, std::format(fmt, std::forward<Args>(args)...));
}
};
} // namespace vel
#define VEL_TRACE(...) ::vel::Logger::log(::vel::VelLogLevel::Trace, __FILE__, __LINE__, __VA_ARGS__)
#define VEL_DEBUG(...) ::vel::Logger::log(::vel::VelLogLevel::Debug, __FILE__, __LINE__, __VA_ARGS__)
#define VEL_INFO(...) ::vel::Logger::log(::vel::VelLogLevel::Info, __FILE__, __LINE__, __VA_ARGS__)
#define VEL_WARN(...) ::vel::Logger::log(::vel::VelLogLevel::Warn, __FILE__, __LINE__, __VA_ARGS__)
#define VEL_ERROR(...) ::vel::Logger::log(::vel::VelLogLevel::Error, __FILE__, __LINE__, __VA_ARGS__)
#define VEL_CRITICAL(...) ::vel::Logger::log(::vel::VelLogLevel::Critical, __FILE__, __LINE__, __VA_ARGS__)
// Release-safe handle validity check
#define VEL_ASSERT_HANDLE(h, msg) \
do { \
if ((h) == 0) { \
VEL_CRITICAL(msg); \
} \
} while (false)