10#define XR_TO_STR(_arg) #_arg
11#define DEF2STR(_arg) XR_TO_STR(_arg)
17#define UNUSED(_x) ((void)(_x))
21#define LIBXR_FORCE_OPTIMIZE_O3
22#define LIBXR_FORCE_OPTIMIZE_OS
23#define LIBXR_NOINLINE __declspec(noinline)
24#define LIBXR_PACKED_BEGIN __pragma(pack(push, 1))
25#define LIBXR_PACKED_END __pragma(pack(pop))
27#elif defined(__clang__) || defined(__GNUC__)
28#define LIBXR_FORCE_OPTIMIZE_O3 __attribute__((optimize("O3")))
29#define LIBXR_FORCE_OPTIMIZE_OS __attribute__((optimize("Os")))
30#define LIBXR_NOINLINE __attribute__((noinline))
31#define LIBXR_PACKED_BEGIN _Pragma("pack(push, 1)")
32#define LIBXR_PACKED_END _Pragma("pack(pop)")
33#define LIBXR_PACKED __attribute__((packed))
35#warning "LibXR compiler compatibility macros fallback to no-op on unknown compiler"
36#define LIBXR_FORCE_OPTIMIZE_O3
37#define LIBXR_FORCE_OPTIMIZE_OS
39#define LIBXR_PACKED_BEGIN
40#define LIBXR_PACKED_END
47inline constexpr double PI = 3.14159265358979323846;
65template <
typename OwnerType,
typename MemberType>
72template <
typename LeftType,
typename RightType>
74 requires(
const LeftType& left,
const RightType& right)
76 { left < right } -> std::convertible_to<bool>;
77 { left > right } -> std::convertible_to<bool>;
86template <
typename OwnerType,
typename MemberType>
88[[nodiscard]]
inline size_t OffsetOf(MemberType OwnerType::*member)
noexcept
90 return reinterpret_cast<size_t>(
91 &(
reinterpret_cast<const volatile OwnerType*
>(0)->*member));
101template <
typename OwnerType,
typename MemberType>
102requires MemberObjectPointer<OwnerType, MemberType>
104 MemberType OwnerType::*member)
noexcept
106 return reinterpret_cast<OwnerType*
>(
reinterpret_cast<std::byte*
>(ptr) -
110template <
typename OwnerType,
typename MemberType>
111requires MemberObjectPointer<OwnerType, MemberType>
112[[nodiscard]]
inline const OwnerType*
ContainerOf(
const MemberType* ptr,
113 MemberType OwnerType::*member)
noexcept
115 return reinterpret_cast<const OwnerType*
>(
reinterpret_cast<const std::byte*
>(ptr) -
171 size_t size)
noexcept
176 return limit == size;
178 return limit >= size;
180 return limit <= size;
192#ifdef DEV_ASSERT_FROM_CALLBACK
193#undef DEV_ASSERT_FROM_CALLBACK
200#ifdef REQUIRE_FROM_CALLBACK
201#undef REQUIRE_FROM_CALLBACK
208#ifdef ASSERT_FROM_CALLBACK
209#undef ASSERT_FROM_CALLBACK
217#ifdef LIBXR_DEBUG_BUILD
223 libxr_fatal_error(__FILE__, __LINE__, false); \
234#define ASSERT_FROM_CALLBACK(arg, in_isr) \
239 libxr_fatal_error(__FILE__, __LINE__, (in_isr)); \
243#define ASSERT(arg) (void(arg), (void)0)
244#define ASSERT_FROM_CALLBACK(arg, in_isr) \
257#ifdef LIBXR_DEV_ASSERT_BUILD
258#define DEV_ASSERT(arg) \
263 libxr_fatal_error(__FILE__, __LINE__, false); \
274#define DEV_ASSERT_FROM_CALLBACK(arg, in_isr) \
279 libxr_fatal_error(__FILE__, __LINE__, (in_isr)); \
283#define DEV_ASSERT(arg) (void(arg), (void)0)
284#define DEV_ASSERT_FROM_CALLBACK(arg, in_isr) \
297#define REQUIRE(arg) \
302 libxr_fatal_error(__FILE__, __LINE__, false); \
313#define REQUIRE_FROM_CALLBACK(arg, in_isr) \
318 libxr_fatal_error(__FILE__, __LINE__, (in_isr)); \
329extern "C" void libxr_fatal_error(
const char* file, uint32_t line,
bool in_isr);
342template <
typename LeftType,
typename RightType>
343requires CommonOrdered<LeftType, RightType>
344constexpr auto max(LeftType a, RightType b) -> std::common_type_t<LeftType, RightType>
346 return (a > b) ? a : b;
358template <
typename LeftType,
typename RightType>
359requires CommonOrdered<LeftType, RightType>
360constexpr auto min(LeftType a, RightType b) -> std::common_type_t<LeftType, RightType>
362 return (a < b) ? a : b;
@ SIZE_ERR
尺寸错误 | Size error
@ CHECK_ERR
校验错误 | Check error
@ INIT_ERR
初始化错误 | Initialization error
@ OUT_OF_RANGE
超出范围 | Out of range
@ STATE_ERR
状态错误 | State error
@ NOT_FOUND
未找到 | Not found
@ NO_MEM
内存不足 | Insufficient memory
@ NO_RESPONSE
无响应 | No response
@ PTR_NULL
空指针 | Null pointer
@ NO_BUFF
缓冲区不足 | Insufficient buffer
@ NOT_SUPPORT
不支持 | Not supported
@ FAILED
操作失败 | Operation failed
@ OK
操作成功 | Operation successful
@ ARG_ERR
参数错误 | Argument error
constexpr double STANDARD_GRAVITY
标准重力加速度(m/s²) / Standard gravitational acceleration (m/s²)
@ LESS
尺寸必须小于等于 | Size must be less than or equal
@ EQUAL
尺寸必须相等 | Size must be equal
@ NONE
无限制 | No restriction
@ MORE
尺寸必须大于等于 | Size must be greater than or equal
constexpr auto min(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最小值
constexpr size_t CACHE_LINE_SIZE
缓存行大小 / Cache line size
constexpr double TWO_PI
2PI 常量 / 2PI constant
constexpr bool SizeLimitCheck(SizeLimitMode mode, size_t limit, size_t size) noexcept
尺寸约束的纯判断函数
size_t OffsetOf(MemberType OwnerType::*member) noexcept
计算成员在宿主对象中的偏移量
OwnerType * ContainerOf(MemberType *ptr, MemberType OwnerType::*member) noexcept
通过成员指针恢复其所属对象指针
constexpr size_t ALIGN_SIZE
平台自然对齐大小 / Native platform alignment size
constexpr auto max(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最大值
constexpr double PI
PI 常量 / PI constant.