logger.h

cross platform rendering playground

src/core/logger.h

1.88 KB
#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)