Add STATIC_ASSERT() macro and use it
authorkwolekr <kwolekr@minetest.net>
Wed, 28 Oct 2015 02:27:32 +0000 (22:27 -0400)
committerkwolekr <kwolekr@minetest.net>
Wed, 28 Oct 2015 02:27:32 +0000 (22:27 -0400)
src/basicmacros.h
src/log.cpp

index cebf06043a1ca59432ed35d37a6eaf677513bb02..2a30a31d23ad4d3c28628861d35c65ba11652652 100644 (file)
@@ -38,4 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
        C(const C &);             \
        C &operator=(const C &)
 
+// Fail compilation if condition expr is not met.
+// Note that 'msg' must follow the format of a valid identifier, e.g.
+// STATIC_ASSERT(sizeof(foobar_t) == 40), foobar_t_is_wrong_size);
+#define STATIC_ASSERT(expr, msg) typedef char msg[!!(expr) * 2 - 1]
+
 #endif
index 3ffd66673413a367e5acbbb1f86a2d0bbb0f7184..5cba8f70056a53ccd90199e9df656ef7c1f407dc 100644 (file)
@@ -135,7 +135,8 @@ class AndroidSystemLogOutput : public ICombinedLogOutput {
                }
                void logRaw(LogLevel lev, const std::string &line)
                {
-                       assert(ARRLEN(g_level_to_android) == LL_MAX);
+                       STATIC_ASSERT(ARRLEN(g_level_to_android) == LL_MAX,
+                               mismatch_between_android_and_internal_loglevels);
                        __android_log_print(g_level_to_android[lev],
                                PROJECT_NAME_C, "%s", line.c_str());
                }
@@ -228,7 +229,8 @@ const std::string Logger::getLevelLabel(LogLevel lev)
                "VERBOSE",
        };
        assert(lev < LL_MAX && lev >= 0);
-       assert(ARRLEN(names) == LL_MAX);
+       STATIC_ASSERT(ARRLEN(names) == LL_MAX,
+               mismatch_between_loglevel_names_and_enum);
        return names[lev];
 }