Elementa v8.0.0
Minimalistic library for any C++ application (C++11 and up)
Loading...
Searching...
No Matches
debugging.h
Go to the documentation of this file.
1
3#include "elementa/license.inc"
4#include "elementa/checks.inc"
5
6#ifndef ELEMENTA_BASE_DEBUGGING_H
7#define ELEMENTA_BASE_DEBUGGING_H
8
9#include <string>
10#include <iostream>
11#include <sstream>
12#include "elementa/base/enums.h"
14
15namespace elementa
16{
17
18namespace base
19{
20
137/* ====================================================================== */
138
142/* ========================================================================= */
143
144
145#ifdef ELE_MAKE_PRODUCTION
146 #undef ELE_PRE_TRACED
147#endif
148
149/* ****************************************************************************
150
151 Const expression: kHiddenPlaceMsg
152 Macros: ELE_PRE_FILELONGNAME, ELE_PRE_FILEBASENAME,
153 ELE_CODE_PLACE, ELE_CODE_LONGPLACE
154
155******************************************************************************/
156
158constexpr char kHiddenPlaceMsg[] = "place hidden in production";
159
160#ifdef ELE_MAKE_PRODUCTION
161
163 #define ELE_PRE_FILELONGNAME std::string{elementa::base::kHiddenPlaceMsg}
164
166 #define ELE_PRE_FILEBASENAME std::string{elementa::base::kHiddenPlaceMsg}
167
168#else
169
171 #define ELE_PRE_FILELONGNAME std::string{__FILE__}
172
174 #define ELE_PRE_FILEBASENAME (std::string{__FILE__}.rfind('/') >= \
175 std::string{__FILE__}.size()-1 ? \
176 std::string{__FILE__} : \
177 std::string{__FILE__}.substr(\
178 std::string{__FILE__}.rfind('/')+1) )
179#endif
180
182
194#define ELE_CODE_PLACE (ELE_PRE_FILEBASENAME + ":" + std::string{__func__} + \
195 ":" + std::to_string(__LINE__) )
196
198
199#define ELE_CODE_LONGPLACE (ELE_PRE_FILELONGNAME + ":" +std::string{__func__} +\
200 ":" + std::to_string(__LINE__) )
201
202
203/* ****************************************************************************
204
205 Function: runtime_src_place
206
207******************************************************************************/
208
210
214ELE_CLASS_ENUM(RTTextWith,
215 kTime,
216 kThread);
217
219
232std::string runtime_src_place(const std::string & place,
233 const RTTextWithEnum::Combination & flags = {},
234 const std::string & placepreff = "Place:",
235 const std::string & timepreff = "Time:",
236 const std::string & threadpreff = "Thread:");
237
240/* ========================================================================= */
241
245/* ========================================================================= */
246
247/* ***************************************************************************
248
249 Macros for enabling/disabling traces
250
251*****************************************************************************/
252
253#ifdef ELE_PRE_TRACED
254
256
257 #define ELE_CODE_TRACE_ON constexpr bool kTraceOn_ = true
258
260
261 #define ELE_CODE_TRACE_OFF constexpr bool kTraceOn_ = false
262
264
267 #define ELE_CODE_TRACE_IF if (kTraceOn_) {
268
270 #define ELE_CODE_TRACE_ELSE } else {
271
273 #define ELE_CODE_TRACE_ENDIF }
274
275#else
276
278
279 #define ELE_CODE_TRACE_ON
280
282
283 #define ELE_CODE_TRACE_OFF
284
286
289 #define ELE_CODE_TRACE_IF if (false) {
290
292 #define ELE_CODE_TRACE_ELSE } else {
293
295 #define ELE_CODE_TRACE_ENDIF }
296
297
298#endif
299
300/* **************************************************************************
301
302 Macro: TRACE
303
304*****************************************************************************/
305
307#define ELE_PRE_TRACE_PREFFIX "--- TR : "
308
309#ifdef ELE_PRE_TRACED
310
311 #if ELE_PRE_CPPVER == 2017
312 // C++17; supports if-constexpr and generates no code if traces off
313
315 #define ELE_CODE_TRACE(flags,...) {\
316 if constexpr(kTraceOn_)\
317 {\
318 std::cout << ELE_PRE_TRACE_PREFFIX \
319 << "[" << \
320 elementa::base::runtime_src_place(\
321 ELE_CODE_PLACE,\
322 flags) << \
323 "]. " << __VA_ARGS__ << \
324 std::endl;\
325 }\
326 }
327
329 #define ELE_CODE_TRACEPOINT {\
330 if constexpr(kTraceOn_)\
331 {\
332 std::cout << ELE_PRE_TRACE_PREFFIX \
333 << "[TRACEPOINT - " << \
334 elementa::base::runtime_src_place(\
335 ELE_CODE_PLACE,\
336 {}) << \
337 "]." << \
338 std::endl;\
339 }\
340 }
341
343 #define ELE_CODE_TRACENUDE(...) {\
344 if constexpr(kTraceOn_)\
345 {\
346 std::cout << __VA_ARGS__; \
347 }\
348 }
349
351 #define ELE_CODE_PAUSE(flags,...) {\
352 if constexpr(kTraceOn_)\
353 {\
354 std::cout << ELE_PRE_TRACE_PREFFIX \
355 << "[" << \
356 elementa::base::runtime_src_place(\
357 ELE_CODE_PLACE,\
358 flags) << \
359 "]. " << __VA_ARGS__ << \
360 ".\n----> Enter a number to " << \
361 "go on: ";\
362 int x;\
363 std::cin >> x;\
364 }\
365 }
366
367 #else
368
370 #define ELE_CODE_TRACE(flags,...) {\
371 if (kTraceOn_) \
372 {\
373 std::cout << ELE_PRE_TRACE_PREFFIX \
374 << "[" << \
375 elementa::base::runtime_src_place(\
376 ELE_CODE_PLACE,\
377 flags) << \
378 "]. " << __VA_ARGS__ << \
379 std::endl;\
380 }\
381 }
382
384 #define ELE_CODE_TRACEPOINT {\
385 if (kTraceOn_) \
386 {\
387 std::cout << ELE_PRE_TRACE_PREFFIX \
388 << "[TRACEPOINT - " << \
389 elementa::base::runtime_src_place(\
390 ELE_CODE_PLACE,\
391 {}) << \
392 "]." << \
393 std::endl;\
394 }\
395 }
396
398 #define ELE_CODE_TRACENUDE(...) {\
399 if constexpr(kTraceOn_)\
400 {\
401 std::cout << __VA_ARGS__; \
402 }\
403 }
404
406 #define ELE_CODE_PAUSE(flags,...) {\
407 if (kTraceOn_) \
408 {\
409 std::cout << ELE_PRE_TRACE_PREFFIX \
410 << "[" << \
411 elementa::base::runtime_src_place(\
412 ELE_CODE_PLACE,\
413 flags) << \
414 "]. " << __VA_ARGS__ << \
415 ".\n----> Enter a number to " << \
416 "go on: ";\
417 int x;\
418 std::cin >> x;\
419 }\
420 }
421
422 #endif
423
424#else
425
426 #define ELE_CODE_TRACE(flags,...) {}
427
428 #define ELE_CODE_TRACEPOINT {}
429
430 #define ELE_CODE_TRACENUDE(...) {}
431
432 #define ELE_CODE_PAUSE(flags,...) {}
433
434#endif
435
437#define ELE_CODE_UNTRACE(flags,...)
438
440#define ELE_CODE_UNTRACEPOINT
441
443#define ELE_CODE_UNPAUSE(flags,...)
444
446
448#define ELE_CODE_UNTRACE_IF if (false) {
449
451#define ELE_CODE_UNTRACE_ELSE } else {
452
454#define ELE_CODE_UNTRACE_ENDIF }
455
456 // Debugging
462
463
464} // end namespace base
465
466} // end namespace elementa
467
468#endif
469
std::string runtime_src_place(const std::string &place, const RTTextWithEnum::Combination &flags={}, const std::string &placepreff="Place:", const std::string &timepreff="Time:", const std::string &threadpreff="Thread:")
Return a string with info about a place, time and thread during execution.
constexpr char kHiddenPlaceMsg[]
Constant text hiding runtime place when the program is in production.
Definition: debugging.h:158
#define ELE_CLASS_ENUM(NameEnumClass,...)
Define an extended enum type.
Definition: enums.h:502