10#ifndef SEMF_UTILS_CORE_DEBUG_H_
11#define SEMF_UTILS_CORE_DEBUG_H_
20#define SEMF_DEBUG_ADD_CLASS(T, level) semf::Debug<T>::debugClass(level)
21#define SEMF_DEBUG_ADD_OBJECT(object, level) semf::debugObject<__COUNTER__>(object, level, #object)
23#define SEMF_ERROR(...) semf::internalDebug(this, semf::DebugLevel::DebuglevelError, __PRETTY_FUNCTION__, ##__VA_ARGS__)
24#define SEMF_WARNING(...) semf::internalDebug(this, semf::DebugLevel::DebuglevelWarning, __PRETTY_FUNCTION__, ##__VA_ARGS__)
25#define SEMF_INFO(...) semf::internalDebug(this, semf::DebugLevel::DebuglevelInfo, __PRETTY_FUNCTION__, ##__VA_ARGS__)
26#define SEMF_DEBUG(...) semf::internalDebug(this, semf::DebugLevel::DebuglevelDebug, __PRETTY_FUNCTION__, ##__VA_ARGS__)
27#define SEMF_TRACE(...) semf::internalDebug(this, semf::DebugLevel::DebuglevelTrace, __PRETTY_FUNCTION__, ##__VA_ARGS__)
29#define SEMF_SINGLETON_ERROR(object, ...) semf::internalDebug(object, semf::DebugLevel::DebuglevelError, __PRETTY_FUNCTION__, ##__VA_ARGS__)
30#define SEMF_SINGLETON_WARNING(object, ...) semf::internalDebug(object, semf::DebugLevel::DebuglevelWarning, __PRETTY_FUNCTION__, ##__VA_ARGS__)
31#define SEMF_SINGLETON_INFO(object, ...) semf::internalDebug(object, semf::DebugLevel::DebuglevelInfo, __PRETTY_FUNCTION__, ##__VA_ARGS__)
32#define SEMF_SINGLETON_DEBUG(object, ...) semf::internalDebug(object, semf::DebugLevel::DebuglevelDebug, __PRETTY_FUNCTION__, ##__VA_ARGS__)
33#define SEMF_SINGLETON_TRACE(object, ...) semf::internalDebug(object, semf::DebugLevel::DebuglevelTrace, __PRETTY_FUNCTION__, ##__VA_ARGS__)
36#define SEMF_DEBUG_ADD_CLASS(T, level)
37#define SEMF_DEBUG_ADD_OBJECT(object, level)
39#define SEMF_ERROR(...)
40#define SEMF_WARNING(...)
42#define SEMF_DEBUG(...)
43#define SEMF_TRACE(...)
45#define SEMF_SINGLETON_ERROR(object, ...)
46#define SEMF_SINGLETON_WARNING(object, ...)
47#define SEMF_SINGLETON_INFO(object, ...)
48#define SEMF_SINGLETON_DEBUG(object, ...)
49#define SEMF_SINGLETON_TRACE(object, ...)
119 template <
class... Args>
120 static void print(T&
object,
DebugLevel level,
const char* name,
const char* format, Args... args);
128 static const char* levelText(
DebugLevel level);
133 static bool m_debugClass;
143 bool m_isEnabled =
true;
165 m_list.pushFront(*
this);
172 m_debugClassMaxLevel = maxLevel;
178 m_isEnabled = enable;
184 setEnabled(!disable);
188template <
class... Args>
192 if (m_list.empty() && !m_debugClass)
196 for (
auto& it : m_list)
198 if (&
object == &it.m_object && level <= it.m_level && it.m_isEnabled)
200 printf(
"%s %s %s: ", name, it.m_name, levelText(level));
201 printf(format, args...);
208 if (m_debugClass && level <= m_debugClassMaxLevel)
210 printf(
"%s %s: ", name, levelText(level));
211 printf(format, args...);
244template <
class T,
class... Args>
258template <
int i,
class T>
261 static Debug<T> debugObj(
object, level, name);
Class helps debugging by publishing logging information through printf function.
Debug(T &object, DebugLevel level, const char *name)
Adds an object to the list to get printed out for debug.
static void print(T &object, DebugLevel level, const char *name, const char *format, Args... args)
Internal function - do not call directly.
void setDisabled(bool disable=true)
Enables or disables the debugger output for a specific object.
void setEnabled(bool enable=true)
Enables or disables the debugger output for a specific object.
static void debugClass(DebugLevel maxLevel)
Activates debugging for all objects of the same type with a maximum level.
LinkedList is an managed double linked list implementation.
void debugObject(T &object, DebugLevel level, const char *name)
Adds an object to the debug objects list by creating a Debugger object.
DebugLevel
Levels for differing debug messages.
void internalDebug(T *object, DebugLevel level, const char *name, const char *format, Args... args)
Passes a print message to the Debugger class.