error.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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==(const ErrorResult& _rhs) const
  61. {
  62. return _rhs.code == m_code;
  63. }
  64. bool operator!=(const ErrorResult& _rhs) const
  65. {
  66. return _rhs.code != m_code;
  67. }
  68. private:
  69. const char* m_msg;
  70. uint32_t m_code;
  71. };
  72. ///
  73. class ErrorScope
  74. {
  75. BX_CLASS(ErrorScope
  76. , NO_COPY
  77. , NO_ASSIGNMENT
  78. );
  79. public:
  80. ErrorScope(Error* _err)
  81. : m_err(_err)
  82. {
  83. BX_CHECK(NULL != _err, "_err can't be NULL");
  84. }
  85. ~ErrorScope()
  86. {
  87. BX_CHECK(m_err->isOk(), "Error: %d", m_err->get().code);
  88. }
  89. private:
  90. Error* m_err;
  91. };
  92. } // namespace bx
  93. #endif // BX_ERROR_H_HEADER_GUARD