macros.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright 2010-2013 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef BX_MACROS_H_HEADER_GUARD
  6. #define BX_MACROS_H_HEADER_GUARD
  7. #include "bx.h"
  8. #if BX_COMPILER_MSVC
  9. // Workaround MSVS bug...
  10. # define BX_VA_ARGS_PASS(...) BX_VA_ARGS_PASS_1_ __VA_ARGS__ BX_VA_ARGS_PASS_2_
  11. # define BX_VA_ARGS_PASS_1_ (
  12. # define BX_VA_ARGS_PASS_2_ )
  13. #else
  14. # define BX_VA_ARGS_PASS(...) (__VA_ARGS__)
  15. #endif // BX_COMPILER_MSVC
  16. #define BX_VA_ARGS_COUNT(...) BX_VA_ARGS_COUNT_ BX_VA_ARGS_PASS(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
  17. #define BX_VA_ARGS_COUNT_(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11, _a12, _a13, _a14, _a15, _a16, _last, ...) _last
  18. #define BX_MACRO_DISPATCHER(_func, ...) BX_MACRO_DISPATCHER_1_(_func, BX_VA_ARGS_COUNT(__VA_ARGS__) )
  19. #define BX_MACRO_DISPATCHER_1_(_func, _argCount) BX_MACRO_DISPATCHER_2_(_func, _argCount)
  20. #define BX_MACRO_DISPATCHER_2_(_func, _argCount) BX_CONCATENATE(_func, _argCount)
  21. #define BX_MAKEFOURCC(_a, _b, _c, _d) ( ( (uint32_t)(_a) | ( (uint32_t)(_b) << 8) | ( (uint32_t)(_c) << 16) | ( (uint32_t)(_d) << 24) ) )
  22. #define BX_STRINGIZE(_x) BX_STRINGIZE_(_x)
  23. #define BX_STRINGIZE_(_x) #_x
  24. #define BX_CONCATENATE(_x, _y) BX_CONCATENATE_(_x, _y)
  25. #define BX_CONCATENATE_(_x, _y) _x ## _y
  26. #define BX_FILE_LINE_LITERAL "" __FILE__ "(" BX_STRINGIZE(__LINE__) "): "
  27. #define BX_ALIGN_MASK(_value, _mask) ( ( (_value)+(_mask) ) & ( (~0)&(~(_mask) ) ) )
  28. #define BX_ALIGN_16(_value) BX_ALIGN_MASK(_value, 0xf)
  29. #define BX_ALIGN_256(_value) BX_ALIGN_MASK(_value, 0xff)
  30. #define BX_ALIGN_4096(_value) BX_ALIGN_MASK(_value, 0xfff)
  31. #define BX_ALIGNOF(_type) __alignof(_type)
  32. #if BX_COMPILER_GCC || BX_COMPILER_CLANG
  33. # define BX_ALIGN_DECL(_align, _decl) _decl __attribute__( (aligned(_align) ) )
  34. # define BX_ALLOW_UNUSED __attribute__( (unused) )
  35. # define BX_FORCE_INLINE __extension__ static __inline __attribute__( (__always_inline__) )
  36. # define BX_FUNCTION __PRETTY_FUNCTION__
  37. # define BX_NO_INLINE __attribute__( (noinline) )
  38. # define BX_NO_RETURN __attribute__( (noreturn) )
  39. # define BX_NO_VTABLE
  40. # define BX_OVERRIDE
  41. # define BX_PRINTF_ARGS(_format, _args) __attribute__ ( (format(__printf__, _format, _args) ) )
  42. # if BX_COMPILER_CLANG && (BX_PLATFORM_OSX || BX_PLATFORM_IOS)
  43. # define BX_THREAD /* not supported right now */
  44. # else
  45. # define BX_THREAD __thread
  46. # endif // BX_COMPILER_CLANG
  47. # define BX_ATTRIBUTE(_x) __attribute__( (_x) )
  48. # if BX_COMPILER_MSVC_COMPATIBLE
  49. # define __stdcall
  50. # endif // BX_COMPILER_MSVC_COMPATIBLE
  51. #elif BX_COMPILER_MSVC
  52. # define BX_ALIGN_DECL(_align, _decl) __declspec(align(_align) ) _decl
  53. # define BX_ALLOW_UNUSED
  54. # define BX_FORCE_INLINE __forceinline
  55. # define BX_FUNCTION __FUNCTION__
  56. # define BX_NO_INLINE __declspec(noinline)
  57. # define BX_NO_RETURN
  58. # define BX_NO_VTABLE __declspec(novtable)
  59. # define BX_OVERRIDE override
  60. # define BX_PRINTF_ARGS(_format, _args)
  61. # define BX_THREAD __declspec(thread)
  62. # define BX_ATTRIBUTE(_x)
  63. #else
  64. # error "Unknown BX_COMPILER_?"
  65. #endif
  66. // #define BX_STATIC_ASSERT(_condition, ...) static_assert(_condition, "" __VA_ARGS__)
  67. #define BX_STATIC_ASSERT(_condition, ...) typedef char BX_CONCATENATE(BX_STATIC_ASSERT_, __LINE__)[1][(_condition)] BX_ATTRIBUTE(unused)
  68. #define BX_ALIGN_DECL_16(_decl) BX_ALIGN_DECL(16, _decl)
  69. #define BX_ALIGN_DECL_256(_decl) BX_ALIGN_DECL(256, _decl)
  70. #define BX_ALIGN_DECL_CACHE_LINE(_decl) BX_ALIGN_DECL(BX_CACHE_LINE_SIZE, _decl)
  71. #define BX_MACRO_BLOCK_BEGIN for(;;) {
  72. #define BX_MACRO_BLOCK_END break; }
  73. #define BX_NOOP(...) BX_MACRO_BLOCK_BEGIN BX_MACRO_BLOCK_END
  74. #define BX_UNUSED_1(_a1) BX_MACRO_BLOCK_BEGIN (void)(true ? (void)0 : ( (void)(_a1) ) ); BX_MACRO_BLOCK_END
  75. #define BX_UNUSED_2(_a1, _a2) BX_UNUSED_1(_a1); BX_UNUSED_1(_a2)
  76. #define BX_UNUSED_3(_a1, _a2, _a3) BX_UNUSED_2(_a1, _a2); BX_UNUSED_1(_a3)
  77. #define BX_UNUSED_4(_a1, _a2, _a3, _a4) BX_UNUSED_3(_a1, _a2, _a3); BX_UNUSED_1(_a4)
  78. #define BX_UNUSED_5(_a1, _a2, _a3, _a4, _a5) BX_UNUSED_4(_a1, _a2, _a3, _a4); BX_UNUSED_1(_a5)
  79. #define BX_UNUSED_6(_a1, _a2, _a3, _a4, _a5, _a6) BX_UNUSED_5(_a1, _a2, _a3, _a4, _a5); BX_UNUSED_1(_a6)
  80. #define BX_UNUSED_7(_a1, _a2, _a3, _a4, _a5, _a6, _a7) BX_UNUSED_6(_a1, _a2, _a3, _a4, _a5, _a6); BX_UNUSED_1(_a7)
  81. #define BX_UNUSED_8(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) BX_UNUSED_7(_a1, _a2, _a3, _a4, _a5, _a6, _a7); BX_UNUSED_1(_a8)
  82. #define BX_UNUSED_9(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9) BX_UNUSED_8(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8); BX_UNUSED_1(_a9)
  83. #define BX_UNUSED_10(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10) BX_UNUSED_9(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9); BX_UNUSED_1(_a10)
  84. #define BX_UNUSED_11(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11) BX_UNUSED_10(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10); BX_UNUSED_1(_a11)
  85. #define BX_UNUSED_12(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11, _a12) BX_UNUSED_11(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8, _a9, _a10, _a11); BX_UNUSED_1(_a12)
  86. #if BX_COMPILER_MSVC
  87. // Workaround MSVS bug...
  88. # define BX_UNUSED(...) BX_MACRO_DISPATCHER(BX_UNUSED_, __VA_ARGS__) BX_VA_ARGS_PASS(__VA_ARGS__)
  89. #else
  90. # define BX_UNUSED(...) BX_MACRO_DISPATCHER(BX_UNUSED_, __VA_ARGS__)(__VA_ARGS__)
  91. #endif // BX_COMPILER_MSVC
  92. #define BX_TYPE_IS_POD(_type) (!__is_class(_type) || __is_pod(_type) )
  93. #define BX_CLASS_NO_DEFAULT_CTOR(_class) \
  94. private: _class()
  95. #define BX_CLASS_NO_COPY(_class) \
  96. private: _class(const _class& _rhs)
  97. #define BX_CLASS_NO_ASSIGNMENT(_class) \
  98. private: _class& operator=(const _class& _rhs)
  99. #define BX_CLASS_ALLOCATOR(_class) \
  100. public: void* operator new(size_t _size); \
  101. public: void operator delete(void* _ptr); \
  102. public: void* operator new[](size_t _size); \
  103. public: void operator delete[](void* _ptr)
  104. #define BX_CLASS_1(_class, _a1) BX_CONCATENATE(BX_CLASS_, _a1)(_class)
  105. #define BX_CLASS_2(_class, _a1, _a2) BX_CLASS_1(_class, _a1); BX_CLASS_1(_class, _a2)
  106. #define BX_CLASS_3(_class, _a1, _a2, _a3) BX_CLASS_2(_class, _a1, _a2); BX_CLASS_1(_class, _a3)
  107. #define BX_CLASS_4(_class, _a1, _a2, _a3, _a4) BX_CLASS_3(_class, _a1, _a2, _a3); BX_CLASS_1(_class, _a4)
  108. #if BX_COMPILER_MSVC
  109. # define BX_CLASS(_class, ...) BX_MACRO_DISPATCHER(BX_CLASS_, __VA_ARGS__) BX_VA_ARGS_PASS(_class, __VA_ARGS__)
  110. #else
  111. # define BX_CLASS(_class, ...) BX_MACRO_DISPATCHER(BX_CLASS_, __VA_ARGS__)(_class, __VA_ARGS__)
  112. #endif // BX_COMPILER_MSVC
  113. #ifndef BX_CHECK
  114. # define BX_CHECK(_condition, ...) BX_NOOP()
  115. #endif // BX_CHECK
  116. #ifndef BX_TRACE
  117. # define BX_TRACE(...) BX_NOOP()
  118. #endif // BX_TRACE
  119. #ifndef BX_WARN
  120. # define BX_WARN(_condition, ...) BX_NOOP()
  121. #endif // BX_CHECK
  122. #endif // BX_MACROS_H_HEADER_GUARD