summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
Diffstat (limited to 'compat')
-rw-r--r--compat/assert.cpp38
-rw-r--r--compat/assert.hpp49
2 files changed, 56 insertions, 31 deletions
diff --git a/compat/assert.cpp b/compat/assert.cpp
index cd6e9af3..3f030b6b 100644
--- a/compat/assert.cpp
+++ b/compat/assert.cpp
@@ -1,4 +1,5 @@
#include "assert.hpp"
+#include "exception.hpp"
#include <cstdlib>
#include <cstdio>
#include <cstdarg>
@@ -7,13 +8,15 @@
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
#endif
-namespace floormat {
+namespace floormat::debug::detail {
namespace {
+bool do_soft_assert = false;
+
template<bool DoPrefix, bool DoSourceLocation>
CORRADE_NEVER_INLINE
-void fm_emit_debug_(const char* prefix, const char* file, int line, const char* fmt, va_list arg_ptr)
+void emit_debug_(const char* prefix, const char* file, int line, const char* fmt, va_list arg_ptr)
{
std::fflush(stdout);
std::fflush(stderr);
@@ -29,31 +32,31 @@ void fm_emit_debug_(const char* prefix, const char* file, int line, const char*
} // namespace
-void fm_emit_debug(const char* prefix, fm_FORMAT_ARG_MSVC const char* fmt, ...)
+void emit_debug(const char* prefix, fm_FORMAT_ARG_MSVC const char* fmt, ...)
{
va_list arg_ptr;
va_start(arg_ptr, fmt);
- fm_emit_debug_<true, false>(prefix, nullptr, 0, fmt, arg_ptr);
+ emit_debug_<true, false>(prefix, nullptr, 0, fmt, arg_ptr);
va_end(arg_ptr);
}
-void fm_emit_debug0(fm_FORMAT_ARG_MSVC const char* fmt, ...)
+void emit_debug0(fm_FORMAT_ARG_MSVC const char* fmt, ...)
{
va_list arg_ptr;
va_start(arg_ptr, fmt);
- fm_emit_debug_<false, false>(nullptr, nullptr, 0, fmt, arg_ptr);
+ emit_debug_<false, false>(nullptr, nullptr, 0, fmt, arg_ptr);
va_end(arg_ptr);
}
-void CORRADE_NEVER_INLINE fm_emit_debug_loc(const char* prefix, const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...)
+void CORRADE_NEVER_INLINE emit_debug_loc(const char* prefix, const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...)
{
va_list arg_ptr;
va_start(arg_ptr, fmt);
- fm_emit_debug_<true, true>(prefix, file, line, fmt, arg_ptr);
+ emit_debug_<true, true>(prefix, file, line, fmt, arg_ptr);
va_end(arg_ptr);
}
-void fm_emit_assert_fail(const char* expr, const char* file, int line)
+void emit_assert_fail(const char* expr, const char* file, int line)
{
std::fflush(stdout);
std::fflush(stderr);
@@ -62,20 +65,29 @@ void fm_emit_assert_fail(const char* expr, const char* file, int line)
std::abort();
}
-void fm_emit_abort(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...)
+void emit_abort(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...)
{
va_list arg_ptr;
va_start(arg_ptr, fmt);
- fm_emit_debug_<true, true>("fatal: ", file, line, fmt, arg_ptr);
+ emit_debug_<true, true>("fatal: ", file, line, fmt, arg_ptr);
va_end(arg_ptr);
std::abort();
}
-void fm_emit_abort()
+void emit_abort()
{
std::fflush(stdout);
std::fflush(stderr);
std::abort();
}
-} // namespace floormat
+} // namespace floormat::debug::detail
+
+using namespace floormat::debug::detail;
+
+namespace floormat::debug {
+
+void set_soft_assert_mode(bool value) { do_soft_assert = value; }
+bool soft_assert_mode() { return detail::do_soft_assert; }
+
+} // namespace floormat::debug
diff --git a/compat/assert.hpp b/compat/assert.hpp
index 3daf33ce..1333c6a6 100644
--- a/compat/assert.hpp
+++ b/compat/assert.hpp
@@ -12,16 +12,29 @@
#define fm_FORMAT_ARG_MSVC
#endif
-namespace floormat {
+namespace floormat::debug::detail {
+
+void emit_debug(const char* prefix, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(2);
+void emit_debug0(fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(1);
+void emit_debug_loc(const char* prefix, const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(4);
+void emit_debug_loc0(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(3);
+
+[[noreturn]] CORRADE_NEVER_INLINE void emit_assert_fail(const char* expr, const char* file, int line);
+[[noreturn]] CORRADE_NEVER_INLINE void emit_abort(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(3);
+[[noreturn]] CORRADE_NEVER_INLINE void emit_abort();
+
+} // namespace floormat::debug::detail
+
-void fm_emit_debug(const char* prefix, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(2);
-void fm_emit_debug0(fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(1);
-void fm_emit_debug_loc(const char* prefix, const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(4);
-void fm_emit_debug_loc0(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(3);
+namespace floormat::debug {
-[[noreturn]] CORRADE_NEVER_INLINE void fm_emit_assert_fail(const char* expr, const char* file, int line);
-[[noreturn]] CORRADE_NEVER_INLINE void fm_emit_abort(const char* file, int line, fm_FORMAT_ARG_MSVC const char* fmt, ...) fm_FORMAT_ARG(3);
-[[noreturn]] CORRADE_NEVER_INLINE void fm_emit_abort();
+void set_soft_assert_mode(bool value);
+bool soft_assert_mode();
+
+} // namespace floormat::debug
+
+
+namespace floormat {
} // namespace floormat
@@ -30,14 +43,14 @@ void fm_emit_debug_loc0(const char* file, int line, fm_FORMAT_ARG_MSVC const cha
#pragma GCC diagnostic ignored "-Wunused-macros"
#endif
-#define fm_assert(...) ((__VA_ARGS__) ? void() : ::floormat::fm_emit_assert_fail(#__VA_ARGS__, __FILE__, __LINE__))
-#define fm_abort(...) (::floormat::fm_emit_abort(__FILE__, __LINE__, __VA_ARGS__))
-#define fm_warn(...) (::floormat::fm_emit_debug("warning: ", __VA_ARGS__))
-#define fm_error(...) (::floormat::fm_emit_debug("error: ", __VA_ARGS__))
-#define fm_log(...) (::floormat::fm_emit_debug0(__VA_ARGS__))
-#define fm_debug(...) (::floormat::fm_emit_debug0(__VA_ARGS__))
-#define fm_debug_loc(pfx, ...) (::floormat::fm_emit_debug_loc(pfx, __FILE__, __LINE__,__VA_ARGS__))
-#define fm_debug_loc0(...) (::floormat::fm_emit_debug_loc0(__FILE__, __LINE__,__VA_ARGS__))
+#define fm_assert(...) ((__VA_ARGS__) ? void() : ::floormat::debug::detail::emit_assert_fail(#__VA_ARGS__, __FILE__, __LINE__))
+#define fm_abort(...) (::floormat::debug::detail::emit_abort(__FILE__, __LINE__, __VA_ARGS__))
+#define fm_warn(...) (::floormat::debug::detail::emit_debug("warning: ", __VA_ARGS__))
+#define fm_error(...) (::floormat::debug::detail::emit_debug("error: ", __VA_ARGS__))
+#define fm_log(...) (::floormat::debug::detail::emit_debug0(__VA_ARGS__))
+#define fm_debug(...) (::floormat::debug::detail::emit_debug0(__VA_ARGS__))
+#define fm_debug_loc(pfx, ...) (::floormat::debug::detail::emit_debug_loc(pfx, __FILE__, __LINE__,__VA_ARGS__))
+#define fm_debug_loc0(...) (::floormat::debug::detail::emit_debug_loc0(__FILE__, __LINE__,__VA_ARGS__))
#if defined FM_NO_DEBUG && !defined FM_NO_DEBUG2
#define FM_NO_DEBUG2
@@ -76,7 +89,7 @@ void fm_emit_debug_loc0(const char* file, int line, fm_FORMAT_ARG_MSVC const cha
ERR_nospace << #__VA_ARGS__; \
ERR_nospace << " expected: " << a; \
ERR_nospace << " actual: " << b; \
- fm_emit_abort(); \
+ ::floormat::debug::detail::emit_abort(); \
} \
})(__VA_ARGS__)
@@ -93,7 +106,7 @@ void fm_emit_debug_loc0(const char* file, int line, fm_FORMAT_ARG_MSVC const cha
ERR_nospace << #__VA_ARGS__; \
ERR_nospace << "not expected: " << a; \
ERR_nospace << " actual: " << b; \
- fm_emit_abort(); \
+ ::floormat::debug::detail::emit_abort(); \
} \
})(__VA_ARGS__)