expect.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #pragma once
  2. #include <iostream>
  3. #include <sstream>
  4. #if defined(__clang__) || defined(__GNUC__)
  5. #define JVALIDATE_LIKELY(x) __builtin_expect(!!(x), 1)
  6. #define JVALIDATE_UNLIKELY(x) __builtin_expect(!!(x), 0)
  7. #else
  8. #define JVALIDATE_LIKELY(x) (x)
  9. #define JVALIDATE_UNLIKELY(x) (x)
  10. #endif
  11. #if defined(JVALIDATE_USE_EXCEPTIONS)
  12. #define JVALIDATE_THROW(extype, message) \
  13. do { \
  14. std::stringstream ss; \
  15. ss << message; \
  16. throw extype(ss.str()); \
  17. } while (false)
  18. #else
  19. #define JVALIDATE_THROW(extype, message) \
  20. do { \
  21. std::cerr << message << std::endl; \
  22. std::terminate(); \
  23. } while (false)
  24. #endif
  25. #define EXPECT_T(condition, extype, message) \
  26. if (JVALIDATE_UNLIKELY(!(condition))) { \
  27. JVALIDATE_THROW(extype, message); \
  28. }
  29. #define EXPECT_M(condition, message) EXPECT_T(condition, std::runtime_error, message)
  30. #define EXPECT(condition) EXPECT_M(condition, #condition)
  31. #define RETURN_UNLESS(condition, ...) \
  32. if (JVALIDATE_UNLIKELY(!(condition))) { \
  33. return __VA_ARGS__; \
  34. }