logog
logger optimized for games
macro.hpp
Go to the documentation of this file.
1 
5 #ifndef __LOGOG_MACRO_HPP__
6 #define __LOGOG_MACRO_HPP__
7 
8 namespace logog
9 {
10 #ifdef LOGOG_USE_PREFIX
11 #define LOGOG_PREFIX LOGOG_
12 #endif // LOGOG_USE_PREFIX
13 
14 #ifndef LOGOG_GROUP
15 
18 #define LOGOG_GROUP NULL
19 #endif
20 
21 #ifndef LOGOG_CATEGORY
22 
25 #define LOGOG_CATEGORY NULL
26 #endif
27 
33 #define TOKENPASTE2(x, y) x ## y
34 
35 #define TOKENPASTE(x, y) TOKENPASTE2(x, y)
36 
41 #define LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE_NO_VA( level, group, cat, msg ) \
42 { \
43  Mutex *___pMCM = &GetMessageCreationMutex(); \
44  ___pMCM->MutexLock(); \
45  static logog::Message *TOKENPASTE(_logog_,__LINE__) = new logog::Message( level, \
46  LOGOG_CONST_STRING( __FILE__ ), \
47  __LINE__ , \
48  LOGOG_CONST_STRING( group ), \
49  LOGOG_CONST_STRING( cat ), \
50  msg; \
51  ___pMCM->MutexUnlock(); \
52  TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexLock(); \
53  TOKENPASTE(_logog_,__LINE__)->Transmit(); \
54  TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexUnlock(); \
55 }
56 
76 #define LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE( level, group, cat, formatstring, ... ) \
77 LOGOG_MICROSOFT_PRAGMA_IN_MACRO(warning(push)) \
78 LOGOG_MICROSOFT_PRAGMA_IN_MACRO(warning(disable : 4127 )) \
79 do \
80 { \
81  ::logog::Mutex *___pMCM = &::logog::GetMessageCreationMutex(); \
82  ___pMCM->MutexLock(); \
83  static bool TOKENPASTE(_logog_static_bool_,__LINE__) = false; \
84  static logog::Message * TOKENPASTE(_logog_,__LINE__); \
85  if ( TOKENPASTE(_logog_static_bool_,__LINE__) == false ) \
86  { \
87  TOKENPASTE(_logog_,__LINE__) = \
88  new logog::Message( level, \
89  LOGOG_CONST_STRING( __FILE__ ), \
90  __LINE__ , \
91  LOGOG_CONST_STRING( group ), \
92  LOGOG_CONST_STRING( cat ), \
93  LOGOG_CONST_STRING( "" ), \
94  0.0f, \
95  & (TOKENPASTE(_logog_static_bool_,__LINE__)) ); \
96  } \
97  ___pMCM->MutexUnlock(); \
98  /* A race condition could theoretically occur here if you are shutting down at the same instant as sending log messages. */ \
99  TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexLock(); \
100  TOKENPASTE(_logog_,__LINE__)->Format( formatstring, ##__VA_ARGS__ ); \
101  TOKENPASTE(_logog_,__LINE__)->Transmit(); \
102  TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexUnlock(); \
103 } while (false) \
104 LOGOG_MICROSOFT_PRAGMA_IN_MACRO(warning(pop))
105 
109 #define LOGOG_LEVEL_MESSAGE( level, formatstring, ... ) \
110  LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE( level, LOGOG_GROUP, LOGOG_CATEGORY, formatstring, ##__VA_ARGS__ )
111 
113 #define LOGOG_MESSAGE( formatstring, ... ) \
114  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL, formatstring, ##__VA_ARGS__ )
115 
116 
117 #if LOGOG_LEVEL >= LOGOG_LEVEL_DEBUG
118 
119 #define LOGOG_DEBUG( formatstring, ... ) \
120  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_DEBUG, formatstring, ##__VA_ARGS__ )
121 #else
122 #define LOGOG_DEBUG( formatstring, ... ) do {} while (false)
123 #endif
124 
125 #if LOGOG_LEVEL >= LOGOG_LEVEL_INFO
126 
127 #define LOGOG_INFO( formatstring, ... ) \
128  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_INFO, formatstring, ##__VA_ARGS__ )
129 #else
130 #define LOGOG_INFO( formatstring, ... ) do {} while (false)
131 #endif
132 
133 #if LOGOG_LEVEL >= LOGOG_LEVEL_WARN3
134 
135 #define LOGOG_WARN3( formatstring, ... ) \
136  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN3, formatstring, ##__VA_ARGS__ )
137 #else
138 #define LOGOG_WARN3( formatstring, ... ) do {} while (false)
139 #endif
140 
141 #if LOGOG_LEVEL >= LOGOG_LEVEL_WARN2
142 
143 #define LOGOG_WARN2( formatstring, ... ) \
144  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN2, formatstring, ##__VA_ARGS__ )
145 #else
146 #define LOGOG_WARN2( formatstring, ... ) do {} while (false)
147 #endif
148 
149 #if LOGOG_LEVEL >= LOGOG_LEVEL_WARN1
150 
151 #define LOGOG_WARN1( formatstring, ... ) \
152  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN1, formatstring, ##__VA_ARGS__ )
153 #else
154 #define LOGOG_WARN1( formatstring, ... ) do {} while (false)
155 #endif
156 
157 #if LOGOG_LEVEL >= LOGOG_LEVEL_WARN
158 
159 #define LOGOG_WARN( formatstring, ... ) \
160  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN, formatstring, ##__VA_ARGS__ )
161 #else
162 #define LOGOG_WARN( formatstring, ... ) do {} while (false)
163 #endif
164 
165 #if LOGOG_LEVEL >= LOGOG_LEVEL_ERROR
166 
167 #define LOGOG_ERROR( formatstring, ... ) \
168  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_ERROR, formatstring, ##__VA_ARGS__ )
169 #else
170 #define LOGOG_ERROR( formatstring, ... ) do {} while (false)
171 #endif
172 
173 #if LOGOG_LEVEL >= LOGOG_LEVEL_CRITICAL
174 
175 #define LOGOG_CRITICAL( formatstring, ... ) \
176  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_CRITICAL, formatstring, ##__VA_ARGS__ )
177 #else
178 #define LOGOG_CRITICAL( formatstring, ... ) do {} while (false)
179 #endif
180 
181 #if LOGOG_LEVEL >= LOGOG_LEVEL_ALERT
182 
183 #define LOGOG_ALERT( formatstring, ... ) \
184  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_ALERT, formatstring, ##__VA_ARGS__ )
185 #else
186 #define LOGOG_ALERT( formatstring, ... ) do {} while (false)
187 #endif
188 
189 #if LOGOG_LEVEL >= LOGOG_LEVEL_EMERGENCY
190 
191 #define LOGOG_EMERGENCY( formatstring, ... ) \
192  LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_EMERGENCY, formatstring, ##__VA_ARGS__ )
193 #else
194 #define LOGOG_EMERGENCY( formatstring, ... ) do {} while (false)
195 #endif
196 
197 #define LOGOG_SET_LEVEL( level ) \
198  ::logog::SetDefaultLevel( level );
199 
203 #ifndef LOGOG_USE_PREFIX
204 /* If you get compilation errors in this section, then define the flag LOGOG_USE_PREFIX during compilation, and these
205  * shorthand logging macros won't exist -- you'll need to use the LOGOG_* equivalents above.
206  */
207 /* We can't use DEBUG in Win32 unfortunately, so we use DBUG for shorthand here. */
209 
210 #define DBUG(...) LOGOG_DEBUG( __VA_ARGS__ )
211 
212 #define INFO(...) LOGOG_INFO( __VA_ARGS__ )
213 
214 #define WARN3(...) LOGOG_WARN3( __VA_ARGS__ )
215 
216 #define WARN2(...) LOGOG_WARN2( __VA_ARGS__ )
217 
218 #define WARN1(...) LOGOG_WARN1( __VA_ARGS__ )
219 
220 #define WARN(...) LOGOG_WARN( __VA_ARGS__ )
221 
222 #define ERR(...) LOGOG_ERROR( __VA_ARGS__ )
223 
224 #define ALERT(...) LOGOG_ALERT( __VA_ARGS__ )
225 
226 #define CRITICAL(...) LOGOG_CRITICAL( __VA_ARGS__ )
227 
228 #define EMERGENCY(...) LOGOG_EMERGENCY( __VA_ARGS__ )
229 #endif
231 
235 #define LOGOG_INITIALIZE(...) logog::Initialize( __VA_ARGS__ )
236 
240 #define LOGOG_SHUTDOWN() logog::Shutdown()
241 
242 } // namespace logog
243 
244 #endif // __LOGOG_MACRO_HPP_
[Thread]
Definition: api.hpp:8