xtd - Reference Guide  0.1.0
Modern c++17/20 framework to create console, GUI and unit test applications on Windows, macOS, Linux, iOS and android.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
debug.h
Go to the documentation of this file.
1
4#pragma once
5#include <cstdint>
6#include <cstdlib>
7#include <mutex>
8#include "../add_last_arg_to_command.h"
9#include "../core_export.h"
10#include "../environment.h"
11#include "../static.h"
12#include "../ustring.h"
14#include "debugger.h"
15#include "stack_trace.h"
17
19namespace xtd {
21 namespace diagnostics {
23 class trace;
46 public:
49
54 static bool auto_flush();
59 static void auto_flush(bool auto_flush);
60
64 static uint32_t indent_level();
68 static void indent_level(uint32_t indent_level);
69
73 static uint32_t indent_size();
77 static void indent_size(uint32_t indent_size);
78
88 static void listeners(const listener_collection& listeners);
89
94 static bool show_assert_dialog();
99 static void show_assert_dialog(bool show_assert_dialog);
100
104 static bool use_global_lock();
108 static void use_global_lock(bool use_global_lock);
109
115 static void cassert(bool condition);
119 static void cassert(bool condition, const xtd::ustring& message);
124 static void cassert(bool condition, const xtd::ustring& message, const xtd::diagnostics::stack_frame& stack_frame);
128 static void cassert(bool condition, const xtd::diagnostics::stack_frame& stack_frame);
129
134 static void fail(const xtd::ustring& message) {
135#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
136 fail__(message);
137#endif
138 }
144 static void fail(const xtd::ustring& message, const xtd::ustring& detail_message) {
145#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
146 fail__(message, detail_message);
147#endif
148 }
149
151 static void flush() {
152#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
153 flush_();
154#endif
155 }
156
158 static void indent();
159
163 static void print(const xtd::ustring& message) {
164#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
165 write_line_(message);
166#endif
167 }
172 template<typename ...args_t>
173 static void print(const xtd::ustring& format, args_t&&... args) {
174#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
175 write_line_(xtd::ustring::format(format, args...));
176#endif
177 }
179 template<typename ...args_t>
180 static void print(const char* format, args_t&&... args) {
181#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
182 write_line_(xtd::ustring::format(format, args...));
183#endif
184 }
186
190 static void trace_error(const xtd::ustring& message) {
191#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
192 trace_event_(trace_event_type::error, message);
193#endif
194 }
199 template<typename ...objects_t>
200 static void trace_error(const xtd::ustring& message, const objects_t& ... args) {
201#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
202 trace_event_(trace_event_type::error, xtd::ustring::format(message, args...));
203#endif
204 }
205
209 static void trace_information(const xtd::ustring& message) {
210#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
211 trace_event_(trace_event_type::information, message);
212#endif
213 }
218 template<typename ...objects_t>
219 static void trace_information(const xtd::ustring& message, const objects_t& ... args) {
220#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
221 trace_event_(trace_event_type::information, xtd::ustring::format(message, args...));
222#endif
223 }
224
228 static void trace_warning(const xtd::ustring& message) {
229#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
230 trace_event_(trace_event_type::warning, message);
231#endif
232 }
237 template<typename ...objects_t>
238 static void trace_warning(const xtd::ustring& message, const objects_t& ... args) {
239#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
240 trace_event_(trace_event_type::warning, xtd::ustring::format(message, args...));
241#endif
242 }
243
245 static void unindent();
246
251 static void write(const xtd::ustring& message) {
252#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
253 write_(message);
254#endif
255 }
260 template<typename object_t>
261 static void write(const object_t& message) {
262#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
263 write_(xtd::ustring::format("", message));
264#endif
265 }
272 template<typename object_t>
273 static void write(const object_t& message, const xtd::ustring& category) {
274#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
275 write_(xtd::ustring::format("", message), category);
276#endif
277 }
283 template<typename ...args_t>
284 static void write(const xtd::ustring& format, args_t&&... args) {
285#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
286 write_(ustring::format(format, args...));
287#endif
288 }
290 template<typename ...args_t>
291 static void write(const char* format, args_t&&... args) {
292#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
293 write_(ustring::format(format, args...));
294#endif
295 }
297
303 static void write_if(bool condition, const xtd::ustring& message) {
304#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
305 if (condition) write_(message);
306#endif
307 }
308 template<typename object_t>
314 static void write_if(bool condition, const object_t& message) {
315#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
316 if (condition) write_(xtd::ustring::format("", message));
317#endif
318 }
325 template<typename object_t>
326 static void write_if(bool condition, const object_t& message, const xtd::ustring& category) {
327#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
328 if (condition) write_(xtd::ustring::format("", message), category);
329#endif
330 }
331
336 static void write_line() {
337#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
338 write_line_("");
339#endif
340 }
345 static void write_line(const xtd::ustring& message) {
346#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
347 write_line_(message);
348#endif
349 }
354 template<typename object_t>
355 static void write_line(const object_t& message) {
356#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
357 write_line_(xtd::ustring::format("", message));
358#endif
359 }
366 template<typename object_t>
367 static void write_line(const object_t& message, const xtd::ustring& category) {
368#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
369 write_line_(xtd::ustring::format("", message), category);
370#endif
371 }
376 template<typename ...args_t>
377 static void write_line(const xtd::ustring& format, args_t&&... args) {
378#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
379 write_line_(ustring::format(format, args...));
380#endif
381 }
383 template<typename ...args_t>
384 static void write_line(const char* format, args_t&&... args) {
385#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
386 write_line_(ustring::format(format, args...));
387#endif
388 }
390
396 static void write_line_if(bool condition, const xtd::ustring& message) {
397#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
398 if (condition) write_line_(message);
399#endif
400 }
406 template<typename object_t>
407 static void write_line_if(bool condition, const object_t& message) {
408#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
409 if (condition) write_line_(message);
410#endif
411 }
418 template<typename object_t>
419 static void write_line_if(bool condition, const object_t& message, const xtd::ustring& category) {
420#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
421 if (condition) write_line_(message, category);
422#endif
423 }
424
426 static inline bool __should_aborted__(bool condition) {return __should_aborted__(condition, "", csf_);}
427 static inline bool __should_aborted__(bool condition, const xtd::ustring& message) {return __should_aborted__(condition, message, csf_);}
428 static inline bool __should_aborted__(bool condition, const xtd::diagnostics::stack_frame& stack_frame) {return __should_aborted__(condition, "", stack_frame);}
429 static inline bool __should_aborted__(bool condition, const xtd::ustring& message, const xtd::diagnostics::stack_frame& stack_frame) {
430#if !defined(NDEBUG) || defined(DEBUG) || defined(TRACE)
431 auto result = xtd::diagnostics::debug::assert_dialog(condition, message, stack_frame);
433 if (result == xtd::diagnostics::assert_dialog_result::retry) return true;
434#endif
435 return false;
436 }
438
439 private:
440 friend trace;
441 static xtd::diagnostics::assert_dialog_result assert_dialog(bool condition, const xtd::ustring& message, const xtd::diagnostics::stack_frame& stack_frame);
442 static void fail__(const xtd::ustring& message);
443 static void fail__(const xtd::ustring& message, const xtd::ustring& detail_message);
444 static void flush_();
445 static void trace_event_(trace_event_type trace_event_type, const xtd::ustring& message);
446 static void write_(const xtd::ustring& message);
447 static void write_(const xtd::ustring& message, const xtd::ustring& category);
448 static void write_line_(const xtd::ustring& message);
449 static void write_line_(const xtd::ustring& message, const xtd::ustring& category);
450
451 inline static bool auto_flush_ = false;
452 inline static unsigned int indent_level_ = 0;
453 inline static unsigned int indent_size_ = 4;
454 static listener_collection& listeners_;
455 static bool& show_assert_dialog_;
456 inline static bool use_global_lock_ = true;
457 static std::mutex global_lock_;
458 static xtd::ustring source_name_;
459 };
460 }
461}
462
479#define cassert_(...) \
480 add_last_arg_to_command_(cassert, (csf_), __VA_ARGS__)
481
494#define assert_(...) \
495 if (xtd::diagnostics::debug::add_last_arg_to_command_(__should_aborted__, (csf_), __VA_ARGS__)) debug_break_()
Contains xtd::diagnostics::assert_dialog_result enum class.
Provides a set of methods and properties that help you debug the execution of your code....
Definition: debug.h:45
static void write_if(bool condition, const xtd::ustring &message)
Writes a message to the trace listeners in the Listeners collection if a condition is true.
Definition: debug.h:303
static bool show_assert_dialog()
Gets a value indicating whether the assert dialog should be show.
static void write_line(const object_t &message, const xtd::ustring &category)
Writes a category name and message followed by a line terminator to the trace listeners in the listen...
Definition: debug.h:367
static void trace_information(const xtd::ustring &message)
Writes an informational message to the trace listeners in the listeners collection using the specifie...
Definition: debug.h:209
static uint32_t indent_level()
Gets the indent level.
static void indent()
Increases the current indent_level by one.
static void write_line_if(bool condition, const xtd::ustring &message)
Writes a message followed by a line terminator to the trace listeners in the Listeners collection if ...
Definition: debug.h:396
static void cassert(bool condition, const xtd::ustring &message)
Checks for a condition; if the condition is false, displays a message box that shows the call stack.
static void write_line_if(bool condition, const object_t &message, const xtd::ustring &category)
Writes a category name and message followed by a line terminator to the trace listeners in the Listen...
Definition: debug.h:419
static void fail(const xtd::ustring &message)
Emits the specified error message.
Definition: debug.h:134
static void print(const xtd::ustring &format, args_t &&... args)
Writes a formatted string followed by a line terminator to the trace listeners in the listeners colle...
Definition: debug.h:173
static void write_line()
Writes a line terminator to the trace listeners in the listeners collection.
Definition: debug.h:336
static void trace_error(const xtd::ustring &message)
Writes an error message to the trace listeners in the Listeners collection using the specified messag...
Definition: debug.h:190
static void listeners(const listener_collection &listeners)
Sets the collection of listeners that is monitoring the trace output. @paral$m listeners A xtd::diagn...
static void trace_information(const xtd::ustring &message, const objects_t &... args)
Writes an informational message to the trace listeners in the listeners collection using the specifie...
Definition: debug.h:219
static void write(const xtd::ustring &message)
Writes a message to the trace listeners in the listeners collection.
Definition: debug.h:251
static void indent_level(uint32_t indent_level)
Sets the indent level.
static void write_line_if(bool condition, const object_t &message)
Writes a message followed by a line terminator to the trace listeners in the Listeners collection if ...
Definition: debug.h:407
static void write_line(const object_t &message)
Writes a message followed by a line terminator to the trace listeners in the listeners collection.
Definition: debug.h:355
static listener_collection & listeners()
Gets the collection of listeners that is monitoring the trace output.
static void show_assert_dialog(bool show_assert_dialog)
Sets a value indicating whether the assert dialog should be show.
static void write(const xtd::ustring &format, args_t &&... args)
Writes a formatted string to the trace listeners in the listeners collection.
Definition: debug.h:284
static void trace_warning(const xtd::ustring &message, const objects_t &... args)
Writes a warning message to the trace listeners in the listeners collection using the specified array...
Definition: debug.h:238
static void write_if(bool condition, const object_t &message, const xtd::ustring &category)
Writes a category name and message to the trace listeners in the Listeners collection if a condition ...
Definition: debug.h:326
static void auto_flush(bool auto_flush)
Sets whether xtd::diagnostics::debug::flush should be called on the xtd::diagnostics::debug::Listener...
static uint32_t indent_size()
Gets the number of spaces in an indent.
static bool use_global_lock()
Gets a value indicating whether the global lock should be used.
static void trace_warning(const xtd::ustring &message)
Writes a warning message to the trace listeners in the listeners collection using the specified messa...
Definition: debug.h:228
static void unindent()
Decreases the current indent_level by one.
static void write_if(bool condition, const object_t &message)
Writes a message to the trace listeners in the Listeners collection if a condition is true.
Definition: debug.h:314
static void indent_size(uint32_t indent_size)
Sets the number of spaces in an indent.
static bool auto_flush()
Gets whether xtd::diagnostics::debug::flush should be called on the xtd::diagnostics::debug::Listener...
static void write_line(const xtd::ustring &format, args_t &&... args)
Writes a formatted string followed by a line terminator to the trace listeners in the listeners colle...
Definition: debug.h:377
static void write(const object_t &message, const xtd::ustring &category)
Writes a category name and message to the trace listeners in the listeners collection.
Definition: debug.h:273
static void write_line(const xtd::ustring &message)
Writes a message followed by a line terminator to the trace listeners in the listeners collection.
Definition: debug.h:345
static void cassert(bool condition)
Checks for a condition; if the condition is false, displays a message box that shows the call stack.
static void write(const object_t &message)
Writes a message to the trace listeners in the listeners collection.
Definition: debug.h:261
static void flush()
Flushes the output buffer and causes buffered data to write to the listeners collection.
Definition: debug.h:151
static void trace_error(const xtd::ustring &message, const objects_t &... args)
Writes an error message to the trace listeners in the listeners collection using the specified array ...
Definition: debug.h:200
static void cassert(bool condition, const xtd::ustring &message, const xtd::diagnostics::stack_frame &stack_frame)
Checks for a condition; if the condition is false, displays a message box that shows the call stack.
static void cassert(bool condition, const xtd::diagnostics::stack_frame &stack_frame)
Checks for a condition; if the condition is false, displays a message box that shows the call stack.
static void fail(const xtd::ustring &message, const xtd::ustring &detail_message)
Emits an error message and a detailed error message.
Definition: debug.h:144
static void print(const xtd::ustring &message)
Writes a message followed by a line terminator to the trace listeners in the listeners collection.
Definition: debug.h:163
static void use_global_lock(bool use_global_lock)
Sets a value indicating whether the global lock should be used.
Provides information about a xtd::diagnostics::stack_frame, which represents a function call on the c...
Definition: stack_frame.h:29
Represents a collection of xtd::diagnostics::trace_listener.
Definition: trace_listener_collection.h:19
static void exit(int exit_code)
Terminates this process and returns an exit code to the operating system.
Definition: environment.h:321
Represents text as a sequence of UTF-8 code units.
Definition: ustring.h:48
Contains xtd::diagnostics::debugger class.
static ustring format(const ustring &fmt, args_t &&... args)
Writes the text representation of the specified arguments list, to string using the specified format ...
Definition: ustring.h:689
#define static_
This keyword is use to represent a static object. A static object can't be instantiated (constructors...
Definition: static.h:38
#define core_export_
Define shared library export.
Definition: core_export.h:13
#define csf_
Provides information about the current stack frame.
Definition: stack_frame.h:213
assert_dialog_result
Specifies identifiers to indicate the return value of an assert dialog box.
Definition: assert_dialog_result.h:18
@ retry
The assert dialog return value is Retry (usually sent from a button labeled Retry).
@ abort
The assert dialog return value is Abort (usually sent from a button labeled Abort).
@ print
The PRINT key.
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition: system_report.h:17
Contains xtd::diagnostics::stack_trace class.
Contains xtd::diagnostics::trace_listener_collection class.