1/****************************************************************************************
2
3 Copyright (C) 2015 Autodesk, Inc.
4 All rights reserved.
5
6 Use of this software is subject to the terms of the Autodesk license agreement
7 provided at the time of installation or download, or which otherwise accompanies
8 this software in either electronic or hard copy form.
9
10****************************************************************************************/
11
12/** \file fbxdebug.h
13 * Debugging macros and functions.
14 *
15 * All macros and functions are removed in release builds. To enable asserts, a debug build is required as well
16 * as the environment variable "FBXSDK_ASSERT" set to 1 is also required. By default, assertions will pop-up
17 * a window. It is possible to disable the pop-up on the Windows platform by calling the following code:
18 * \code
19 * _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
20 * \endcode
21 */
22#ifndef _FBXSDK_CORE_ARCH_DEBUG_H_
23#define _FBXSDK_CORE_ARCH_DEBUG_H_
24
25#include <fbxsdk/fbxsdk_def.h>
26
27#include <fbxsdk/fbxsdk_nsbegin.h>
28
29/** If this environment variable is set to 1, the FBX SDK will assert in debug builds */
30#define FBXSDK_ASSERT_ENVSTR "FBXSDK_ASSERT"
31
32/** The assertion procedure signature. If a different assertion procedure must be provided, it should have this signature.
33* \param pFileName The file name where the assertion occurred.
34* \param pFunctionName The function name where the assertion occurred.
35* \param pLineNumber The line number in the file where the assertion occurred.
36* \param pMessage The message to display when the assertion occurs. */
37typedef void (*FbxAssertProc)(const char* pFileName, const char* pFunctionName, const unsigned int pLineNumber, const char* pMessage);
38
39/** Change the procedure used when assertion occurs.
40* \param pAssertProc The procedure to be called when assertions occurs. */
41FBXSDK_DLL void FbxAssertSetProc(FbxAssertProc pAssertProc);
42
43//! Change the procedure back to the default one.
44FBXSDK_DLL void FbxAssertSetDefaultProc();
45
46/*****************************************************************************************************************************
47** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
48*****************************************************************************************************************************/
49#ifndef DOXYGEN_SHOULD_SKIP_THIS
50
51FBXSDK_DLL void _FbxAssert(const char* pFileName, const char* pFunctionName, const unsigned int pLineNumber, bool pFormat, const char* pMessage, ...);
52FBXSDK_DLL void _FbxTrace(const char* pMessage, ...);
53
54#ifdef _DEBUG
55 template <bool x> struct FbxStaticAssertType;
56 template<> struct FbxStaticAssertType<true> {enum{value=1};};
57 template<> struct FbxStaticAssertType<false> {enum{value=-1};};
58 #define FBX_ASSERT(Condition) {if(!(Condition)){_FbxAssert(__FILE__,__FUNCTION__,__LINE__,false,#Condition);}}
59 #define FBX_ASSERT_MSG(Condition, Message, ...) {if(!(Condition)){_FbxAssert(__FILE__,__FUNCTION__,__LINE__,true,Message,##__VA_ARGS__);}}
60 #define FBX_ASSERT_NOW(Message, ...) _FbxAssert(__FILE__,__FUNCTION__,__LINE__,true,Message,##__VA_ARGS__);
61 #define FBX_ASSERT_RETURN(Condition) {if(!(Condition)){FBX_ASSERT_NOW(#Condition); return;}}
62 #define FBX_ASSERT_RETURN_VALUE(Condition, Value) {if(!(Condition)){FBX_ASSERT_NOW(#Condition); return Value;}}
63 #define FBX_ASSERT_STATIC(Condition) typedef char FbxBuildBreakIfFalse[FbxStaticAssertType<(bool)(Condition)>::value];
64 #define FBX_TRACE(Message, ...) {_FbxTrace(Message,##__VA_ARGS__);}
65#else
66 #define FBX_ASSERT(Condition) ((void)0)
67 #define FBX_ASSERT_MSG(Condition, Message, ...) ((void)0)
68 #define FBX_ASSERT_NOW(Message, ...) ((void)0)
69 #define FBX_ASSERT_RETURN(Condition) if(!(Condition)){return;}
70 #define FBX_ASSERT_RETURN_VALUE(Condition, Value) if(!(Condition)){return Value;}
71 #define FBX_ASSERT_STATIC(Condition)
72 #define FBX_TRACE(Message, ...) ((void)0)
73#endif
74
75template<typename T> struct FbxIncompatibleWithArray{ enum {value = 0}; };
76
77#define FBXSDK_INCOMPATIBLE_WITH_ARRAY_TEMPLATE(T)\
78 struct FbxIncompatibleWithArray< T >{\
79 union {\
80 T t();\
81 } catcherr;\
82 enum {value = 1};}
83
84#define FBXSDK_INCOMPATIBLE_WITH_ARRAY(T)\
85 template<> FBXSDK_INCOMPATIBLE_WITH_ARRAY_TEMPLATE(T)
86
87#define FBXSDK_IS_INCOMPATIBLE_WITH_ARRAY(T) ((bool) FbxIncompatibleWithArray<T>::value)
88
89#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
90
91#include <fbxsdk/fbxsdk_nsend.h>
92
93#endif /* _FBXSDK_CORE_ARCH_DEBUG_H_ */
94