Home | History | Annotate | Line # | Download | only in unit
bit_util.c revision 1.1
      1  1.1  christos #include "test/jemalloc_test.h"
      2  1.1  christos 
      3  1.1  christos #include "jemalloc/internal/bit_util.h"
      4  1.1  christos 
      5  1.1  christos #define TEST_POW2_CEIL(t, suf, pri) do {				\
      6  1.1  christos 	unsigned i, pow2;						\
      7  1.1  christos 	t x;								\
      8  1.1  christos 									\
      9  1.1  christos 	assert_##suf##_eq(pow2_ceil_##suf(0), 0, "Unexpected result");	\
     10  1.1  christos 									\
     11  1.1  christos 	for (i = 0; i < sizeof(t) * 8; i++) {				\
     12  1.1  christos 		assert_##suf##_eq(pow2_ceil_##suf(((t)1) << i), ((t)1)	\
     13  1.1  christos 		    << i, "Unexpected result");				\
     14  1.1  christos 	}								\
     15  1.1  christos 									\
     16  1.1  christos 	for (i = 2; i < sizeof(t) * 8; i++) {				\
     17  1.1  christos 		assert_##suf##_eq(pow2_ceil_##suf((((t)1) << i) - 1),	\
     18  1.1  christos 		    ((t)1) << i, "Unexpected result");			\
     19  1.1  christos 	}								\
     20  1.1  christos 									\
     21  1.1  christos 	for (i = 0; i < sizeof(t) * 8 - 1; i++) {			\
     22  1.1  christos 		assert_##suf##_eq(pow2_ceil_##suf((((t)1) << i) + 1),	\
     23  1.1  christos 		    ((t)1) << (i+1), "Unexpected result");		\
     24  1.1  christos 	}								\
     25  1.1  christos 									\
     26  1.1  christos 	for (pow2 = 1; pow2 < 25; pow2++) {				\
     27  1.1  christos 		for (x = (((t)1) << (pow2-1)) + 1; x <= ((t)1) << pow2;	\
     28  1.1  christos 		    x++) {						\
     29  1.1  christos 			assert_##suf##_eq(pow2_ceil_##suf(x),		\
     30  1.1  christos 			    ((t)1) << pow2,				\
     31  1.1  christos 			    "Unexpected result, x=%"pri, x);		\
     32  1.1  christos 		}							\
     33  1.1  christos 	}								\
     34  1.1  christos } while (0)
     35  1.1  christos 
     36  1.1  christos TEST_BEGIN(test_pow2_ceil_u64) {
     37  1.1  christos 	TEST_POW2_CEIL(uint64_t, u64, FMTu64);
     38  1.1  christos }
     39  1.1  christos TEST_END
     40  1.1  christos 
     41  1.1  christos TEST_BEGIN(test_pow2_ceil_u32) {
     42  1.1  christos 	TEST_POW2_CEIL(uint32_t, u32, FMTu32);
     43  1.1  christos }
     44  1.1  christos TEST_END
     45  1.1  christos 
     46  1.1  christos TEST_BEGIN(test_pow2_ceil_zu) {
     47  1.1  christos 	TEST_POW2_CEIL(size_t, zu, "zu");
     48  1.1  christos }
     49  1.1  christos TEST_END
     50  1.1  christos 
     51  1.1  christos int
     52  1.1  christos main(void) {
     53  1.1  christos 	return test(
     54  1.1  christos 	    test_pow2_ceil_u64,
     55  1.1  christos 	    test_pow2_ceil_u32,
     56  1.1  christos 	    test_pow2_ceil_zu);
     57  1.1  christos }
     58