24 #ifndef __MOTR_LIB_MISC_H__ 25 #define __MOTR_LIB_MISC_H__ 28 # include <linux/string.h> 29 # include <linux/bitops.h> 41 #define M0_QUOTE(s) _QUOTE(s) 48 #define M0_SRC_PATH(name) M0_QUOTE(M0_SRC_DIR) "/" name 62 #define M0_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) 64 #define M0_SET0(obj) \ 66 M0_CASSERT(!m0_is_array(obj)); \ 67 memset((obj), 0, sizeof *(obj)); \ 70 #define M0_IS0(obj) m0_forall(i, sizeof *(obj), ((char *)obj)[i] == 0) 72 #define M0_SET_ARR0(arr) \ 74 M0_CASSERT(m0_is_array(arr)); \ 75 memset((arr), 0, sizeof (arr)); \ 79 #define m0_count(var, nr, ...) \ 81 unsigned __nr = (nr); \ 85 for (count = var = 0; var < __nr; ++var) { \ 112 #define m0_forall(var, nr, ...) \ 114 unsigned __nr = (nr); \ 117 for (var = 0; var < __nr && ({ __VA_ARGS__ ; }); ++var) \ 134 #define m0_exists(var, nr, ...) !m0_forall(var, (nr), !(__VA_ARGS__)) 150 #define m0_reduce(var, nr, init, exp) \ 152 unsigned __nr = (nr); \ 154 typeof(init) __accum = (init); \ 156 for (var = 0; var < __nr; ++var) { \ 157 __accum = __accum exp; \ 178 #define m0_fold(var, accum, nr, init, exp) \ 180 unsigned __nr = (nr); \ 182 typeof(init) accum = (init); \ 184 for (var = 0; var < __nr; ++var) { \ 199 #define M0_IN(x, set) \ 200 ({ typeof (x) __x = (x); \ 201 M0_IN0(__x, M0_UNPACK set); }) 203 #define M0_UNPACK(...) __VA_ARGS__ 205 #define M0_IN0(...) \ 206 M0_CAT(M0_IN_, M0_COUNT_PARAMS(__VA_ARGS__))(__VA_ARGS__) 208 #define M0_IN_1(x, v) ((x) == (v)) 209 #define M0_IN_2(x, v, ...) ((x) == (v) || M0_IN_1(x, __VA_ARGS__)) 210 #define M0_IN_3(x, v, ...) ((x) == (v) || M0_IN_2(x, __VA_ARGS__)) 211 #define M0_IN_4(x, v, ...) ((x) == (v) || M0_IN_3(x, __VA_ARGS__)) 212 #define M0_IN_5(x, v, ...) ((x) == (v) || M0_IN_4(x, __VA_ARGS__)) 213 #define M0_IN_6(x, v, ...) ((x) == (v) || M0_IN_5(x, __VA_ARGS__)) 214 #define M0_IN_7(x, v, ...) ((x) == (v) || M0_IN_6(x, __VA_ARGS__)) 215 #define M0_IN_8(x, v, ...) ((x) == (v) || M0_IN_7(x, __VA_ARGS__)) 216 #define M0_IN_9(x, v, ...) ((x) == (v) || M0_IN_8(x, __VA_ARGS__)) 236 #define M0_BITS(...) \ 237 M0_CAT(__M0_BITS_, M0_COUNT_PARAMS(__VA_ARGS__))(__VA_ARGS__) 239 #define __M0_BITS_0(i) (1ULL << (i)) 240 #define __M0_BITS_1(i, ...) ((1ULL << (i)) | __M0_BITS_0(__VA_ARGS__)) 241 #define __M0_BITS_2(i, ...) ((1ULL << (i)) | __M0_BITS_1(__VA_ARGS__)) 242 #define __M0_BITS_3(i, ...) ((1ULL << (i)) | __M0_BITS_2(__VA_ARGS__)) 243 #define __M0_BITS_4(i, ...) ((1ULL << (i)) | __M0_BITS_3(__VA_ARGS__)) 244 #define __M0_BITS_5(i, ...) ((1ULL << (i)) | __M0_BITS_4(__VA_ARGS__)) 245 #define __M0_BITS_6(i, ...) ((1ULL << (i)) | __M0_BITS_5(__VA_ARGS__)) 246 #define __M0_BITS_7(i, ...) ((1ULL << (i)) | __M0_BITS_6(__VA_ARGS__)) 247 #define __M0_BITS_8(i, ...) ((1ULL << (i)) | __M0_BITS_7(__VA_ARGS__)) 293 #define ergo(a, b) (!(a) || (b)) 297 #define equi(a, b) (!(a) == !(b)) 306 #define AND_NOTHING_ELSE else __dummy_function(); 308 #define m0_is_array(x) \ 309 (!__builtin_types_compatible_p(typeof(&(x)[0]), typeof(x))) 311 #define IS_IN_ARRAY(idx, array) \ 313 M0_CASSERT(m0_is_array(array)); \ 314 ((unsigned long)(idx)) < ARRAY_SIZE(array); \ 320 #define M0_AMB(obj, ptr, field) \ 321 (container_of((ptr), typeof(*(obj)), field)) 323 #define M0_MEMBER_PTR(ptr, member) \ 325 typeof(ptr) __ptr = (ptr); \ 326 __ptr == NULL ? NULL : &__ptr->member; \ 329 #define M0_MEMBER(ptr, member) \ 331 typeof(ptr) __ptr = (ptr); \ 332 __ptr == NULL ? NULL : __ptr->member; \ 339 #define M0_FIELD_VALUE(type, field) (((type *)0)->field) 344 #define M0_HAS_TYPE(expr, type) __builtin_types_compatible_p(typeof(expr), type) 349 #define M0_FIELD_IS(type, field, ftype) \ 350 M0_HAS_TYPE(M0_FIELD_VALUE(type, field), ftype) 356 #define M0_MAGIX_OFFSET(type, field) \ 357 M0_FIELD_IS(type, field, uint64_t) ? \ 358 offsetof(type, field) : \ 359 sizeof(char [M0_FIELD_IS(type, field, uint64_t) - 1]) 370 #define M0_COUNT_PARAMS(...) \ 371 M0_COUNT_PARAMS2(__VA_ARGS__, 9,8,7,6,5,4,3,2,1,0) 372 #define M0_COUNT_PARAMS2(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_, ...) _ 377 #define M0_CAT(A, B) M0_CAT2(A, B) 378 #define M0_CAT2(A, B) A ## B 380 #define M0_UNUSED __attribute__((unused)) 384 M0_INTERNAL
unsigned int 403 #define M0_CIRCULAR_SHIFT_LEFT(val, bits) \ 405 typeof(val) __v = (val); \ 406 typeof(bits) __b = (bits); \ 408 (__v << __b) | (__v >> (sizeof(__v) * CHAR_BIT - __b)); \ 436 M0_INTERNAL
void m0_permute(uint64_t
n, uint64_t *k, uint64_t *
s, uint64_t *
r);
439 M0_INTERNAL
void m0_array_sort(uint64_t *arr, uint64_t arr_len);
442 #define M0_BYTES(bits_nr) ((bits_nr + 7) / 8) static struct m0_addb2_philter p
M0_INTERNAL bool m0_elems_are_unique(const void *array, unsigned nr_elems, size_t elem_size)
M0_INTERNAL uint64_t m0_ptr_wrap(const void *p)
M0_INTERNAL bool m0_bit_get(void *buffer, m0_bcount_t i)
M0_INTERNAL unsigned int m0_full_name_hash(const unsigned char *name, unsigned int len)
M0_INTERNAL const char * m0_bool_to_str(bool b)
M0_INTERNAL const void * m0_ptr_unwrap(uint64_t val)
M0_INTERNAL uint32_t m0_no_of_bits_set(uint64_t val)
M0_INTERNAL const char * m0_short_file_name(const char *fname)
M0_INTERNAL void m0_permute(uint64_t n, uint64_t *k, uint64_t *s, uint64_t *r)
M0_INTERNAL void m0_key_val_init(struct m0_key_val *kv, const struct m0_buf *key, const struct m0_buf *val)
M0_INTERNAL uint64_t m0_round_down(uint64_t val, uint64_t size)
M0_INTERNAL uint64_t m0_round_up(uint64_t val, uint64_t size)
static int cmp(const struct m0_ut_suite **s0, const struct m0_ut_suite **s1)
uint64_t m0_strtou64(const char *str, char **endptr, int base)
M0_INTERNAL uint64_t m0_dummy_id_generate(void)
uint32_t m0_strtou32(const char *str, char **endptr, int base)
M0_INTERNAL void m0_array_sort(uint64_t *arr, uint64_t arr_len)
M0_INTERNAL bool m0_key_val_is_null(struct m0_key_val *kv)
M0_INTERNAL void m0_bit_set(void *buffer, m0_bcount_t i, bool val)
M0_EXTERN const struct m0_key_val M0_KEY_VAL_NULL
void __dummy_function(void)
M0_INTERNAL void * m0_vote_majority_get(struct m0_key_val *arr, uint32_t len, bool(*cmp)(const struct m0_buf *, const struct m0_buf *), uint32_t *vote_nr)
static struct m0_addb2_source * s
M0_INTERNAL void m0_key_val_null_set(struct m0_key_val *kv)