xref: /linux/tools/testing/selftests/bpf/libarena/include/libarena/bitmap.h (revision 5a8cd539ac19f7a68e68e1d25ef9ca2ff55b8500)
1 #pragma once
2 
3 #define BITS_PER_BYTE		8
4 #define BYTES_TO_BITS(nb)	((nb) * BITS_PER_BYTE)
5 
6 #define BITS_PER_LONG_LONG	(sizeof(long long) * BITS_PER_BYTE)
7 #define BITS_TO_LONG_LONGS(nr)	(((nr) + BITS_PER_LONG_LONG - 1) / BITS_PER_LONG_LONG)
8 #define BIT_MASK(nr)		(1ULL << ((nr) % BITS_PER_LONG_LONG))
9 #define BIT_WORD(nr)		((nr) / BITS_PER_LONG_LONG)
10 
11 struct arena_bitmap {
12 	u64 bits[0];
13 };
14 
15 struct arena_bitmap __arena *bmp_alloc(size_t bits);
16 void bmp_free(struct arena_bitmap __arena *bmp);
17 
18 void __bmp_set_bit(u32 bit, struct arena_bitmap __arena *bmp);
19 void __bmp_clear_bit(u32 bit, struct arena_bitmap __arena *bmp);
20 void bmp_set_bit(u32 bit, struct arena_bitmap __arena *bmp);
21 void bmp_clear_bit(u32 bit, struct arena_bitmap __arena *bmp);
22 bool bmp_test_bit(u32 bit, struct arena_bitmap __arena *bmp);
23 bool bmp_test_and_clear_bit(u32 bit, struct arena_bitmap __arena *bmp);
24 bool bmp_test_and_set_bit(u32 bit, struct arena_bitmap __arena *bmp);
25 
26 void bmp_clear(size_t bits, struct arena_bitmap __arena *bmp);
27 void bmp_and(size_t bits, struct arena_bitmap __arena *dst, struct arena_bitmap __arena *src1, struct arena_bitmap __arena *src2);
28 void bmp_or(size_t bits, struct arena_bitmap __arena *dst, struct arena_bitmap __arena *src1, struct arena_bitmap __arena *src2);
29 bool bmp_empty(size_t bits, struct arena_bitmap __arena *bmp);
30 void bmp_copy(size_t bits, struct arena_bitmap __arena *dst, struct arena_bitmap __arena *src);
31 
32 bool bmp_intersects(size_t bits, struct arena_bitmap __arena *arg1, struct arena_bitmap __arena *arg2);
33 bool bmp_subset(size_t bits, struct arena_bitmap __arena *big, struct arena_bitmap __arena *small);
34 void bmp_print(size_t bits, struct arena_bitmap __arena *bmp);
35