#pragma once #include #include #if defined(__clang__) || defined(__GNUC__) #define JVALIDATE_LIKELY(x) __builtin_expect(!!(x), 1) #define JVALIDATE_UNLIKELY(x) __builtin_expect(!!(x), 0) #else #define JVALIDATE_LIKELY(x) (x) #define JVALIDATE_UNLIKELY(x) (x) #endif #if defined(JVALIDATE_USE_EXCEPTIONS) #define JVALIDATE_THROW(extype, message) \ do { \ std::stringstream ss; \ ss << message; \ throw extype(ss.str()); \ } while (false) #else #define JVALIDATE_THROW(extype, message) \ do { \ std::cerr << message << std::endl; \ std::terminate(); \ } while (false) #endif #define EXPECT_T(condition, extype, message) \ if (JVALIDATE_UNLIKELY(!(condition))) { \ JVALIDATE_THROW(extype, message); \ } #define EXPECT_M(condition, message) EXPECT_T(condition, std::runtime_error, message) #define EXPECT(condition) EXPECT_M(condition, #condition) #define RETURN_UNLESS(condition, ...) \ if (JVALIDATE_UNLIKELY(!(condition))) { \ return __VA_ARGS__; \ }