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 myassert.h
16         @author Jukka Jyl�nki
17         @brief Control over assert() macro for MathGeoLib. */
18 #include "MathLog.h"
19 #include "assume.h"
20
21 #include <sstream>
22
23 #ifdef assert
24 #undef assert
25 #endif
26
27 #ifdef FAIL_USING_EXCEPTIONS
28 #include <stdexcept>
29 #define RuntimeFailure(str) throw std::runtime_error(str)
30 #elif defined(OPTIMIZED_RELEASE) || defined(NDEBUG)
31 #define RuntimeFailure(str) ((void)0)
32 #define RUNTIME_FAILURE_DISABLED
33 #elif defined(_MSC_VER)
34 #include <crtdbg.h>
35 #define RuntimeFailure(str) do { LOGE("%s", str); _CrtDbgBreak(); } while(0)
36 #else
37 #define RuntimeFailure(str) do { LOGE("%s", str); } while(0)
38 #endif
39
40 #ifdef RUNTIME_FAILURE_DISABLED
41
42 #define assert(x) ((void)0)
43 #define asserteq(x,y) ((void)0)
44 #define assertcmp(x, cmp, y) ((void)0)
45
46 // If defined in a compilation unit, MATH_IGNORE_UNUSED_VARS_WARNING will kill all subsequent warnings about variables going unused.
47 // This occurs commonly in unit tests that are also doubled as benchmarks - killing the use of assert() macro will leave variables
48 // that were otherwise not used, except when assert()ing a condition. As a simplest measure, MATH_IGNORE_UNUSED_VARS_WARNING will
49 // operate only when assert() is a no-op, so that in debug builds etc. real instances of unused variables are still caught.
50 #ifdef _MSC_VER
51 #define MATH_IGNORE_UNUSED_VARS_WARNING __pragma(warning(disable:4189)) // C4189: 'variableName' : local variable is initialized but not referenced
52 #elif defined(__GNUC__) && (__GNUC__*10000+__GNUC_MINOR*100) >= 40600
53 // GCC 4.6 introduced a new warning "-Wunused-but-set-variable", so suppress that on those compilers.
54 #define MATH_IGNORE_UNUSED_VARS_WARNING _Pragma("GCC diagnostic ignored \"-Wunused-variable\"") _Pragma("GCC diagnostic ignored \"-Wunused-but-set-variable\"")
55 #else
56 #define MATH_IGNORE_UNUSED_VARS_WARNING _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
57 #endif
58
59 #else
60
61 #define MATH_IGNORE_UNUSED_VARS_WARNING
62
63 #define assert(x) \
64         MULTI_LINE_MACRO_BEGIN \
65                 if (!(x)) \
66                 { \
67                         const char *error = #x " in " __FILE__ ":" STRINGIZE(__LINE__); \
68                         MARK_UNUSED(error); /* Appease cppcheck to not complain that error is unused. */ \
69                         RuntimeFailure(error); \
70                 } \
71         MULTI_LINE_MACRO_END
72
73 #define asserteq(x,y) \
74         MULTI_LINE_MACRO_BEGIN \
75                 if ((x) != (y)) \
76                 { \
77                         std::stringstream std_stringstream; \
78                         std_stringstream << "Assertion '" #x "' == '" #y "' failed! (" << (x) << " != " << (y) << "!) in " __FILE__ ":" STRINGIZE(__LINE__); \
79                         RuntimeFailure(std_stringstream.str().c_str()); \
80                 } \
81         MULTI_LINE_MACRO_END
82
83 #define assertcmp(x, cmp, y) \
84         MULTI_LINE_MACRO_BEGIN \
85                 if (!((x) cmp (y))) \
86                 { \
87                         std::stringstream std_stringstream; \
88                         std_stringstream << "Assertion '" #x "' " #cmp " '" #y "' failed! (" << (x) << " and " << (y) << "!) in " __FILE__ ":" STRINGIZE(__LINE__); \
89                         RuntimeFailure(std_stringstream.str().c_str()); \
90                 } \
91         MULTI_LINE_MACRO_END
92
93 #endif

Go back to previous page