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.
Loading...
Searching...
No Matches
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.