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