error.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright 2010-2016 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #ifndef BX_ERROR_H_HEADER_GUARD
  6. #define BX_ERROR_H_HEADER_GUARD
  7. #include "bx.h"
  8. #define BX_ERROR_SET(_ptr, _result, _msg) \
  9. BX_MACRO_BLOCK_BEGIN \
  10. BX_TRACE("Error %d: %s", _result.code, "" _msg); \
  11. _ptr->setError(_result, "" _msg); \
  12. BX_MACRO_BLOCK_END
  13. #define BX_ERROR_USE_TEMP_WHEN_NULL(_ptr) \
  14. const bx::Error tmpError; /* It should not be used directly! */ \
  15. _ptr = NULL == _ptr ? const_cast<bx::Error*>(&tmpError) : _ptr
  16. #define BX_ERROR_SCOPE(_ptr) \
  17. BX_ERROR_USE_TEMP_WHEN_NULL(_ptr); \
  18. bx::ErrorScope bxErrorScope(const_cast<bx::Error*>(&tmpError) )
  19. #define BX_ERROR_RESULT(_err, _code) \
  20. BX_STATIC_ASSERT(_code != 0, "ErrorCode 0 is reserved!"); \
  21. static const bx::ErrorResult _err = { _code }
  22. namespace bx
  23. {
  24. ///
  25. struct ErrorResult
  26. {
  27. uint32_t code;
  28. };
  29. ///
  30. class Error
  31. {
  32. BX_CLASS(Error
  33. , NO_COPY
  34. , NO_ASSIGNMENT
  35. );
  36. public:
  37. Error()
  38. : m_code(0)
  39. {
  40. }
  41. void setError(ErrorResult _errorResult, const char* _msg)
  42. {
  43. BX_CHECK(0 != _errorResult.code, "Invalid ErrorResult passed to setError!");
  44. if (!isOk() )
  45. {
  46. return;
  47. }
  48. m_code = _errorResult.code;
  49. m_msg = _msg;
  50. }
  51. bool isOk() const
  52. {
  53. return 0 == m_code;
  54. }
  55. ErrorResult get() const
  56. {
  57. ErrorResult result = { m_code };
  58. return result;
  59. }
  60. bool operator==(ErrorResult _rhs) const
  61. {
  62. return _rhs.code == m_code;
  63. }
  64. private:
  65. const char* m_msg;
  66. uint32_t m_code;
  67. };
  68. ///
  69. class ErrorScope
  70. {
  71. BX_CLASS(ErrorScope
  72. , NO_COPY
  73. , NO_ASSIGNMENT
  74. );
  75. public:
  76. ErrorScope(Error* _err)
  77. : m_err(_err)
  78. {
  79. BX_CHECK(NULL != _err, "_err can't be NULL");
  80. }
  81. ~ErrorScope()
  82. {
  83. BX_CHECK(m_err->isOk(), "Error: %d", m_err->get().code);
  84. }
  85. private:
  86. Error* m_err;
  87. };
  88. } // namespace bx
  89. #endif // BX_ERROR_H_HEADER_GUARD