1#pragma once
 2
 3#include <limits.h>
 4//#include <stdbit.h> not in libc yet, using __builtin_* functions
 5
 6#ifdef __cplusplus
 7extern "C" {
 8#endif
 9
10XXX unnecessary?
11
12static inline unsigned first_leading_one(unsigned value)
13{
14    //return stdc_first_leading_one(value);
15    return UINT_WIDTH - __builtin_clz(value) - 1;
16}
17
18static inline unsigned count_leading_zeros(unsigned value)
19{
20    //return  __builtin_stdc_leading_zeros(value);
21    return  __builtin_clz(value);
22}
23
24static inline unsigned count_trailing_zeros(unsigned value)
25{
26    //return  stdc_trailing_zeros(value);
27    return  __builtin_ctz(value);
28}
29
30static inline unsigned count_trailing_ones(unsigned value)
31{
32    return count_trailing_zeros(~value);
33}
34
35#ifdef __cplusplus
36}
37#endif