mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-22 22:03:43 +03:00
macro: add macro for checking if integer is power of 2
This commit is contained in:
parent
14e7bc2e77
commit
c51e4c796d
@ -200,6 +200,19 @@
|
|||||||
MIN(_c, z); \
|
MIN(_c, z); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/* Returns true if the passed integer is a positive power of two */
|
||||||
|
#define CONST_ISPOWEROF2(x) \
|
||||||
|
((x) > 0 && ((x) & ((x) - 1)) == 0)
|
||||||
|
|
||||||
|
#define ISPOWEROF2(x) \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
__builtin_constant_p(x), \
|
||||||
|
CONST_ISPOWEROF2(x), \
|
||||||
|
({ \
|
||||||
|
const typeof(x) _x = (x); \
|
||||||
|
CONST_ISPOWEROF2(_x); \
|
||||||
|
}))
|
||||||
|
|
||||||
#define LESS_BY(a, b) __LESS_BY(UNIQ, (a), UNIQ, (b))
|
#define LESS_BY(a, b) __LESS_BY(UNIQ, (a), UNIQ, (b))
|
||||||
#define __LESS_BY(aq, a, bq, b) \
|
#define __LESS_BY(aq, a, bq, b) \
|
||||||
({ \
|
({ \
|
||||||
|
@ -465,4 +465,60 @@ TEST(PTR_SUB1) {
|
|||||||
assert_se(!p);
|
assert_se(!p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ISPOWEROF2) {
|
||||||
|
uint64_t u;
|
||||||
|
int64_t i;
|
||||||
|
|
||||||
|
/* First, test constant expressions */
|
||||||
|
assert_se(!ISPOWEROF2(-2));
|
||||||
|
assert_se(!ISPOWEROF2(-1));
|
||||||
|
assert_se(!ISPOWEROF2(0));
|
||||||
|
assert_se(ISPOWEROF2(1));
|
||||||
|
assert_se(ISPOWEROF2(2));
|
||||||
|
assert_se(!ISPOWEROF2(3));
|
||||||
|
assert_se(ISPOWEROF2(4));
|
||||||
|
assert_se(!ISPOWEROF2(5));
|
||||||
|
assert_se(!ISPOWEROF2(6));
|
||||||
|
assert_se(!ISPOWEROF2(7));
|
||||||
|
assert_se(ISPOWEROF2(8));
|
||||||
|
assert_se(!ISPOWEROF2(9));
|
||||||
|
assert_se(!ISPOWEROF2(1022));
|
||||||
|
assert_se(ISPOWEROF2(1024));
|
||||||
|
assert_se(!ISPOWEROF2(1025));
|
||||||
|
assert_se(!ISPOWEROF2(UINT64_C(0xffffffff)));
|
||||||
|
assert_se(ISPOWEROF2(UINT64_C(0x100000000)));
|
||||||
|
assert_se(!ISPOWEROF2(UINT64_C(0x100000001)));
|
||||||
|
|
||||||
|
/* Then, test dynamic expressions, and if they are side-effect free */
|
||||||
|
i = -2;
|
||||||
|
assert_se(!ISPOWEROF2(i++));
|
||||||
|
assert_se(i == -1);
|
||||||
|
assert_se(!ISPOWEROF2(i++));
|
||||||
|
assert_se(i == 0);
|
||||||
|
assert_se(!ISPOWEROF2(i++));
|
||||||
|
assert_se(i == 1);
|
||||||
|
assert_se(ISPOWEROF2(i++));
|
||||||
|
assert_se(i == 2);
|
||||||
|
assert_se(ISPOWEROF2(i++));
|
||||||
|
assert_se(i == 3);
|
||||||
|
assert_se(!ISPOWEROF2(i++));
|
||||||
|
assert_se(i == 4);
|
||||||
|
assert_se(ISPOWEROF2(i++));
|
||||||
|
assert_se(i == 5);
|
||||||
|
assert_se(!ISPOWEROF2(i));
|
||||||
|
|
||||||
|
u = 0;
|
||||||
|
assert_se(!ISPOWEROF2(u++));
|
||||||
|
assert_se(u == 1);
|
||||||
|
assert_se(ISPOWEROF2(u++));
|
||||||
|
assert_se(u == 2);
|
||||||
|
assert_se(ISPOWEROF2(u++));
|
||||||
|
assert_se(u == 3);
|
||||||
|
assert_se(!ISPOWEROF2(u++));
|
||||||
|
assert_se(u == 4);
|
||||||
|
assert_se(ISPOWEROF2(u++));
|
||||||
|
assert_se(u == 5);
|
||||||
|
assert_se(!ISPOWEROF2(u));
|
||||||
|
}
|
||||||
|
|
||||||
DEFINE_TEST_MAIN(LOG_INFO);
|
DEFINE_TEST_MAIN(LOG_INFO);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user