gwnavruntime/kernel/SF_Debug.h Source File

SF_Debug.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 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_CONFIG_DEBUG is defined.
17 
18 **************************************************************************/
19 
20 #pragma once
21 
23 
24 // If not in debug build, macros do nothing
25 #if !defined(KY_CONFIG_DEBUG)
26 # define KY_NO_DEBUG_OUTPUT
27 #endif
28 
29 #ifdef KY_CC_MSVC
30 #define KY_LOG_SUFFIX_ADD(fmt, ...) (fmt " [%s:%u]\n", __VA_ARGS__, KY_GET_COMPILED_FILENAME, __LINE__)
31 #else // defined(KY_CC_GCC)
32 #define KY_LOG_SUFFIX_ADD(fmt, ...) (fmt " [%s:%u]\n", ## __VA_ARGS__, KY_GET_COMPILED_FILENAME, __LINE__)
33 #endif
34 #define KY_LOG_SUFFIX(args) KY_LOG_SUFFIX_ADD args
35 
36 #ifndef KY_NO_DEBUG_OUTPUT
37 
40 
41  namespace Kaim {
42 
43  class LogDebugMessager
44  {
45  public:
46  LogDebugMessager(LogMessageId id)
47  : m_id(id)
48  {}
49 
50  void Print(const char* fmt, ...) const KY_LOG_VAARG_ATTRIBUTE(2,3);
51  LogMessageId m_id;
52  };
53 
54  }
55 
56  // Simple output with prefix tag
57  // Do not use KY_DEBUG_OUTPUT, use KY_DEBUG_WARNING KY_DEBUG_ERROR KY_DEBUG_MESSAGE instead (see below)
58  #define KY_DEBUG_OUTPUTN(msgtype, msg) Kaim::LogDebugMessager(msgtype).Print msg;
59  #define KY_DEBUG_OUTPUTN_IF(cond, msgtype, msg) do { if (cond) { KY_DEBUG_OUTPUTN(msgtype, msg); } } while (0)
60 
61  #define KY_DEBUG_OUTPUT(cond, msgtype, str) KY_DEBUG_OUTPUTN_IF(cond, msgtype, ("%s", str))
62  #define KY_DEBUG_OUTPUT1(cond, msgtype, str, p1) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1))
63  #define KY_DEBUG_OUTPUT2(cond, msgtype, str, p1, p2) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2))
64  #define KY_DEBUG_OUTPUT3(cond, msgtype, str, p1, p2, p3) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3))
65  #define KY_DEBUG_OUTPUT4(cond, msgtype, str, p1, p2, p3, p4) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3, p4))
66  #define KY_DEBUG_OUTPUT5(cond, msgtype, str, p1, p2, p3, p4, p5) KY_DEBUG_OUTPUTN_IF(cond, msgtype, (str, p1, p2, p3, p4, p5))
67  #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))
68 
69  // Assertion with messages
70  // Unlike KY_ASSERT, these macros display a message before breaking
71  #define KY_DEBUG_ASSERTN(cond, msg) do { if (!(cond)) { KY_DEBUG_OUTPUTN(Kaim::Log_DebugAssert, KY_LOG_SUFFIX(msg)); KY_DEBUG_BREAK; } } while (0)
72  #define KY_DEBUG_ASSERT(cond, str) KY_DEBUG_ASSERTN(cond, ("%s", str))
73  #define KY_DEBUG_ASSERT1(cond, str, p1) KY_DEBUG_ASSERTN(cond, (str, p1))
74  #define KY_DEBUG_ASSERT2(cond, str, p1, p2) KY_DEBUG_ASSERTN(cond, (str, p1, p2))
75  #define KY_DEBUG_ASSERT3(cond, str, p1, p2, p3) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3))
76  #define KY_DEBUG_ASSERT4(cond, str, p1, p2, p3, p4) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3, p4))
77  #define KY_DEBUG_ASSERT5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3, p4, p5))
78  #define KY_DEBUG_ASSERT6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_ASSERTN(cond, (str, p1, p2, p3, p4, p5, p6))
79 
80 
81 #else
82 
83  // Simple output with prefix tag
84  #define KY_DEBUG_OUTPUTN(msgtype, msg) ((void)0)
85  #define KY_DEBUG_OUTPUTN_IF(cond, msgtype, msg) ((void)0)
86  #define KY_DEBUG_OUTPUT(cond, msgtype, str ) ((void)0)
87  #define KY_DEBUG_OUTPUT1(cond, msgtype, str, p1) ((void)0)
88  #define KY_DEBUG_OUTPUT2(cond, msgtype, str, p1, p2) ((void)0)
89  #define KY_DEBUG_OUTPUT3(cond, msgtype, str, p1, p2, p3) ((void)0)
90  #define KY_DEBUG_OUTPUT4(cond, msgtype, str, p1, p2, p3, p4) ((void)0)
91  #define KY_DEBUG_OUTPUT5(cond, msgtype, str, p1, p2, p3, p4, p5) ((void)0)
92  #define KY_DEBUG_OUTPUT6(cond, msgtype, str, p1, p2, p3, p4, p5, p6) ((void)0)
93 
94  // Assertion with messages
95  // Unlike KY_ASSERT, these macros display a message before breaking
96  #define KY_DEBUG_ASSERTN(cond, msg) ((void)0)
97  #define KY_DEBUG_ASSERT(cond, str) ((void)0)
98  #define KY_DEBUG_ASSERT1(cond, str, p1) ((void)0)
99  #define KY_DEBUG_ASSERT2(cond, str, p1, p2) ((void)0)
100  #define KY_DEBUG_ASSERT3(cond, str, p1, p2, p3) ((void)0)
101  #define KY_DEBUG_ASSERT4(cond, str, p1, p2, p3, p4) ((void)0)
102  #define KY_DEBUG_ASSERT5(cond, str, p1, p2, p3, p4, p5) ((void)0)
103  #define KY_DEBUG_ASSERT6(cond, str, p1, p2, p3, p4, p5, p6) ((void)0)
104 
105 #endif // KY_CONFIG_DEBUG
106 
107 
108 // KY_DEBUG_WARNINGN, KY_DEBUG_ERRORN_IF, KY_DEBUG_MESSAGEN... usage:
109 // KY_DEBUG_XXXXXXN(x == 0, (msg is printf args with parenthesis %s %d, "some string", "some int"))
110 
111 // Conditional warnings - "SF Warning: " prefix
112 #define KY_DEBUG_WARNINGN(msg) do { KY_DEBUG_OUTPUTN(Kaim::Log_DebugWarning, KY_LOG_SUFFIX(msg)); } while (0)
113 #define KY_DEBUG_WARNINGN_IF(cond, msg) do { if (cond) { KY_DEBUG_WARNINGN(msg); } } while (0)
114 #define KY_DEBUG_WARNING(cond, str) KY_DEBUG_WARNINGN_IF(cond, ("%s", str))
115 #define KY_DEBUG_WARNING1(cond, str, p1) KY_DEBUG_WARNINGN_IF(cond, (str, p1))
116 #define KY_DEBUG_WARNING2(cond, str, p1, p2) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2))
117 #define KY_DEBUG_WARNING3(cond, str, p1, p2, p3) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3))
118 #define KY_DEBUG_WARNING4(cond, str, p1, p2, p3, p4) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3,p4))
119 #define KY_DEBUG_WARNING5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3,p4,p5))
120 #define KY_DEBUG_WARNING6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_WARNINGN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
121 
122 // Conditional errors - "SF Error: " prefix
123 #define KY_DEBUG_ERRORN(msg) do { KY_DEBUG_OUTPUTN(Kaim::Log_DebugError, KY_LOG_SUFFIX(msg)); } while (0)
124 #define KY_DEBUG_ERRORN_IF(cond, msg) do { if (cond) { KY_DEBUG_ERRORN(msg); } } while (0)
125 #define KY_DEBUG_ERROR(cond, str) KY_DEBUG_ERRORN_IF(cond, ("%s", str))
126 #define KY_DEBUG_ERROR1(cond, str, p1) KY_DEBUG_ERRORN_IF(cond, (str, p1))
127 #define KY_DEBUG_ERROR2(cond, str, p1, p2) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2))
128 #define KY_DEBUG_ERROR3(cond, str, p1, p2, p3) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3))
129 #define KY_DEBUG_ERROR4(cond, str, p1, p2, p3, p4) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3,p4))
130 #define KY_DEBUG_ERROR5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3,p4,p5))
131 #define KY_DEBUG_ERROR6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_ERRORN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
132 // Conditional messages - no prefix
133 #define KY_DEBUG_MESSAGEN(msg) KY_DEBUG_OUTPUTN(Kaim::Log_DebugMessage, msg)
134 #define KY_DEBUG_MESSAGEN_IF(cond, msg) KY_DEBUG_OUTPUTN_IF(cond, Kaim::Log_DebugMessage, msg)
135 #define KY_DEBUG_MESSAGE(cond, str) KY_DEBUG_MESSAGEN_IF(cond, ("%s", str))
136 #define KY_DEBUG_MESSAGE1(cond, str, p1) KY_DEBUG_MESSAGEN_IF(cond, (str, p1))
137 #define KY_DEBUG_MESSAGE2(cond, str, p1, p2) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2))
138 #define KY_DEBUG_MESSAGE3(cond, str, p1, p2, p3) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3))
139 #define KY_DEBUG_MESSAGE4(cond, str, p1, p2, p3, p4) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3,p4))
140 #define KY_DEBUG_MESSAGE5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3,p4,p5))
141 #define KY_DEBUG_MESSAGE6(cond, str, p1, p2, p3, p4, p5, p6) KY_DEBUG_MESSAGEN_IF(cond, (str, p1,p2,p3,p4,p5,p6))
142 // Conditional messages with '\n' - no prefix
143 #define KY_DEBUG_MESSAGE_LINEN(msg) do { KY_DEBUG_OUTPUTN(Kaim::Log_DebugMessage, KY_LOG_SUFFIX(msg)); } while (0)
144 #define KY_DEBUG_MESSAGE_LINEN_IF(cond, msg) do { if (cond) { KY_DEBUG_MESSAGE_LINEN(msg); } } while (0)
145 #define KY_DEBUG_MESSAGE_LINE(cond, str) KY_DEBUG_MESSAGE_LINEN_IF(cond, ("%s", str))
146 #define KY_DEBUG_MESSAGE_LINE1(cond, str, p1) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1))
147 #define KY_DEBUG_MESSAGE_LINE2(cond, str, p1, p2) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2))
148 #define KY_DEBUG_MESSAGE_LINE3(cond, str, p1, p2, p3) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3))
149 #define KY_DEBUG_MESSAGE_LINE4(cond, str, p1, p2, p3, p4) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3,p4))
150 #define KY_DEBUG_MESSAGE_LINE5(cond, str, p1, p2, p3, p4, p5) KY_DEBUG_MESSAGE_LINEN_IF(cond, (str, p1,p2,p3,p4,p5))
151 #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))
152 
153 // Convenient simple type value object output
154 // - v must be a stack object
155 #define KY_DEBUG_SINT(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%d)\n", int(v))
156 #define KY_DEBUG_UINT(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%u)\n", unsigned(v))
157 #define KY_DEBUG_HEX(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(0x%X)\n", unsigned(v))
158 #define KY_DEBUG_FLOAT(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%f)\n", double(v))
159 #define KY_DEBUG_DOUBLE(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%f)\n", double(v))
160 #define KY_DEBUG_CHAR(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%c)\n", char(v))
161 #define KY_DEBUG_WCHAR(v) KY_DEBUG_OUTPUT1(1, Kaim::Log_DebugMessage, #v "(%lc)\n", wchar_t(v))
162 
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17