10#define XR_TO_STR(_arg) #_arg
11#define DEF2STR(_arg) XR_TO_STR(_arg)
16#define UNUSED(_x) ((void)(_x))
19#ifndef LIBXR_SINGLE_CORE
20#define LIBXR_SINGLE_CORE 0
24#define LIBXR_NOINLINE __declspec(noinline)
25#define LIBXR_PACKED_BEGIN __pragma(pack(push, 1))
26#define LIBXR_PACKED_END __pragma(pack(pop))
28#elif defined(__clang__) || defined(__GNUC__)
29#define LIBXR_NOINLINE __attribute__((noinline))
30#define LIBXR_PACKED_BEGIN _Pragma("pack(push, 1)")
31#define LIBXR_PACKED_END _Pragma("pack(pop)")
32#define LIBXR_PACKED __attribute__((packed))
34#warning "LibXR compiler compatibility macros fallback to no-op on unknown compiler"
36#define LIBXR_PACKED_BEGIN
37#define LIBXR_PACKED_END
44inline constexpr double PI = 3.14159265358979323846;
73template <
typename OwnerType,
typename MemberType>
79template <
typename LeftType,
typename RightType>
81 requires(
const LeftType& left,
const RightType& right) {
82 { left < right } -> std::convertible_to<bool>;
83 { left > right } -> std::convertible_to<bool>;
93template <
typename OwnerType,
typename MemberType>
95[[nodiscard]]
inline size_t OffsetOf(MemberType OwnerType::* member)
noexcept
97 return reinterpret_cast<size_t>(
98 &(
reinterpret_cast<const volatile OwnerType*
>(0)->*member));
109template <
typename OwnerType,
typename MemberType>
110 requires MemberObjectPointer<OwnerType, MemberType>
112 MemberType OwnerType::* member)
noexcept
114 return reinterpret_cast<OwnerType*
>(
reinterpret_cast<std::byte*
>(ptr) -
118template <
typename OwnerType,
typename MemberType>
119 requires MemberObjectPointer<OwnerType, MemberType>
120[[nodiscard]]
inline const OwnerType*
ContainerOf(
const MemberType* ptr,
121 MemberType OwnerType::* member)
noexcept
123 return reinterpret_cast<const OwnerType*
>(
reinterpret_cast<const std::byte*
>(ptr) -
176 size_t size)
noexcept
181 return limit == size;
183 return limit >= size;
185 return limit <= size;
197#ifdef DEV_ASSERT_FROM_CALLBACK
198#undef DEV_ASSERT_FROM_CALLBACK
205#ifdef REQUIRE_FROM_CALLBACK
206#undef REQUIRE_FROM_CALLBACK
213#ifdef ASSERT_FROM_CALLBACK
214#undef ASSERT_FROM_CALLBACK
224#ifdef LIBXR_DEBUG_BUILD
230 libxr_fatal_error(__FILE__, __LINE__, false); \
241#define ASSERT_FROM_CALLBACK(arg, in_isr) \
246 libxr_fatal_error(__FILE__, __LINE__, (in_isr)); \
250#define ASSERT(arg) (void(arg), (void)0)
251#define ASSERT_FROM_CALLBACK(arg, in_isr) \
266#ifdef LIBXR_DEV_ASSERT_BUILD
267#define DEV_ASSERT(arg) \
272 libxr_fatal_error(__FILE__, __LINE__, false); \
283#define DEV_ASSERT_FROM_CALLBACK(arg, in_isr) \
288 libxr_fatal_error(__FILE__, __LINE__, (in_isr)); \
292#define DEV_ASSERT(arg) ((void)0)
293#define DEV_ASSERT_FROM_CALLBACK(arg, in_isr) ((void)0)
302#define REQUIRE(arg) \
307 libxr_fatal_error(__FILE__, __LINE__, false); \
318#define REQUIRE_FROM_CALLBACK(arg, in_isr) \
323 libxr_fatal_error(__FILE__, __LINE__, (in_isr)); \
333extern "C" void libxr_fatal_error(
const char* file, uint32_t line,
bool in_isr);
345template <
typename LeftType,
typename RightType>
346 requires CommonOrdered<LeftType, RightType>
347constexpr auto max(LeftType a, RightType b) -> std::common_type_t<LeftType, RightType>
349 return (a > b) ? a : b;
360template <
typename LeftType,
typename RightType>
361 requires CommonOrdered<LeftType, RightType>
362constexpr auto min(LeftType a, RightType b) -> std::common_type_t<LeftType, RightType>
364 return (a < b) ? a : b;
具有公共类型且可比较大小的类型对 / Type pair with a common type and ordering
指向非静态数据成员的成员指针 / Pointer to a non-static data member
LibXR 命名空间 / LibXR namespace.
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ 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²)
SizeLimitMode
定义尺寸限制模式 / Defines size limit modes
@ 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 size_t CONCURRENCY_ALIGNMENT
并发结构对齐粒度(用于降低多核伪共享) / Alignment policy used by concurrency-oriented structures
constexpr auto min(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最小值 / Computes the minimum of two numbers
constexpr size_t CACHE_LINE_SIZE
兼容旧代码的缓存行别名 / Backward-compatible cache-line alias for existing code
constexpr double TWO_PI
2PI 常量 / 2PI constant
constexpr size_t HW_CACHE_LINE_SIZE
真实硬件缓存行大小(用于 DMA / cache coherency) / Hardware cache-line size used for DMA/cache-coherency boundarie...
constexpr bool SizeLimitCheck(SizeLimitMode mode, size_t limit, size_t size) noexcept
尺寸约束的纯判断函数 / Pure predicate for size-limit comparisons
size_t OffsetOf(MemberType OwnerType::*member) noexcept
计算成员在宿主对象中的偏移量 Computes the offset of a member within the owning object
OwnerType * ContainerOf(MemberType *ptr, MemberType OwnerType::*member) noexcept
通过成员指针恢复其所属对象指针 Recover the owning object pointer from a member pointer
constexpr size_t ALIGN_SIZE
平台自然对齐大小 / Native platform alignment size
constexpr auto max(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最大值 / Computes the maximum of two numbers
constexpr double PI
PI 常量 / PI constant.