2
3
4
5
6
7
8
9
11#ifndef GIMBAL_MACRO_UTILS_H
12#define GIMBAL_MACRO_UTILS_H
16#include "../core/gimbal_config.h"
24#define GBL_MIN(a, b) (((a) < (b))? (a) : (b))
25#define GBL_MAX(a, b) (((a) > (b))? (a) : (b))
26#define GBL_CEIL(numerator, denominator) ((numerator / denominator + (numerator % denominator != 0
)))
27#define GBL_CLAMP(n, min, max) (((n) > (max)) ? (max) : (((n) < (min)) ? (min) : (n)))
29#define GBL_BIT_MASK_2(bits, offset) (((1u
<< bits) - 1u
) << offset)
33#define GBL_BCD_BYTE_PACK(n) (((n / 10
) << 4
) | (n % 10
))
34#define GBL_BCD_BYTE_UNPACK(n) (unsigned)(((n >> 4
) * 10
) + (n & 0xf
))
36#define GBL_CONTAINER_OF(ptr, type, member) ((type*)((char*)(ptr) - offsetof(type, member)))
37#define GBL_COUNT_OF(array) (sizeof(array) / sizeof(array[0
]))
40#define GBL_PTR_OFFSET_3(type, ptr, bytes) ((type)(((uintptr_t)ptr) + bytes))
43#define GBL_SWITCH_CASE_STRINGIFY(s) case s: return #s
45#define GBL_LABEL_EMPTY(name) name: {;}
49 unsigned char swap_temp[sizeof(x) == sizeof(y) ?
50 (signed)sizeof(x) : -1
];
51 memcpy(swap_temp, &y, sizeof(x));
52 memcpy(&y, &x, sizeof(x));
53 memcpy(&x, swap_temp, sizeof(x));
56#define GBL_ASSERT(...)
60#define GBL_BIT_FIELDS(...)
64# define GBL_META_GENERIC_MACRO_GENERATE(traits, X)
66 GBL_MAP_TUPLES(GBL_META_GENERIC_MACRO_TRAIT_OVERLOADS_DECLARE_CASE_C_,
67 GBL_MAP_TUPLES(GBL_EVAL, GBL_META_GENERIC_MACRO_TRAIT_PROPERTY_OVERLOADS_ traits))
68 default: GBL_EVAL(GBL_META_GENERIC_MACRO_TRAIT_PROPERTY_DEFAULT traits)
71# define GBL_META_GENERIC_MACRO_GENERATE(traits, X)
73 using GenericType = decltype(X);
75 GBL_MAP_TUPLES(GBL_META_GENERIC_MACRO_TRAIT_OVERLOADS_DECLARE_CASE_CPP_
,
77 else if constexpr(requires { GBL_EVAL(GBL_META_GENERIC_MACRO_TRAIT_PROPERTY_DEFAULT_ traits)
78 (std::forward<decltype(args)>(args)...); })
79 return GBL_EVAL(GBL_META_GENERIC_MACRO_TRAIT_PROPERTY_DEFAULT_ traits)(std::forward<decltype(args)>(args)...);
83#define GBL_META_GENERIC_MACRO_TRAIT_PROPERTY_DEFAULT(defaultFunc, overloads) defaultFunc
84#define GBL_META_GENERIC_MACRO_NO_DEFAULT GBL_NULL
88#define GBL_BIT_FIELDS_ENTRY_(a, b) b;
90#define GBL_META_GENERIC_MACRO_TRAIT_PROPERTY_OVERLOADS_(defaultFunc, overloads) overloads
91#define GBL_META_GENERIC_MACRO_TRAIT_OVERLOADS_PROPERTY_TYPE_(type, function) type
92#define GBL_META_GENERIC_MACRO_TRAIT_OVERLOADS_PROPERTY_FUNCTION_(type, function) function
94#define GBL_META_GENERIC_MACRO_TRAIT_OVERLOADS_DECLARE_CASE_C_(type, function)
97#define GBL_META_GENERIC_MACRO_TRAIT_OVERLOADS_DECLARE_CASE_CPP_(type, function)
98 else if constexpr(std::same_as<GenericType, type>) return function(std::forward<decltype(args)>(args)...);
105#define GBL_SCOPE_EXIT continue
#define GBL_VA_OVERLOAD_SELECT(BASE, SUFFIXER,...)
#define GBL_TUPLE_FOREACH(MACRO_, DATA_, TUPLE_)
#define GBL_VA_OVERLOAD_SUFFIXER_ARGC(...)
#define GBL_VA_OVERLOAD_CALL_ARGC(BASE,...)
#define GBL_MAP_TUPLES(f,...)
#define GBL_PTR_OFFSET(...)
#define GBL_BIT_MASK_2(bits, offset)
#define GBL_BIT_MASK(...)
#define GBL_APPEND_LINE(a)
#define GBL_PTR_OFFSET_3(type, ptr, bytes)