FZGPUModules 1.0
GPU-accelerated modular compression pipeline
Loading...
Searching...
No Matches
log.h
1#pragma once
2
39#include <cstdarg>
40#include <cstdio>
41
42namespace fz {
43
44// ── Log levels ───────────────────────────────────────────────────────────────
45
46enum class LogLevel : int {
47 TRACE = 0,
48 DEBUG = 1,
49 INFO = 2,
50 WARN = 3,
51 SILENT = 255
52};
53
54// ── Logger ───────────────────────────────────────────────────────────────────
55
56class Logger {
57public:
58 using Callback = void(*)(LogLevel level, const char* msg);
59
60 // ── Sink configuration ────────────────────────────────────────────────
61
67 static void setCallback(Callback cb) { callback() = cb; }
68
78 static void setMinLevel(LogLevel level) { minLevel() = level; }
79 static LogLevel getMinLevel() { return minLevel(); }
80
85 static void enableStderr(LogLevel min_level = LogLevel::INFO) {
86 minLevel() = min_level;
87 setCallback([](LogLevel level, const char* msg) {
88 if (level >= Logger::minLevel()) {
89 fprintf(stderr, "[fzgmod:%s] %s\n", levelTag(level), msg);
90 }
91 });
92 }
93
94 // ── Logging ───────────────────────────────────────────────────────────
95
100 static void log(LogLevel level, const char* fmt, ...) {
101 if (!callback()) return;
102 if (level < minLevel()) return;
103 char buf[1024];
104 va_list args;
105 va_start(args, fmt);
106 vsnprintf(buf, sizeof(buf), fmt, args);
107 va_end(args);
108 callback()(level, buf);
109 }
110
119 static void print(const char* fmt, ...) {
120 char buf[1024];
121 va_list args;
122 va_start(args, fmt);
123 vsnprintf(buf, sizeof(buf), fmt, args);
124 va_end(args);
125 if (callback()) {
126 callback()(LogLevel::INFO, buf);
127 } else {
128 puts(buf);
129 }
130 }
131
132 static const char* levelTag(LogLevel l) {
133 switch (l) {
134 case LogLevel::TRACE: return "TRACE";
135 case LogLevel::DEBUG: return "DEBUG";
136 case LogLevel::INFO: return "INFO";
137 case LogLevel::WARN: return "WARN";
138 default: return "???";
139 }
140 }
141
142private:
143 static Callback& callback() {
144 static Callback cb = nullptr;
145 return cb;
146 }
147 static LogLevel& minLevel() {
148 static LogLevel lvl = LogLevel::INFO;
149 return lvl;
150 }
151};
152
153} // namespace fz
154
155// ── Compile-time level gating ─────────────────────────────────────────────────
156//
157// FZ_LOG_MIN_LEVEL is set by CMake (default 2 = INFO). Log calls below this
158// level expand to ((void)0) — the compiler eliminates them entirely and their
159// arguments are never evaluated, giving true zero overhead.
160//
161// Override at the CMake level:
162// cmake -DFZ_LOG_MIN_LEVEL=0 # full TRACE logging (debug builds)
163// cmake -DFZ_LOG_MIN_LEVEL=255 # all logging compiled out (embedded)
164
165#ifndef FZ_LOG_MIN_LEVEL
166# define FZ_LOG_MIN_LEVEL 2 // INFO
167#endif
168
169// FZ_LOG_DISABLE is kept for backward compatibility; equivalent to SILENT.
170#ifdef FZ_LOG_DISABLE
171# undef FZ_LOG_MIN_LEVEL
172# define FZ_LOG_MIN_LEVEL 255
173#endif
174
186#define FZ_LOG(level, ...) \
187 do { \
188 if constexpr (static_cast<int>(::fz::LogLevel::level) >= \
189 static_cast<int>(FZ_LOG_MIN_LEVEL)) { \
190 ::fz::Logger::log(::fz::LogLevel::level, __VA_ARGS__); \
191 } \
192 } while (0)
193
203#define FZ_PRINT(...) ::fz::Logger::print(__VA_ARGS__)
Definition fzm_format.h:25
LogLevel
Definition log.h:46
@ TRACE
Per-stage execute(), per-chunk details — very verbose.
@ WARN
Unexpected but recoverable: outlier overflow, fallbacks.
@ INFO
High-level milestones: finalize, compress, decompress.
@ SILENT
Compile-time sentinel — do not pass to log()
@ DEBUG
Pipeline construction, buffer allocation, data stats.