#pragma once #include #include #include namespace Log { // Our logger class template class Logger { public: Logger(std::string prepend = "") : prepend(prepend) {} std::string prepend; void log(const char* fmt, ...) { if constexpr (!enabled) return; std::fputs(prepend.c_str(), stdout); std::va_list args; va_start(args, fmt); std::vprintf(fmt, args); va_end(args); } }; // Our loggers here. Enable/disable by toggling the template param static auto cpuTraceLogger = Logger("[CPU TRACE] "); static auto dmaLogger = Logger ("[ DMA ] "); static auto gpuLogger = Logger("[ GPU ] "); static auto cdromLogger = Logger ("[ CDROM ] "); #define MAKE_LOG_FUNCTION(functionName, logger) \ template \ void functionName(const char* fmt, Args... args) { \ Log::logger.log(fmt, args...); \ } }