Files
UE5-cyberHuman/Plugins/AzSpeech/Source/ThirdParty/AzureWrapper/include/c_api/spxdebug.h
2025-04-07 18:31:41 -07:00

549 lines
25 KiB
C

//
// Copyright (c) Microsoft. All rights reserved.
// See https://aka.ms/csspeech/license for the full license information.
//
// spxdebug.h: Public API definitions for global C Trace/Debug methods and related #defines
//
#pragma once
//-------------------------------------------------------
// Re-enabled ability to compile out all macros...
// However, currently still need to keep all macros until
// final review of all macros is complete.
//-------------------------------------------------------
#define SPX_CONFIG_TRACE_INCLUDE_DBG_WITH_ALL 1
#ifdef SPX_CONFIG_TRACE_INCLUDE_DBG_WITH_ALL
#if defined(SPX_CONFIG_TRACE_ALL) && !defined(SPX_CONFIG_DBG_TRACE_ALL) && (!defined(DEBUG) || !defined(_DEBUG))
#define SPX_CONFIG_DBG_TRACE_ALL 1
#endif
#endif
//-------------------------------------------------------
// SPX_ and AZAC_ compatibility section
// (must preceed #include <azac_debug.h>)
//-------------------------------------------------------
#if defined(SPX_CONFIG_DBG_TRACE_ALL) && !defined(AZAC_CONFIG_DBG_TRACE_ALL)
#define AZAC_CONFIG_DBG_TRACE_ALL SPX_CONFIG_DBG_TRACE_ALL
#elif !defined(SPX_CONFIG_DBG_TRACE_ALL) && defined(AZAC_CONFIG_DBG_TRACE_ALL)
#define SPX_CONFIG_DBG_TRACE_ALL AZAC_CONFIG_DBG_TRACE_ALL
#endif
#if defined(SPX_CONFIG_DBG_TRACE_VERBOSE) && !defined(AZAC_CONFIG_DBG_TRACE_VERBOSE)
#define AZAC_CONFIG_DBG_TRACE_VERBOSE SPX_CONFIG_DBG_TRACE_VERBOSE
#elif !defined(SPX_CONFIG_DBG_TRACE_VERBOSE) && defined(AZAC_CONFIG_DBG_TRACE_VERBOSE)
#define SPX_CONFIG_DBG_TRACE_VERBOSE AZAC_CONFIG_DBG_TRACE_VERBOSE
#endif
#if defined(SPX_CONFIG_DBG_TRACE_INFO) && !defined(AZAC_CONFIG_DBG_TRACE_INFO)
#define AZAC_CONFIG_DBG_TRACE_INFO SPX_CONFIG_DBG_TRACE_INFO
#elif !defined(SPX_CONFIG_DBG_TRACE_INFO) && defined(AZAC_CONFIG_DBG_TRACE_INFO)
#define SPX_CONFIG_DBG_TRACE_INFO AZAC_CONFIG_DBG_TRACE_INFO
#endif
#if defined(SPX_CONFIG_DBG_TRACE_WARNING) && !defined(AZAC_CONFIG_DBG_TRACE_WARNING)
#define AZAC_CONFIG_DBG_TRACE_WARNING SPX_CONFIG_DBG_TRACE_WARNING
#elif !defined(SPX_CONFIG_DBG_TRACE_WARNING) && defined(AZAC_CONFIG_DBG_TRACE_WARNING)
#define SPX_CONFIG_DBG_TRACE_WARNING AZAC_CONFIG_DBG_TRACE_WARNING
#endif
#if defined(SPX_CONFIG_DBG_TRACE_ERROR) && !defined(AZAC_CONFIG_DBG_TRACE_ERROR)
#define AZAC_CONFIG_DBG_TRACE_ERROR SPX_CONFIG_DBG_TRACE_ERROR
#elif !defined(SPX_CONFIG_DBG_TRACE_ERROR) && defined(AZAC_CONFIG_DBG_TRACE_ERROR)
#define SPX_CONFIG_DBG_TRACE_ERROR AZAC_CONFIG_DBG_TRACE_ERROR
#endif
#if defined(SPX_CONFIG_DBG_TRACE_FUNCTION) && !defined(AZAC_CONFIG_DBG_TRACE_FUNCTION)
#define AZAC_CONFIG_DBG_TRACE_FUNCTION SPX_CONFIG_DBG_TRACE_FUNCTION
#elif !defined(SPX_CONFIG_DBG_TRACE_FUNCTION) && defined(AZAC_CONFIG_DBG_TRACE_FUNCTION)
#define SPX_CONFIG_DBG_TRACE_FUNCTION AZAC_CONFIG_DBG_TRACE_FUNCTION
#endif
#if defined(SPX_CONFIG_DBG_TRACE_SCOPE) && !defined(AZAC_CONFIG_DBG_TRACE_SCOPE)
#define AZAC_CONFIG_DBG_TRACE_SCOPE SPX_CONFIG_DBG_TRACE_SCOPE
#elif !defined(SPX_CONFIG_DBG_TRACE_SCOPE) && defined(AZAC_CONFIG_DBG_TRACE_SCOPE)
#define SPX_CONFIG_DBG_TRACE_SCOPE AZAC_CONFIG_DBG_TRACE_SCOPE
#endif
#if defined(SPX_CONFIG_DBG_TRACE_ASSERT) && !defined(AZAC_CONFIG_DBG_TRACE_ASSERT)
#define AZAC_CONFIG_DBG_TRACE_ASSERT SPX_CONFIG_DBG_TRACE_ASSERT
#elif !defined(SPX_CONFIG_DBG_TRACE_ASSERT) && defined(AZAC_CONFIG_DBG_TRACE_ASSERT)
#define SPX_CONFIG_DBG_TRACE_ASSERT AZAC_CONFIG_DBG_TRACE_ASSERT
#endif
#if defined(SPX_CONFIG_DBG_TRACE_VERIFY) && !defined(AZAC_CONFIG_DBG_TRACE_VERIFY)
#define AZAC_CONFIG_DBG_TRACE_VERIFY SPX_CONFIG_DBG_TRACE_VERIFY
#elif !defined(SPX_CONFIG_DBG_TRACE_VERIFY) && defined(AZAC_CONFIG_DBG_TRACE_VERIFY)
#define SPX_CONFIG_DBG_TRACE_VERIFY AZAC_CONFIG_DBG_TRACE_VERIFY
#endif
#if defined(SPX_CONFIG_TRACE_ALL) && !defined(AZAC_CONFIG_TRACE_ALL)
#define AZAC_CONFIG_TRACE_ALL SPX_CONFIG_TRACE_ALL
#elif !defined(SPX_CONFIG_TRACE_ALL) && defined(AZAC_CONFIG_TRACE_ALL)
#define SPX_CONFIG_TRACE_ALL AZAC_CONFIG_TRACE_ALL
#endif
#if defined(SPX_CONFIG_TRACE_VERBOSE) && !defined(AZAC_CONFIG_TRACE_VERBOSE)
#define AZAC_CONFIG_TRACE_VERBOSE SPX_CONFIG_TRACE_VERBOSE
#elif !defined(SPX_CONFIG_TRACE_VERBOSE) && defined(AZAC_CONFIG_TRACE_VERBOSE)
#define SPX_CONFIG_TRACE_VERBOSE AZAC_CONFIG_TRACE_VERBOSE
#endif
#if defined(SPX_CONFIG_TRACE_INFO) && !defined(AZAC_CONFIG_TRACE_INFO)
#define AZAC_CONFIG_TRACE_INFO SPX_CONFIG_TRACE_INFO
#elif !defined(SPX_CONFIG_TRACE_INFO) && defined(AZAC_CONFIG_TRACE_INFO)
#define SPX_CONFIG_TRACE_INFO AZAC_CONFIG_TRACE_INFO
#endif
#if defined(SPX_CONFIG_TRACE_WARNING) && !defined(AZAC_CONFIG_TRACE_WARNING)
#define AZAC_CONFIG_TRACE_WARNING SPX_CONFIG_TRACE_WARNING
#elif !defined(SPX_CONFIG_TRACE_WARNING) && defined(AZAC_CONFIG_TRACE_WARNING)
#define SPX_CONFIG_TRACE_WARNING AZAC_CONFIG_TRACE_WARNING
#endif
#if defined(SPX_CONFIG_TRACE_ERROR) && !defined(AZAC_CONFIG_TRACE_ERROR)
#define AZAC_CONFIG_TRACE_ERROR SPX_CONFIG_TRACE_ERROR
#elif !defined(SPX_CONFIG_TRACE_ERROR) && defined(AZAC_CONFIG_TRACE_ERROR)
#define SPX_CONFIG_TRACE_ERROR AZAC_CONFIG_TRACE_ERROR
#endif
#if defined(SPX_CONFIG_TRACE_FUNCTION) && !defined(AZAC_CONFIG_TRACE_FUNCTION)
#define AZAC_CONFIG_TRACE_FUNCTION SPX_CONFIG_TRACE_FUNCTION
#elif !defined(SPX_CONFIG_TRACE_FUNCTION) && defined(AZAC_CONFIG_TRACE_FUNCTION)
#define SPX_CONFIG_TRACE_FUNCTION AZAC_CONFIG_TRACE_FUNCTION
#endif
#if defined(SPX_CONFIG_TRACE_SCOPE) && !defined(AZAC_CONFIG_TRACE_SCOPE)
#define AZAC_CONFIG_TRACE_SCOPE SPX_CONFIG_TRACE_SCOPE
#elif !defined(SPX_CONFIG_TRACE_SCOPE) && defined(AZAC_CONFIG_TRACE_SCOPE)
#define SPX_CONFIG_TRACE_SCOPE AZAC_CONFIG_TRACE_SCOPE
#endif
#if defined(SPX_CONFIG_TRACE_THROW_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_THROW_ON_FAIL)
#define AZAC_CONFIG_TRACE_THROW_ON_FAIL SPX_CONFIG_TRACE_THROW_ON_FAIL
#elif !defined(SPX_CONFIG_TRACE_THROW_ON_FAIL) && defined(AZAC_CONFIG_TRACE_THROW_ON_FAIL)
#define SPX_CONFIG_TRACE_THROW_ON_FAIL AZAC_CONFIG_TRACE_THROW_ON_FAIL
#endif
#if defined(SPX_CONFIG_TRACE_REPORT_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_REPORT_ON_FAIL)
#define AZAC_CONFIG_TRACE_REPORT_ON_FAIL SPX_CONFIG_TRACE_REPORT_ON_FAIL
#elif !defined(SPX_CONFIG_TRACE_REPORT_ON_FAIL) && defined(AZAC_CONFIG_TRACE_REPORT_ON_FAIL)
#define SPX_CONFIG_TRACE_REPORT_ON_FAIL AZAC_CONFIG_TRACE_REPORT_ON_FAIL
#endif
#if defined(SPX_CONFIG_TRACE_RETURN_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_RETURN_ON_FAIL)
#define AZAC_CONFIG_TRACE_RETURN_ON_FAIL SPX_CONFIG_TRACE_RETURN_ON_FAIL
#elif !defined(SPX_CONFIG_TRACE_RETURN_ON_FAIL) && defined(AZAC_CONFIG_TRACE_RETURN_ON_FAIL)
#define SPX_CONFIG_TRACE_RETURN_ON_FAIL AZAC_CONFIG_TRACE_RETURN_ON_FAIL
#endif
#if defined(SPX_CONFIG_TRACE_EXITFN_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_EXITFN_ON_FAIL)
#define AZAC_CONFIG_TRACE_EXITFN_ON_FAIL SPX_CONFIG_TRACE_EXITFN_ON_FAIL
#elif !defined(SPX_CONFIG_TRACE_EXITFN_ON_FAIL) && defined(AZAC_CONFIG_TRACE_EXITFN_ON_FAIL)
#define SPX_CONFIG_TRACE_EXITFN_ON_FAIL AZAC_CONFIG_TRACE_EXITFN_ON_FAIL
#endif
#if !defined(__AZAC_THROW_HR_IMPL) && defined(__SPX_THROW_HR_IMPL)
#define __AZAC_THROW_HR_IMPL __SPX_THROW_HR_IMPL
#elif !defined(__SPX_THROW_HR_IMPL) && defined(__AZAC_THROW_HR_IMPL)
#define __SPX_THROW_HR_IMPL __AZAC_THROW_HR_IMPL
#elif !defined(__AZAC_THROW_HR_IMPL) && !defined(__SPX_THROW_HR_IMPL)
#define __AZAC_THROW_HR_IMPL __azac_rethrow
#define __SPX_THROW_HR_IMPL __azac_rethrow
#else
#error Both __AZAC_THROW_HR_IMPL and __SPX_THROW_HR_IMPL cannot be defined at the same time
#endif
//-------------------------------------------------------
// SPX_ and SPX_DBG_ macro configuration
//-------------------------------------------------------
#ifdef SPX_CONFIG_DBG_TRACE_ALL
#define SPX_CONFIG_DBG_TRACE_VERBOSE 1
#define SPX_CONFIG_DBG_TRACE_INFO 1
#define SPX_CONFIG_DBG_TRACE_WARNING 1
#define SPX_CONFIG_DBG_TRACE_ERROR 1
#define SPX_CONFIG_DBG_TRACE_FUNCTION 1
#define SPX_CONFIG_DBG_TRACE_SCOPE 1
#define SPX_CONFIG_DBG_TRACE_ASSERT 1
#define SPX_CONFIG_DBG_TRACE_VERIFY 1
#ifndef SPX_CONFIG_TRACE_ALL
#define SPX_CONFIG_TRACE_ALL 1
#endif
#endif // SPX_CONFIG_DBG_TRACE_ALL
#ifdef SPX_CONFIG_TRACE_ALL
#define SPX_CONFIG_TRACE_VERBOSE 1
#define SPX_CONFIG_TRACE_INFO 1
#define SPX_CONFIG_TRACE_WARNING 1
#define SPX_CONFIG_TRACE_ERROR 1
#define SPX_CONFIG_TRACE_FUNCTION 1
#define SPX_CONFIG_TRACE_SCOPE 1
#define SPX_CONFIG_TRACE_THROW_ON_FAIL 1
#define SPX_CONFIG_TRACE_REPORT_ON_FAIL 1
#define SPX_CONFIG_TRACE_RETURN_ON_FAIL 1
#define SPX_CONFIG_TRACE_EXITFN_ON_FAIL 1
#endif // SPX_CONFIG_TRACE_ALL
//-------------------------------------------------------
// #include section ...
// (must come after everything above)
//-------------------------------------------------------
#include <azac_debug.h>
#include <inttypes.h>
#include <spxerror.h>
#ifndef _MSC_VER
// macros in this header generate a bunch of
// "ISO C++11 requires at least one argument for the "..." in a variadic macro" errors.
// system_header pragma is the only mechanism that helps to suppress them.
// https://stackoverflow.com/questions/35587137/how-to-suppress-gcc-variadic-macro-argument-warning-for-zero-arguments-for-a-par
// TODO: try to make macros standard-compliant.
#pragma GCC system_header
#endif
//-----------------------------------------------------------
// SPX_TRACE macro common implementations
//-----------------------------------------------------------
#define __SPX_TRACE_LEVEL_INFO __AZAC_TRACE_LEVEL_INFO // Trace_Info
#define __SPX_TRACE_LEVEL_WARNING __AZAC_TRACE_LEVEL_WARNING // Trace_Warning
#define __SPX_TRACE_LEVEL_ERROR __AZAC_TRACE_LEVEL_ERROR // Trace_Error
#define __SPX_TRACE_LEVEL_VERBOSE __AZAC_TRACE_LEVEL_VERBOSE // Trace_Verbose
#ifndef __SPX_DO_TRACE_IMPL
#define __SPX_DO_TRACE_IMPL __AZAC_DO_TRACE_IMPL
#endif
#define __SPX_DOTRACE(level, title, fileName, lineNumber, ...) \
__AZAC_DOTRACE(level, title, fileName, lineNumber, ##__VA_ARGS__)
#define __SPX_TRACE_INFO(title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_INFO(title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_INFO_IF(cond, title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_INFO_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_WARNING(title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_WARNING(title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_WARNING_IF(cond, title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_WARNING_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_ERROR(title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_ERROR(title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_ERROR_IF(cond, title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_ERROR_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_VERBOSE(title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_VERBOSE(title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define __SPX_TRACE_VERBOSE_IF(cond, title, fileName, lineNumber, msg, ...) \
__AZAC_TRACE_VERBOSE_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__)
#define ___SPX_EXPR_AS_STRING(_String) \
___AZAC_EXPR_AS_STRING(_String)
#define __SPX_EXPR_AS_STRING(_String) \
__AZAC_EXPR_AS_STRING(_String)
#define __SPX_TRACE_HR(title, fileName, lineNumber, hr, x) \
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x)
#define __SPX_REPORT_ON_FAIL(title, fileName, lineNumber, hr) \
__AZAC_REPORT_ON_FAIL(title, fileName, lineNumber, hr)
#define __SPX_REPORT_ON_FAIL_IFNOT(title, fileName, lineNumber, hr, hrNot) \
__AZAC_REPORT_ON_FAIL_IFNOT(title, fileName, lineNumber, hr, hrNot)
#define __SPX_T_RETURN_HR(title, fileName, lineNumber, hr) \
__AZAC_T_RETURN_HR(title, fileName, lineNumber, hr)
#define __SPX_T_RETURN_HR_IF(title, fileName, lineNumber, hr, cond) \
__AZAC_T_RETURN_HR_IF(title, fileName, lineNumber, hr, cond)
#define __SPX_T_RETURN_ON_FAIL(title, fileName, lineNumber, hr) \
__AZAC_T_RETURN_ON_FAIL(title, fileName, lineNumber, hr)
#define __SPX_T_RETURN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \
__AZAC_T_RETURN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot)
#define __SPX_RETURN_HR(hr) \
__AZAC_RETURN_HR(hr)
#define __SPX_RETURN_HR_IF(hr, cond) \
__AZAC_RETURN_HR_IF(hr, cond)
#define __SPX_RETURN_ON_FAIL(hr) \
__AZAC_RETURN_ON_FAIL(hr)
#define __SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) \
__AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot)
#define SPX_EXITFN_CLEANUP AZAC_EXITFN_CLEANUP
#define __SPX_T_EXITFN_HR(title, fileName, lineNumber, hr) \
__AZAC_T_EXITFN_HR(title, fileName, lineNumber, hr)
#define __SPX_T_EXITFN_HR_IF(title, fileName, lineNumber, hr, cond) \
__AZAC_T_EXITFN_HR_IF(title, fileName, lineNumber, hr, cond)
#define __SPX_T_EXITFN_ON_FAIL(title, fileName, lineNumber, hr) \
__AZAC_T_EXITFN_ON_FAIL(title, fileName, lineNumber, hr)
#define __SPX_T_EXITFN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \
__AZAC_T_EXITFN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot)
#define __SPX_EXITFN_HR(hr) \
__AZAC_EXITFN_HR(hr)
#define __SPX_EXITFN_HR_IF(hr, cond) \
__AZAC_EXITFN_HR_IF(hr, cond)
#define __SPX_EXITFN_ON_FAIL(hr) \
__AZAC_EXITFN_ON_FAIL(hr)
#define __SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) \
__AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot)
#define __SPX_TRACE_ASSERT(title, fileName, lineNumber, expr) \
__AZAC_TRACE_ASSERT(title, fileName, lineNumber, expr)
#define __SPX_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ...) \
__AZAC_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ##__VA_ARGS__)
#define __SPX_DBG_ASSERT(title, fileName, lineNumber, expr) \
__AZAC_DBG_ASSERT(title, fileName, lineNumber, expr)
#define __SPX_DBG_ASSERT_WITH_MESSAGE(title, fileName, lineNumber, expr, ...) \
__AZAC_DBG_ASSERT_WITH_MESSAGE(title, fileName, lineNumber, expr, ##__VA_ARGS__)
#define __SPX_DBG_VERIFY(title, fileName, lineNumber, expr) \
__AZAC_DBG_VERIFY(title, fileName, lineNumber, expr)
#define __SPX_DBG_VERIFY_WITH_MESSAGE(title, fileName, lineNumber, expr, ...) \
__AZAC_DBG_VERIFY_WITH_MESSAGE(title, fileName, lineNumber, expr, ##__VA_ARGS__)
#ifdef __cplusplus
#define __SPX_TRACE_SCOPE(t1, fileName, lineNumber, t2, x, y) \
__AZAC_TRACE_SCOPE(t1, fileName, lineNumber, t2, x, y)
#ifndef __SPX_THROW_HR
#define __SPX_THROW_HR(hr) __SPX_THROW_HR_IMPL(hr)
#endif
#define __SPX_T_THROW_ON_FAIL(title, fileName, lineNumber, hr) \
__AZAC_T_THROW_ON_FAIL(title, fileName, lineNumber, hr)
#define __SPX_T_THROW_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \
__AZAC_T_THROW_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot)
#define __SPX_T_THROW_HR_IF(title, fileName, lineNumber, hr, cond) \
__AZAC_T_THROW_HR_IF(title, fileName, lineNumber, hr, cond)
#define __SPX_T_THROW_HR(title, fileName, lineNumber, hr) \
__AZAC_T_THROW_HR(title, fileName, lineNumber, hr)
#define __SPX_THROW_ON_FAIL(hr) \
__AZAC_THROW_ON_FAIL(hr)
#define __SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) \
__AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot)
#define __SPX_THROW_HR_IF(hr, cond) \
__AZAC_THROW_HR_IF(hr, cond)
#endif // __cplusplus
//-------------------------------------------------------
// SPX_ macro definitions
//-------------------------------------------------------
#ifdef SPX_CONFIG_TRACE_VERBOSE
#define SPX_TRACE_VERBOSE(msg, ...) __SPX_TRACE_VERBOSE("SPX_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_TRACE_VERBOSE_IF(cond, msg, ...) __SPX_TRACE_VERBOSE_IF(cond, "SPX_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_TRACE_VERBOSE(...)
#define SPX_TRACE_VERBOSE_IF(...)
#endif
#ifdef SPX_CONFIG_DBG_TRACE_VERBOSE
#define SPX_DBG_TRACE_VERBOSE(msg, ...) __SPX_TRACE_VERBOSE("SPX_DBG_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_DBG_TRACE_VERBOSE_IF(cond, msg, ...) __SPX_TRACE_VERBOSE_IF(cond, "SPX_DBG_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_DBG_TRACE_VERBOSE(...)
#define SPX_DBG_TRACE_VERBOSE_IF(...)
#endif
#ifdef SPX_CONFIG_TRACE_INFO
#define SPX_TRACE_INFO(msg, ...) __SPX_TRACE_INFO("SPX_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_TRACE_INFO_IF(cond, msg, ...) __SPX_TRACE_INFO_IF(cond, "SPX_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_TRACE_INFO(...)
#define SPX_TRACE_INFO_IF(...)
#endif
#ifdef SPX_CONFIG_DBG_TRACE_INFO
#define SPX_DBG_TRACE_INFO(msg, ...) __SPX_TRACE_INFO("SPX_DBG_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_DBG_TRACE_INFO_IF(cond, msg, ...) __SPX_TRACE_INFO_IF(cond, "SPX_DBG_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_DBG_TRACE_INFO(...)
#define SPX_DBG_TRACE_INFO_IF(...)
#endif
#ifdef SPX_CONFIG_TRACE_WARNING
#define SPX_TRACE_WARNING(msg, ...) __SPX_TRACE_WARNING("SPX_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_TRACE_WARNING_IF(cond, msg, ...) __SPX_TRACE_WARNING_IF(cond, "SPX_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_TRACE_WARNING(...)
#define SPX_TRACE_WARNING_IF(...)
#endif
#ifdef SPX_CONFIG_DBG_TRACE_WARNING
#define SPX_DBG_TRACE_WARNING(msg, ...) __SPX_TRACE_WARNING("SPX_DBG_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_DBG_TRACE_WARNING_IF(cond, msg, ...) __SPX_TRACE_WARNING_IF(cond, "SPX_DBG_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_DBG_TRACE_WARNING(...)
#define SPX_DBG_TRACE_WARNING_IF(...)
#endif
#ifdef SPX_CONFIG_TRACE_ERROR
#define SPX_TRACE_ERROR(msg, ...) __SPX_TRACE_ERROR("SPX_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_TRACE_ERROR_IF(cond, msg, ...) __SPX_TRACE_ERROR_IF(cond, "SPX_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_TRACE_ERROR(...)
#define SPX_TRACE_ERROR_IF(...)
#endif
#ifdef SPX_CONFIG_DBG_TRACE_ERROR
#define SPX_DBG_TRACE_ERROR(msg, ...) __SPX_TRACE_ERROR("SPX_DBG_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#define SPX_DBG_TRACE_ERROR_IF(cond, msg, ...) __SPX_TRACE_ERROR_IF(cond, "SPX_DBG_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__)
#else
#define SPX_DBG_TRACE_ERROR(...)
#define SPX_DBG_TRACE_ERROR_IF(...)
#endif
#ifdef SPX_CONFIG_TRACE_FUNCTION
#define SPX_TRACE_FUNCTION(...) __SPX_TRACE_VERBOSE("SPX_TRACE_FUNCTION: ", __FILE__, __LINE__, __FUNCTION__)
#else
#define SPX_TRACE_FUNCTION(...)
#endif
#ifdef SPX_CONFIG_DBG_TRACE_FUNCTION
#define SPX_DBG_TRACE_FUNCTION(...) __SPX_TRACE_VERBOSE("SPX_DBG_TRACE_FUNCTION: ", __FILE__, __LINE__, __FUNCTION__)
#else
#define SPX_DBG_TRACE_FUNCTION(...)
#endif
#ifdef SPX_CONFIG_TRACE_REPORT_ON_FAIL
#define SPX_REPORT_ON_FAIL(hr) __SPX_REPORT_ON_FAIL("SPX_REPORT_ON_FAIL: ", __FILE__, __LINE__, hr)
#define SPX_REPORT_ON_FAIL_IFNOT(hr, hrNot) __SPX_REPORT_ON_FAIL_IFNOT("SPX_REPORT_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot)
#else
#define SPX_REPORT_ON_FAIL(hr) UNUSED(hr)
#define SPX_REPORT_ON_FAIL_IFNOT(hr, hrNot) UNUSED(hr); UNUSED(hrNot)
#endif
#ifdef SPX_CONFIG_TRACE_RETURN_ON_FAIL
#define SPX_RETURN_HR(hr) __SPX_T_RETURN_HR("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr)
#define SPX_RETURN_HR_IF(hr, cond) __SPX_T_RETURN_HR_IF("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr, cond)
#define SPX_RETURN_ON_FAIL(hr) __SPX_T_RETURN_ON_FAIL("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr)
#define SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_T_RETURN_ON_FAIL_IF_NOT("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot)
#else
#define SPX_RETURN_HR(hr) __SPX_RETURN_HR(hr)
#define SPX_RETURN_HR_IF(hr, cond) __SPX_RETURN_HR_IF(hr, cond)
#define SPX_RETURN_ON_FAIL(hr) __SPX_RETURN_ON_FAIL(hr)
#define SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot)
#endif
#define SPX_IFTRUE_RETURN_HR(cond, hr) SPX_RETURN_HR_IF(hr, cond)
#define SPX_IFFALSE_RETURN_HR(cond, hr) SPX_RETURN_HR_IF(hr, !(cond))
#define SPX_IFFAILED_RETURN_HR(hr) SPX_RETURN_ON_FAIL(hr)
#define SPX_IFFAILED_RETURN_HR_IFNOT(hr, hrNot) SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot)
#ifdef SPX_CONFIG_TRACE_EXITFN_ON_FAIL
#define SPX_EXITFN_HR(hr) __SPX_T_EXITFN_HR("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr)
#define SPX_EXITFN_HR_IF(hr, cond) __SPX_T_EXITFN_HR_IF("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr, cond)
#define SPX_EXITFN_ON_FAIL(hr) __SPX_T_EXITFN_ON_FAIL("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr)
#define SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_T_EXITFN_ON_FAIL_IF_NOT("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot)
#else
#define SPX_EXITFN_HR(hr) __SPX_EXITFN_HR(hr)
#define SPX_EXITFN_HR_IF(hr, cond) __SPX_EXITFN_HR_IF(hr, cond)
#define SPX_EXITFN_ON_FAIL(hr) __SPX_EXITFN_ON_FAIL(hr)
#define SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot)
#endif
#define SPX_IFTRUE_EXITFN_WHR(cond, hr) SPX_EXITFN_HR_IF(hr, cond)
#define SPX_IFFALSE_EXITFN_WHR(cond, hr) SPX_EXITFN_HR_IF(hr, !(cond))
#define SPX_IFFAILED_EXITFN_WHR(hr) SPX_EXITFN_ON_FAIL(hr)
#define SPX_IFFAILED_EXITFN_WHR_IFNOT(hr, hrNot) SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot)
#define SPX_IFTRUE_EXITFN_CLEANUP(cond, expr) AZAC_IFTRUE_EXITFN_CLEANUP(cond, expr)
#define SPX_IFFALSE_EXITFN_CLEANUP(cond, expr) AZAC_IFFALSE_EXITFN_CLEANUP(cond, expr)
#if defined(SPX_CONFIG_DBG_TRACE_ASSERT) && (defined(DEBUG) || defined(_DEBUG))
#define SPX_DBG_ASSERT(expr) __SPX_DBG_ASSERT("SPX_ASSERT: ", __FILE__, __LINE__, expr)
#define SPX_DBG_ASSERT_WITH_MESSAGE(expr, ...) __SPX_DBG_ASSERT_WITH_MESSAGE("SPX_ASSERT: ", __FILE__, __LINE__, expr, ##__VA_ARGS__)
#else
#define SPX_DBG_ASSERT(expr)
#define SPX_DBG_ASSERT_WITH_MESSAGE(expr, ...)
#endif
#if defined(SPX_CONFIG_DBG_TRACE_VERIFY) && (defined(DEBUG) || defined(_DEBUG))
#define SPX_DBG_VERIFY(expr) __SPX_DBG_VERIFY("SPX_VERIFY: ", __FILE__, __LINE__, expr)
#define SPX_DBG_VERIFY_WITH_MESSAGE(expr, ...) __SPX_DBG_VERIFY_WITH_MESSAGE("SPX_VERIFY: ", __FILE__, __LINE__, expr, ##__VA_ARGS__)
#else
#define SPX_DBG_VERIFY(expr) (expr)
#define SPX_DBG_VERIFY_WITH_MESSAGE(expr, ...) (expr)
#endif
#define SPX_IFTRUE(cond, expr) AZAC_IFTRUE(cond, expr)
#define SPX_IFFALSE(cond, expr) AZAC_IFFALSE(cond, expr)
#ifdef __cplusplus
#ifdef SPX_CONFIG_TRACE_SCOPE
#define SPX_TRACE_SCOPE(x, y) __SPX_TRACE_SCOPE("SPX_TRACE_SCOPE_ENTER: ", __FILE__, __LINE__, "SPX_TRACE_SCOPE_EXIT: ", x, y)
#else
#define SPX_TRACE_SCOPE(x, y)
#endif
#ifdef SPX_CONFIG_DBG_TRACE_SCOPE
#define SPX_DBG_TRACE_SCOPE(x, y) __SPX_TRACE_SCOPE("SPX_DBG_TRACE_SCOPE_ENTER: ", __FILE__, __LINE__, "SPX_DBG_TRACE_SCOPE_EXIT: ", x, y)
#else
#define SPX_DBG_TRACE_SCOPE(x, y)
#endif
#ifdef SPX_CONFIG_TRACE_THROW_ON_FAIL
#define SPX_THROW_ON_FAIL(hr) __SPX_T_THROW_ON_FAIL("SPX_THROW_ON_FAIL: ", __FILE__, __LINE__, hr)
#define SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) __SPX_T_THROW_ON_FAIL_IF_NOT("SPX_THROW_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot)
#define SPX_THROW_HR_IF(hr, cond) __SPX_T_THROW_HR_IF("SPX_THROW_HR_IF: ", __FILE__, __LINE__, hr, cond)
#define SPX_THROW_HR(hr) __SPX_T_THROW_HR("SPX_THROW_HR: ", __FILE__, __LINE__, hr)
#else
#define SPX_THROW_ON_FAIL(hr) __SPX_THROW_ON_FAIL(hr)
#define SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) __SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot)
#define SPX_THROW_HR_IF(hr, cond) __SPX_THROW_HR_IF(hr, cond)
#define SPX_THROW_HR(hr) __SPX_THROW_HR(hr)
#endif
#define SPX_IFFAILED_THROW_HR(hr) SPX_THROW_ON_FAIL(hr)
#define SPX_IFFAILED_THROW_HR_IFNOT(hr, hrNot) SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot)
#else // __cplusplus
#define SPX_TRACE_SCOPE(x, y) static_assert(false)
#define SPX_DBG_TRACE_SCOPE(x, y) static_assert(false)
#define SPX_THROW_ON_FAIL(hr) static_assert(false)
#define SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) static_assert(false)
#define SPX_THROW_HR_IF(hr, cond) static_assert(false)
#define SPX_THROW_HR(hr) static_assert(false)
#define SPX_IFFAILED_THROW_HR(hr) static_assert(false)
#define SPX_IFFAILED_THROW_HR_IFNOT(hr, hrNot) static_assert(false)
#endif // __cplusplus