]> Sergey Matveev's repositories - bfs.git/blob - tests/bit.c
Skip mtab
[bfs.git] / tests / bit.c
1 // Copyright © Tavian Barnes <tavianator@tavianator.com>
2 // SPDX-License-Identifier: 0BSD
3
4 #include "../src/bit.h"
5 #include "../src/diag.h"
6 #include <limits.h>
7 #include <stdint.h>
8 #include <stdlib.h>
9
10 bfs_static_assert(UMAX_WIDTH(0x1) == 1);
11 bfs_static_assert(UMAX_WIDTH(0x3) == 2);
12 bfs_static_assert(UMAX_WIDTH(0x7) == 3);
13 bfs_static_assert(UMAX_WIDTH(0xF) == 4);
14 bfs_static_assert(UMAX_WIDTH(0xFF) == 8);
15 bfs_static_assert(UMAX_WIDTH(0xFFF) == 12);
16 bfs_static_assert(UMAX_WIDTH(0xFFFF) == 16);
17
18 #define UWIDTH_MAX(n) (2 * ((UINTMAX_C(1) << ((n) - 1)) - 1) + 1)
19 #define IWIDTH_MAX(n) UWIDTH_MAX((n) - 1)
20 #define IWIDTH_MIN(n) (-(intmax_t)IWIDTH_MAX(n) - 1)
21
22 bfs_static_assert(UCHAR_MAX == UWIDTH_MAX(UCHAR_WIDTH));
23 bfs_static_assert(SCHAR_MIN == IWIDTH_MIN(SCHAR_WIDTH));
24 bfs_static_assert(SCHAR_MAX == IWIDTH_MAX(SCHAR_WIDTH));
25
26 bfs_static_assert(USHRT_MAX == UWIDTH_MAX(USHRT_WIDTH));
27 bfs_static_assert(SHRT_MIN == IWIDTH_MIN(SHRT_WIDTH));
28 bfs_static_assert(SHRT_MAX == IWIDTH_MAX(SHRT_WIDTH));
29
30 bfs_static_assert(UINT_MAX == UWIDTH_MAX(UINT_WIDTH));
31 bfs_static_assert(INT_MIN == IWIDTH_MIN(INT_WIDTH));
32 bfs_static_assert(INT_MAX == IWIDTH_MAX(INT_WIDTH));
33
34 bfs_static_assert(ULONG_MAX == UWIDTH_MAX(ULONG_WIDTH));
35 bfs_static_assert(LONG_MIN == IWIDTH_MIN(LONG_WIDTH));
36 bfs_static_assert(LONG_MAX == IWIDTH_MAX(LONG_WIDTH));
37
38 bfs_static_assert(ULLONG_MAX == UWIDTH_MAX(ULLONG_WIDTH));
39 bfs_static_assert(LLONG_MIN == IWIDTH_MIN(LLONG_WIDTH));
40 bfs_static_assert(LLONG_MAX == IWIDTH_MAX(LLONG_WIDTH));
41
42 bfs_static_assert(SIZE_MAX == UWIDTH_MAX(SIZE_WIDTH));
43 bfs_static_assert(PTRDIFF_MIN == IWIDTH_MIN(PTRDIFF_WIDTH));
44 bfs_static_assert(PTRDIFF_MAX == IWIDTH_MAX(PTRDIFF_WIDTH));
45
46 bfs_static_assert(UINTPTR_MAX == UWIDTH_MAX(UINTPTR_WIDTH));
47 bfs_static_assert(INTPTR_MIN == IWIDTH_MIN(INTPTR_WIDTH));
48 bfs_static_assert(INTPTR_MAX == IWIDTH_MAX(INTPTR_WIDTH));
49
50 bfs_static_assert(UINTMAX_MAX == UWIDTH_MAX(UINTMAX_WIDTH));
51 bfs_static_assert(INTMAX_MIN == IWIDTH_MIN(INTMAX_WIDTH));
52 bfs_static_assert(INTMAX_MAX == IWIDTH_MAX(INTMAX_WIDTH));
53
54 #define verify_eq(a, b) \
55         bfs_verify((a) == (b), "(0x%jX) %s != %s (0x%jX)", (uintmax_t)(a), #a, #b, (uintmax_t)(b))
56
57 int main(void) {
58         verify_eq(bswap((uint8_t)0x12), 0x12);
59         verify_eq(bswap((uint16_t)0x1234), 0x3412);
60         verify_eq(bswap((uint32_t)0x12345678), 0x78563412);
61         verify_eq(bswap((uint64_t)0x1234567812345678), 0x7856341278563412);
62
63         verify_eq(count_ones(0x0), 0);
64         verify_eq(count_ones(0x1), 1);
65         verify_eq(count_ones(0x2), 1);
66         verify_eq(count_ones(0x3), 2);
67         verify_eq(count_ones(0x137F), 10);
68
69         verify_eq(count_zeros(0), INT_WIDTH);
70         verify_eq(count_zeros(0L), LONG_WIDTH);
71         verify_eq(count_zeros(0LL), LLONG_WIDTH);
72         verify_eq(count_zeros((uint8_t)0), 8);
73         verify_eq(count_zeros((uint16_t)0), 16);
74         verify_eq(count_zeros((uint32_t)0), 32);
75         verify_eq(count_zeros((uint64_t)0), 64);
76
77         verify_eq(rotate_left((uint8_t)0xA1, 4), 0x1A);
78         verify_eq(rotate_left((uint16_t)0x1234, 12), 0x4123);
79         verify_eq(rotate_left((uint32_t)0x12345678, 20), 0x67812345);
80         verify_eq(rotate_left((uint32_t)0x12345678, 0), 0x12345678);
81
82         verify_eq(rotate_right((uint8_t)0xA1, 4), 0x1A);
83         verify_eq(rotate_right((uint16_t)0x1234, 12), 0x2341);
84         verify_eq(rotate_right((uint32_t)0x12345678, 20), 0x45678123);
85         verify_eq(rotate_right((uint32_t)0x12345678, 0), 0x12345678);
86
87         for (int i = 0; i < 16; ++i) {
88                 uint16_t n = (uint16_t)1 << i;
89                 for (int j = i; j < 16; ++j) {
90                         uint16_t m = (uint16_t)1 << j;
91                         uint16_t nm = n | m;
92                         verify_eq(count_ones(nm), 1 + (n != m));
93                         verify_eq(count_zeros(nm), 15 - (n != m));
94                         verify_eq(leading_zeros(nm), 15 - j);
95                         verify_eq(trailing_zeros(nm), i);
96                         verify_eq(first_leading_one(nm), j + 1);
97                         verify_eq(first_trailing_one(nm), i + 1);
98                         verify_eq(bit_width(nm), j + 1);
99                         verify_eq(bit_floor(nm), m);
100                         if (n == m) {
101                                 verify_eq(bit_ceil(nm), m);
102                                 bfs_verify(has_single_bit(nm));
103                         } else {
104                                 if (j < 15) {
105                                         verify_eq(bit_ceil(nm), (m << 1));
106                                 }
107                                 bfs_verify(!has_single_bit(nm));
108                         }
109                 }
110         }
111
112         verify_eq(leading_zeros((uint16_t)0), 16);
113         verify_eq(trailing_zeros((uint16_t)0), 16);
114         verify_eq(first_leading_one(0), 0);
115         verify_eq(first_trailing_one(0), 0);
116         verify_eq(bit_width(0), 0);
117         verify_eq(bit_floor(0), 0);
118         verify_eq(bit_ceil(0), 1);
119
120         return EXIT_SUCCESS;
121 }