semf
debug.h
Go to the documentation of this file.
1
10#ifndef SEMF_UTILS_CORE_DEBUG_H_
11#define SEMF_UTILS_CORE_DEBUG_H_
12
14#include <stdio.h>
15#include <stdarg.h>
16#include <stdlib.h>
17
18#ifdef USE_SEMF_DEBUG
19
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)
22
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__)
28
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__)
34
35#else
36#define SEMF_DEBUG_ADD_CLASS(T, level)
37#define SEMF_DEBUG_ADD_OBJECT(object, level)
38
39#define SEMF_ERROR(...)
40#define SEMF_WARNING(...)
41#define SEMF_INFO(...)
42#define SEMF_DEBUG(...)
43#define SEMF_TRACE(...)
44
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, ...)
50#endif // USE_SEMF_DEBUG
51
52namespace semf
53{
55enum class DebugLevel
56{
69};
70
80template <class T>
81class Debug : public LinkedList<Debug<T>>::Node
82{
83public:
90 Debug(T& object, DebugLevel level, const char* name);
91 virtual ~Debug() = default;
92
97 static void debugClass(DebugLevel maxLevel);
102 void setEnabled(bool enable = true);
107 void setDisabled(bool disable = true);
119 template <class... Args>
120 static void print(T& object, DebugLevel level, const char* name, const char* format, Args... args);
121
122private:
128 static const char* levelText(DebugLevel level);
129
131 static LinkedList<Debug<T>> m_list;
133 static bool m_debugClass;
135 static DebugLevel m_debugClassMaxLevel;
137 T& m_object;
139 DebugLevel m_level;
141 const char* m_name;
143 bool m_isEnabled = true;
144};
145
146template <class T>
148
149template <class T>
150#ifdef SEMF_DEBUG_ALL
151bool Debug<T>::m_debugClass = true;
152#else
153bool Debug<T>::m_debugClass = false;
154#endif
155
156template <class T>
158
159template <class T>
160Debug<T>::Debug(T& object, DebugLevel level, const char* name)
161: m_object(object),
162 m_level(level),
163 m_name(name)
164{
165 m_list.pushFront(*this);
166}
167
168template <class T>
170{
171 m_debugClass = true;
172 m_debugClassMaxLevel = maxLevel;
173}
174
175template <class T>
176void Debug<T>::setEnabled(bool enable)
177{
178 m_isEnabled = enable;
179}
180
181template <class T>
182void Debug<T>::setDisabled(bool disable)
183{
184 setEnabled(!disable);
185}
186
187template <class T>
188template <class... Args>
189void Debug<T>::print(T& object, DebugLevel level, const char* name, const char* format, Args... args)
190{
191 // Returning for nothing to debug
192 if (m_list.empty() && !m_debugClass)
193 return;
194
195 // Checking all registered objects
196 for (auto& it : m_list)
197 {
198 if (&object == &it.m_object && level <= it.m_level && it.m_isEnabled)
199 {
200 printf("%s %s %s: ", name, it.m_name, levelText(level));
201 printf(format, args...);
202 printf("\n");
203 return;
204 }
205 }
206
207 // Checking whole class debug settings
208 if (m_debugClass && level <= m_debugClassMaxLevel)
209 {
210 printf("%s %s: ", name, levelText(level));
211 printf(format, args...);
212 printf("\n");
213 }
214}
215
216template <class T>
217const char* Debug<T>::levelText(DebugLevel level)
218{
219 switch (level)
220 {
222 return "(e)";
224 return "(w)";
226 return "(i)";
228 return "(d)";
230 default:
231 return "(t)";
232 }
233}
234
244template <class T, class... Args>
245void internalDebug(T* object, DebugLevel level, const char* name, const char* format, Args... args)
246{
247 Debug<T>::print(*object, level, name, format, args...);
248}
249
258template <int i, class T>
259void debugObject(T& object, DebugLevel level, const char* name)
260{
261 static Debug<T> debugObj(object, level, name);
262}
263} // namespace semf
264#endif /* SEMF_UTILS_CORE_DEBUG_H_ */
Class helps debugging by publishing logging information through printf function.
Definition: debug.h:82
virtual ~Debug()=default
Debug(T &object, DebugLevel level, const char *name)
Adds an object to the list to get printed out for debug.
Definition: debug.h:160
static void print(T &object, DebugLevel level, const char *name, const char *format, Args... args)
Internal function - do not call directly.
Definition: debug.h:189
void setDisabled(bool disable=true)
Enables or disables the debugger output for a specific object.
Definition: debug.h:182
void setEnabled(bool enable=true)
Enables or disables the debugger output for a specific object.
Definition: debug.h:176
static void debugClass(DebugLevel maxLevel)
Activates debugging for all objects of the same type with a maximum level.
Definition: debug.h:169
LinkedList is an managed double linked list implementation.
Definition: linkedlist.h:43
void debugObject(T &object, DebugLevel level, const char *name)
Adds an object to the debug objects list by creating a Debugger object.
Definition: debug.h:259
DebugLevel
Levels for differing debug messages.
Definition: debug.h:56
void internalDebug(T *object, DebugLevel level, const char *name, const char *format, Args... args)
Passes a print message to the Debugger class.
Definition: debug.h:245