gwnavruntime/kernel/SF_Debug.h Source File

SF_Debug.h
Go to the documentation of this file.
1 /*
2 * Copyright 2015 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 /**************************************************************************
8 
9 PublicHeader: Kernel
10 Filename : KY_Debug.h
11 Content : General purpose debugging support
12 Created : July 18, 2001
13 Authors : Brendan Iribe, Michael Antonov
14 
15 Notes : Debug warning functionality is enabled
16  if and only if KY_BUILD_DEBUG is defined.
17 
18 **************************************************************************/
19 
20 #ifndef INC_KY_Kernel_Debug_H
21 #define INC_KY_Kernel_Debug_H
22 
24 
25 // If not in debug build, macros do nothing
26 #if !defined(KY_BUILD_DEBUG)
27 # define KY_NO_DEBUG_OUTPUT
28 #endif
29 
30 #ifdef KY_CC_MSVC
31 #define KY_LOG_SUFFIX_ADD(fmt, ...) (fmt " [%s:%u]\n", __VA_ARGS__, KY_GET_COMPILED_FILENAME, __LINE__)
32 #else // defined(KY_CC_GNU) || defined(KY_CC_SNC) || defined(KY_CC_GHS)
33 #define KY_LOG_SUFFIX_ADD(fmt, ...) (fmt " [%s:%u]\n", ## __VA_ARGS__, KY_GET_COMPILED_FILENAME, __LINE__)
34 #endif
35 #define KY_LOG_SUFFIX(args) KY_LOG_SUFFIX_ADD args
36 
37 #ifndef KY_NO_DEBUG_OUTPUT
38 
41 
42  namespace Kaim {
43 
44  class LogDebugMessager
45  {
46  public:
47  LogDebugMessager(LogMessageId id)
48  : m_id(id)
49  {}
50 
51  void Print(const char* fmt, ...) const KY_LOG_VAARG_ATTRIBUTE(2,3);
52  LogMessageId m_id;
53  };
54 
55  }
56 
57  // Simple output with prefix tag
58  // Do not use KY_DEBUG_OUTPUT, use KY_DEBUG_WARNING KY_DEBUG_ERROR KY_DEBUG_MESSAGE instead (see below)
59  #define KY_DEBUG_OUTPUTN(msgtype, msg) Kaim::LogDebugMessager(msgtype).Print msg;
60  #define KY_DEBUG_OUTPUTN_IF(cond, msgtype, msg) do { if (cond) { KY_DEBUG_OUTPUTN(msgtype, msg); } } while (0)
61 
62  #define KY_DEBUG_OUTPUT(cond, msgtype, str) KY_DEBUG_OUTPUTN_IF(cond, msgtype, ("%s", str))
63  #define KY_DEBUG_OUTPUT1(cond, msgtype, str, p1) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1))
64  #define KY_DEBUG_OUTPUT2(cond, msgtype, str, p1, p2) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2))
65  #define KY_DEBUG_OUTPUT3(cond, msgtype, str, p1, p2, p3) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3))
66  #define KY_DEBUG_OUTPUT4(cond, msgtype, str, p1, p2, p3, p4) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3, p4))
67  #define KY_DEBUG_OUTPUT5(cond, msgtype, str, p1, p2, p3, p4, p5) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3, p4, p5))
68  #define KY_DEBUG_OUTPUT6(cond, msgtype, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3, p4, p5, p6))
69 
70  // Assertion with messages
71  // Unlike KY_ASSERT, these macros display a message before breaking
72  #define KY_DEBUG_ASSERTN(cond, msg) do { if (!(cond)) { KY_DEBUG_OUTPUTN(Kaim::Log_DebugAssert, KY_LOG_SUFFIX(msg)); KY_DEBUG_BREAK; } } while (0)
73  #define KY_DEBUG_ASSERT(cond, str) KY_DEBUG_ASSERTN(cond, ("%s", str))
74  #define KY_DEBUG_ASSERT1(cond, str, p1) KY_DEBUG_ASSERTN(cond, (str, p1))
75  #define KY_DEBUG_ASSERT2(cond, str, p1, p2) KY_DEBUG_ASSERTN(cond, (str, p1, p2))
76  #define KY_DEBUG_ASSERT3(cond, str, p1, p2, p3) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3))
77  #define KY_DEBUG_ASSERT4(cond, str, p1, p2, p3, p4) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3, p4))
78  #define KY_DEBUG_ASSERT5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3, p4, p5))
79  #define KY_DEBUG_ASSERT6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3, p4, p5, p6))
80 
81 
82 #else
83 
84  // Simple output with prefix tag
85  #define KY_DEBUG_OUTPUTN(msgtype, msg) ((void)0)
86  #define KY_DEBUG_OUTPUTN_IF(cond, msgtype, msg) ((void)0)
87  #define KY_DEBUG_OUTPUT(cond, msgtype, str ) ((void)0)
88  #define KY_DEBUG_OUTPUT1(cond, msgtype, str, p1) ((void)0)
89  #define KY_DEBUG_OUTPUT2(cond, msgtype, str, p1, p2) ((void)0)
90  #define KY_DEBUG_OUTPUT3(cond, msgtype, str, p1, p2, p3) ((void)0)
91  #define KY_DEBUG_OUTPUT4(cond, msgtype, str, p1, p2, p3, p4) ((void)0)
92  #define KY_DEBUG_OUTPUT5(cond, msgtype, str, p1, p2, p3, p4, p5) ((void)0)
93  #define KY_DEBUG_OUTPUT6(cond, msgtype, str, p1, p2, p3, p4, p5, p6) ((void)0)
94 
95  // Assertion with messages
96  // Unlike KY_ASSERT, these macros display a message before breaking
97  #define KY_DEBUG_ASSERTN(cond, msg) ((void)0)
98  #define KY_DEBUG_ASSERT(cond, str) ((void)0)
99  #define KY_DEBUG_ASSERT1(cond, str, p1) ((void)0)
100  #define KY_DEBUG_ASSERT2(cond, str, p1, p2) ((void)0)
101  #define KY_DEBUG_ASSERT3(cond, str, p1, p2, p3) ((void)0)
102  #define KY_DEBUG_ASSERT4(cond, str, p1, p2, p3, p4) ((void)0)
103  #define KY_DEBUG_ASSERT5(cond, str, p1, p2, p3, p4, p5) ((void)0)
104  #define KY_DEBUG_ASSERT6(cond, str, p1, p2, p3, p4, p5, p6) ((void)0)
105 
106 #endif // KY_BUILD_DEBUG
107 
108 
109 // KY_DEBUG_WARNINGN, KY_DEBUG_ERRORN_IF, KY_DEBUG_MESSAGEN... usage:
110 // KY_DEBUG_XXXXXXN(x == 0, (msg is printf args with parenthesis %s %d, "some string", "some int"))
111 
112 // Conditional warnings - "SF Warning: " prefix
113 #define KY_DEBUG_WARNINGN(msg) do { KY_DEBUG_OUTPUTN(Kaim::Log_DebugWarning, KY_LOG_SUFFIX(msg)); } while (0)
114 #define KY_DEBUG_WARNINGN_IF(cond, msg) do { if (cond) { KY_DEBUG_WARNINGN(msg); } } while (0)
115 #define KY_DEBUG_WARNING(cond, str) KY_DEBUG_WARNINGN_IF(cond, ("%s", str))
116 #define KY_DEBUG_WARNING1(cond, str, p1) KY_DEBUG_WARNINGN_IF(cond, (str, p1))
117 #define KY_DEBUG_WARNING2(cond, str, p1, p2) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2))
118 #define KY_DEBUG_WARNING3(cond, str, p1, p2, p3) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3))
119 #define KY_DEBUG_WARNING4(cond, str, p1, p2, p3, p4) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3,p4))
120 #define KY_DEBUG_WARNING5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3,p4,p5))
121 #define KY_DEBUG_WARNING6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
122 
123 // Conditional errors - "SF Error: " prefix
124 #define KY_DEBUG_ERRORN(msg) do { KY_DEBUG_OUTPUTN(Kaim::Log_DebugError, KY_LOG_SUFFIX(msg)); } while (0)
125 #define KY_DEBUG_ERRORN_IF(cond, msg) do { if (cond) { KY_DEBUG_ERRORN(msg); } } while (0)
126 #define KY_DEBUG_ERROR(cond, str) KY_DEBUG_ERRORN_IF(cond, ("%s", str))
127 #define KY_DEBUG_ERROR1(cond, str, p1) KY_DEBUG_ERRORN_IF(cond, (str, p1))
128 #define KY_DEBUG_ERROR2(cond, str, p1, p2) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2))
129 #define KY_DEBUG_ERROR3(cond, str, p1, p2, p3) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3))
130 #define KY_DEBUG_ERROR4(cond, str, p1, p2, p3, p4) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3,p4))
131 #define KY_DEBUG_ERROR5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3,p4,p5))
132 #define KY_DEBUG_ERROR6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
133 // Conditional messages - no prefix
134 #define KY_DEBUG_MESSAGEN(msg) KY_DEBUG_OUTPUTN(Kaim::Log_DebugMessage, msg)
135 #define KY_DEBUG_MESSAGEN_IF(cond, msg) KY_DEBUG_OUTPUTN_IF(cond, Kaim::Log_DebugMessage, msg)
136 #define KY_DEBUG_MESSAGE(cond, str) KY_DEBUG_MESSAGEN_IF(cond, ("%s", str))
137 #define KY_DEBUG_MESSAGE1(cond, str, p1) KY_DEBUG_MESSAGEN_IF(cond, (str, p1))
138 #define KY_DEBUG_MESSAGE2(cond, str, p1, p2) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2))
139 #define KY_DEBUG_MESSAGE3(cond, str, p1, p2, p3) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3))
140 #define KY_DEBUG_MESSAGE4(cond, str, p1, p2, p3, p4) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3,p4))
141 #define KY_DEBUG_MESSAGE5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3,p4,p5))
142 #define KY_DEBUG_MESSAGE6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
143 // Conditional messages with '\n' - no prefix
144 #define KY_DEBUG_MESSAGE_LINEN(msg) do { KY_DEBUG_OUTPUTN(Kaim::Log_DebugMessage, KY_LOG_SUFFIX(msg)); } while (0)
145 #define KY_DEBUG_MESSAGE_LINEN_IF(cond, msg) do { if (cond) { KY_DEBUG_MESSAGE_LINEN(msg); } } while (0)
146 #define KY_DEBUG_MESSAGE_LINE(cond, str) KY_DEBUG_MESSAGE_LINEN_IF(cond, ("%s", str))
147 #define KY_DEBUG_MESSAGE_LINE1(cond, str, p1) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1))
148 #define KY_DEBUG_MESSAGE_LINE2(cond, str, p1, p2) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2))
149 #define KY_DEBUG_MESSAGE_LINE3(cond, str, p1, p2, p3) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3))
150 #define KY_DEBUG_MESSAGE_LINE4(cond, str, p1, p2, p3, p4) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3,p4))
151 #define KY_DEBUG_MESSAGE_LINE5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3,p4,p5))
152 #define KY_DEBUG_MESSAGE_LINE6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
153 
154 // Convenient simple type value object output
155 // - v must be a stack object
156 #define KY_DEBUG_SINT(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%d)\n", int (v))
157 #define KY_DEBUG_UINT(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%u)\n", unsigned(v))
158 #define KY_DEBUG_HEX(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(0x%X)\n", unsigned(v))
159 #define KY_DEBUG_FLOAT(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%f)\n", Kaim::Double(v))
160 #define KY_DEBUG_DOUBLE(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%f)\n", Kaim::Double(v))
161 #define KY_DEBUG_CHAR(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%c)\n", char(v))
162 #define KY_DEBUG_WCHAR(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%lc)\n", wchar_t(v))
163 
164 
165 #endif
Definition: gamekitcrowddispersion.h:20