1 /* Copyright Jukka Jyl�nki
2
3    Licensed under the Apache License, Version 2.0 (the "License");
4    you may not use this file except in compliance with the License.
5    You may obtain a copy of the License at
6
7        http://www.apache.org/licenses/LICENSE-2.0
8
9    Unless required by applicable law or agreed to in writing, software
10    distributed under the License is distributed on an "AS IS" BASIS,
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12    See the License for the specific language governing permissions and
13    limitations under the License. */
14
15 /** @file Log.h
16         @author Jukka Jyl�nki
17         @brief The LOG and LOGUSER macros. Provides an unified mechanism for logging. */
18 #pragma once
19
20 #include "MathNamespace.h"
21
22 MATH_BEGIN_NAMESPACE
23
24 // From http://cnicholson.net/2009/03/stupid-c-tricks-dowhile0-and-c4127/
25 #ifdef _MSC_VER
26 #define MULTI_LINE_MACRO_BEGIN do { \
27         __pragma(warning(push)) \
28         __pragma(warning(disable:4127))
29
30 #define MULTI_LINE_MACRO_END \
31         } while(0) \
32         __pragma(warning(pop))
33
34 #else
35
36 #define MULTI_LINE_MACRO_BEGIN do {
37 #define MULTI_LINE_MACRO_END } while(0)
38
39 #endif
40
41 /// A bitfield type that describes single or multiple log channels (each bit represents a channel).
42 typedef unsigned int MathLogChannel;
43
44 namespace
45 {
46 const MathLogChannel MathLogInfo = 1;
47 const MathLogChannel MathLogError = 2;
48 const MathLogChannel MathLogWarning = 4;
49 const MathLogChannel MathLogErrorNoCallstack = MathLogError|65536;
50 const MathLogChannel MathLogWarningNoCallstack = MathLogWarning|65536;
51 }
52
53 void PrintToConsoleVariadic(MathLogChannel channel, const char *format, ...);
54 void PrintToConsole(MathLogChannel channel, const char *str);
55
56 #define STRINGIZE_HELPER(x) #x
57 #define STRINGIZE(x) STRINGIZE_HELPER(x)
58 #define WARNING(desc) message(__FILE__ "(" STRINGIZE(__LINE__) ") : warning: " #desc)
59
60 #ifndef LOGGING_SUPPORT_DISABLED
61
62 #define LOGI(...) PrintToConsoleVariadic(MathLogInfo, __VA_ARGS__)
63 #define LOGW(...) PrintToConsoleVariadic(MathLogWarning, __VA_ARGS__)
64 #define LOGE(...) PrintToConsoleVariadic(MathLogError, __VA_ARGS__)
65 #define LOG(channel, ...) PrintToConsoleVariadic(channel, __VA_ARGS__)
66
67 #else
68
69 #define LOG(...) ((void)0)
70 #define LOGE(...) ((void)0)
71 #define LOGW(...) ((void)0)
72 #define LOGI(...) ((void)0)
73
74 #endif
75
76 MATH_END_NAMESPACE

Go back to previous page