20 #if !defined(NX_KIT_API) 32 NX_KIT_API
char pathSeparator();
34 NX_KIT_API
size_t commonPrefixSize(
const std::string& s1,
const std::string& s2);
40 NX_KIT_API
const char* relativeSrcFilename(
const char* file);
42 NX_KIT_API std::string fileBaseNameWithoutExt(
const char* file);
48 #if defined(NX_PRINT_TO_QDEBUG) 49 #define NX_DEBUG_STREAM qDebug().nospace().noquote() 51 static inline QDebug operator<<(QDebug d,
const std::string& s)
53 return d << QString::fromStdString(s);
57 #if !defined(NX_DEBUG_INI) 59 #define NX_DEBUG_INI ini(). 62 #if !defined(NX_DEBUG_ENABLE_OUTPUT) 64 #define NX_DEBUG_ENABLE_OUTPUT NX_DEBUG_INI enableOutput 67 #if !defined(NX_PRINT_PREFIX) 69 #define NX_PRINT_PREFIX ::nx::kit::debug::detail::printPrefix(__FILE__) 72 #if !defined(NX_DEBUG_STREAM) 74 #define NX_DEBUG_STREAM *::nx::kit::debug::stream() 77 #if !defined(NX_DEBUG_ENDL) 79 #define NX_DEBUG_ENDL << std::endl 86 NX_KIT_API std::ostream*& stream();
88 #if !defined(NX_PRINT) 95 ( []() { struct Endl { ~Endl() { NX_DEBUG_STREAM NX_DEBUG_ENDL; } }; \ 96 return std::make_shared<Endl>(); }() ) , \ 97 NX_DEBUG_STREAM << NX_PRINT_PREFIX 105 int NX_KIT_DEBUG_DETAIL_CONCAT(nxOutput_, __line__) = 0; \ 106 NX_KIT_DEBUG_DETAIL_CONCAT(nxOutput_, __line__) != 1 && (NX_DEBUG_ENABLE_OUTPUT); \ 107 ++NX_KIT_DEBUG_DETAIL_CONCAT(nxOutput_, __line__) \ 128 #define NX_KIT_ASSERT( ...) \ 129 NX_KIT_DEBUG_DETAIL_MSVC_EXPAND(NX_KIT_DEBUG_DETAIL_GET_3RD_ARG( \ 130 __VA_ARGS__, NX_KIT_DEBUG_DETAIL_ASSERT2, NX_KIT_DEBUG_DETAIL_ASSERT1, \ 131 args_required)(__VA_ARGS__)) 137 NX_KIT_API
void intentionallyCrash(
const char* message);
146 NX_PRINT << "####### LL line " + ::nx::kit::utils::toString(__LINE__) \ 147 + NX_KIT_DEBUG_DETAIL_THREAD_ID() \ 148 + ", file " + ::nx::kit::debug::relativeSrcFilename(__FILE__); 153 #define NX_PRINT_VALUE(VALUE) \ 154 NX_PRINT << "####### " #VALUE ": " + ::nx::kit::utils::toString(VALUE) 159 #define NX_PRINT_HEX_DUMP(CAPTION, BYTES, SIZE) \ 160 ::nx::kit::debug::detail::printHexDump( \ 161 NX_KIT_DEBUG_DETAIL_PRINT_FUNC, (CAPTION), (const char*) (BYTES), (int) (SIZE)) 166 NX_KIT_API std::string hexDumpLine(
const char* bytes,
int size,
int bytesPerLine = 0);
168 #if !defined(NX_DEBUG_SAVE_DIR) 170 #define NX_DEBUG_SAVE_DIR ::nx::kit::IniConfig::iniFilesDir() 178 #define NX_SAVE_STR(FILENAME, STR) \ 179 ::nx::kit::debug::detail::saveStr( \ 180 NX_KIT_DEBUG_DETAIL_PRINT_FUNC, (NX_DEBUG_SAVE_DIR), (FILENAME), #STR, (STR)) 185 #define NX_SAVE_BIN(FILENAME, BYTES, SIZE) \ 186 ::nx::kit::debug::detail::saveBin( \ 187 NX_KIT_DEBUG_DETAIL_PRINT_FUNC, (NX_DEBUG_SAVE_DIR), (FILENAME), (BYTES), (SIZE)) 192 #if !defined(NX_DEBUG_ENABLE_TIME) 194 #define NX_DEBUG_ENABLE_TIME NX_DEBUG_INI enableTime 200 #define NX_TIME_BEGIN(TAG) \ 201 ::nx::kit::debug::detail::Timer nxTimer_##TAG( \ 202 (NX_DEBUG_ENABLE_TIME), NX_KIT_DEBUG_DETAIL_PRINT_FUNC, #TAG) 208 #define NX_TIME_MARK(TAG, MARK) do \ 210 if (NX_DEBUG_ENABLE_TIME) \ 211 nxTimer_##TAG.mark((MARK)); \ 217 #define NX_TIME_END(TAG) do \ 219 if (NX_DEBUG_ENABLE_TIME) \ 220 nxTimer_##TAG.finish(); \ 226 #if !defined(NX_DEBUG_ENABLE_FPS) 228 #define NX_DEBUG_ENABLE_FPS NX_DEBUG_INI enableFps 235 #define NX_FPS(TAG, ...) do \ 237 if (NX_KIT_DEBUG_DETAIL_CONCAT(NX_DEBUG_ENABLE_FPS, TAG)) \ 239 static ::nx::kit::debug::detail::Fps fps( \ 240 NX_KIT_DEBUG_DETAIL_PRINT_FUNC, #TAG); \ 241 fps.mark(__VA_ARGS__); \ 250 typedef std::function<void(const char*)> PrintFunc;
252 #define NX_KIT_DEBUG_DETAIL_PRINT_FUNC ([&](const char* message) { NX_PRINT << message; }) 258 #define NX_KIT_DEBUG_DETAIL_MSVC_EXPAND(ARG) ARG 261 #define NX_KIT_DEBUG_DETAIL_GET_3RD_ARG(ARG1, ARG2, ARG3, ...) ARG3 263 #define NX_KIT_DEBUG_DETAIL_ASSERT1(CONDITION) \ 264 ::nx::kit::debug::detail::doAssert( \ 265 !!(CONDITION), NX_KIT_DEBUG_DETAIL_PRINT_FUNC, #CONDITION, "", __FILE__, __LINE__) 267 #define NX_KIT_DEBUG_DETAIL_ASSERT2(CONDITION, MESSAGE) \ 268 ::nx::kit::debug::detail::doAssert( \ 269 !!(CONDITION), NX_KIT_DEBUG_DETAIL_PRINT_FUNC, #CONDITION, MESSAGE, __FILE__, __LINE__) 271 NX_KIT_API
void assertionFailed(
272 PrintFunc printFunc,
const char* conditionStr,
const std::string& message,
273 const char* file,
int line);
275 inline bool doAssert(
276 bool condition, PrintFunc printFunc,
const char* conditionStr,
const std::string& message,
277 const char* file,
int line)
280 assertionFailed(printFunc, conditionStr, message, file, line);
284 #define NX_KIT_DEBUG_DETAIL_CONCAT(X, Y) NX_KIT_DEBUG_DETAIL_CONCAT2(X, Y) 285 #define NX_KIT_DEBUG_DETAIL_CONCAT2(X, Y) X##Y 288 NX_KIT_API std::string printPrefix(
const char* file);
293 Timer(
bool enabled, PrintFunc printFunc,
const char* tag);
295 void mark(
const char* markStr);
306 Fps(PrintFunc printFunc,
const char* tag);
308 void mark(
const char* markStr =
nullptr);
315 NX_KIT_API
void printHexDump(
316 PrintFunc printFunc,
const char* caption,
const char* bytes,
int size);
318 NX_KIT_API
void saveStr(
320 const char* originDir,
321 const char* filename,
322 const char* strCaption,
323 const std::string& str);
325 NX_KIT_API
void saveBin(
327 const char* originDir,
328 const char* filename,
338 #if defined(__linux__) 340 #define NX_KIT_DEBUG_DETAIL_THREAD_ID() \ 341 ::nx::kit::utils::format(", thread %llx", (long long) pthread_self()) 342 #elif defined(QT_CORE_LIB) 343 #include <QtCore/QThread> 344 #define NX_KIT_DEBUG_DETAIL_THREAD_ID() \ 345 ::nx::kit::utils::format(", thread %llx", (long long) QThread::currentThreadId()) 348 #define NX_KIT_DEBUG_DETAIL_THREAD_ID() ""
Definition: debug.cpp:336
Definition: debug.cpp:261
Definition: apple_utils.h:6