diff --git a/Makefile b/Makefile index 35cb47d..788f484 100644 --- a/Makefile +++ b/Makefile @@ -158,6 +158,6 @@ uninstall: cd $(INCLUDE) && find . -type f | xargs -I {} rm "$(DESTDIR)$(PREFIX)/include/{}" -rmdir $(DESTDIR)$(PREFIX)/include/$(PROJECT) -$(PROJECT)-test: lib$(PROJECT).so - $(CC) $(CFLAGS) src/test/*.c -o $@ -l:$< -Wl,-flto -Wl,-O3 $(LDFLAGS) +$(PROJECT)-test: lib$(PROJECT).a + $(CXX) $(CXXFLAGS) src/test/*.cpp -o $@ -l:$< -lfmt -Wl,-flto -Wl,-O3 $(LDFLAGS) -valgrind ./$@ diff --git a/include/trace.h b/include/trace.h index 4ee67ef..bf8f0b1 100644 --- a/include/trace.h +++ b/include/trace.h @@ -2,6 +2,14 @@ #ifndef _TRACE_H #define _TRACE_H +#ifdef __cplusplus +#ifdef _TRACE_USE_FMT +#include +#include +#endif +extern "C" { +#endif + #include #include @@ -33,5 +41,35 @@ const char* trace_name_of(enum trace_level lv); extern const char* const _TRACE_CONTROL_ENV_NAME; extern const char* const _trace_level_descriptions[_TRACE_LEVEL_NUM]; +#ifdef __cplusplus +} +#ifdef _TRACE_USE_FMT +namespace Trace { + + //TODO: How to get caller info? + template + inline constexpr void printf(const char (&msg)[N], Args&&... pack) { + if (Level >= trace_max_level()) { fmt::vprint(stderr, msg, fmt::make_format_args(std::forward(pack)...)); std::putc('\n', stderr); }; + } +#define _TRACE_L(level, name) template \ + inline constexpr void name(const char (&msg)[N], Args&&... pack) \ + { ::Trace::printf(msg, std::forward(pack)...); } + _TRACE_L(DEBUG, Debug); + _TRACE_L(DEBUG, Trace); + + _TRACE_L(INFO, Info); + _TRACE_L(WARN, Warn); + _TRACE_L(ERROR, Error); + template + [[noreturn]] + inline constexpr void Fatal(const char (&msg)[N], Args&&... pack) + { ::Trace::printf(msg, std::forward(pack)...); + ::std::terminate(); + } + +#undef _TRACE_L +} +#endif +#endif #endif /* _TRACE_H */ diff --git a/src/test/main.cpp b/src/test/main.cpp new file mode 100644 index 0000000..776fee4 --- /dev/null +++ b/src/test/main.cpp @@ -0,0 +1,12 @@ +#include + +int main() +{ + Trace::printf("hello world"); + + Trace::Info("Info"); + Trace::Warn("Warning: {}", 123); + Trace::Error("Error!: {}", "Error"); + Trace::Fatal("Fatal error: {}", "terminating"); + return 0; +}