1 /*
2 * Copyright (c) 2006-2022, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2022-6-27 GuEe-GUI first version
9 */
10
11 #ifndef __UTIL_BITMAP_H__
12 #define __UTIL_BITMAP_H__
13
14 #include <rtdef.h>
15
16 typedef rt_ubase_t rt_bitmap_t;
17
18 #define RT_BITMAP_BITS_MIN (sizeof(rt_bitmap_t) * 8)
19 #define RT_BITMAP_LEN(bits) (((bits) + (RT_BITMAP_BITS_MIN) - 1) / (RT_BITMAP_BITS_MIN))
20 #define RT_BITMAP_BIT_LEN(nr) (nr * RT_BITMAP_BITS_MIN)
21 #define RT_BITMAP_DECLARE(name, bits) rt_bitmap_t name[RT_BITMAP_LEN(bits)]
22
rt_bitmap_set_bit(rt_bitmap_t * bitmap,rt_uint32_t bit)23 rt_inline void rt_bitmap_set_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
24 {
25 bitmap[bit / RT_BITMAP_BITS_MIN] |= (1UL << (bit & (RT_BITMAP_BITS_MIN - 1)));
26 }
27
rt_bitmap_test_bit(rt_bitmap_t * bitmap,rt_uint32_t bit)28 rt_inline rt_bool_t rt_bitmap_test_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
29 {
30 return !!(bitmap[bit / RT_BITMAP_BITS_MIN] & (1UL << (bit & (RT_BITMAP_BITS_MIN - 1))));
31 }
32
rt_bitmap_clear_bit(rt_bitmap_t * bitmap,rt_uint32_t bit)33 rt_inline void rt_bitmap_clear_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
34 {
35 bitmap[bit / RT_BITMAP_BITS_MIN] &= ~(1UL << (bit & (RT_BITMAP_BITS_MIN - 1)));
36 }
37
rt_bitmap_next_set_bit(rt_bitmap_t * bitmap,rt_size_t start,rt_size_t limit)38 rt_inline rt_size_t rt_bitmap_next_set_bit(rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit)
39 {
40 rt_size_t bit;
41
42 for (bit = start; bit < limit && !rt_bitmap_test_bit(bitmap, bit); ++bit)
43 {
44 }
45
46 return bit;
47 }
48
rt_bitmap_next_clear_bit(rt_bitmap_t * bitmap,rt_size_t start,rt_size_t limit)49 rt_inline rt_size_t rt_bitmap_next_clear_bit(rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit)
50 {
51 rt_size_t bit;
52
53 for (bit = start; bit < limit && rt_bitmap_test_bit(bitmap, bit); ++bit)
54 {
55 }
56
57 return bit;
58 }
59
60 #define rt_bitmap_for_each_bit_from(state, bitmap, from, bit, limit) \
61 for ((bit) = rt_bitmap_next_##state##_bit((bitmap), (from), (limit)); \
62 (bit) < (limit); \
63 (bit) = rt_bitmap_next_##state##_bit((bitmap), (bit + 1), (limit)))
64
65 #define rt_bitmap_for_each_set_bit_from(bitmap, from, bit, limit) \
66 rt_bitmap_for_each_bit_from(set, bitmap, from, bit, limit)
67
68 #define rt_bitmap_for_each_set_bit(bitmap, bit, limit) \
69 rt_bitmap_for_each_set_bit_from(bitmap, 0, bit, limit)
70
71 #define rt_bitmap_for_each_clear_bit_from(bitmap, from, bit, limit) \
72 rt_bitmap_for_each_bit_from(clear, bitmap, from, bit, limit)
73
74 #define rt_bitmap_for_each_clear_bit(bitmap, bit, limit) \
75 rt_bitmap_for_each_clear_bit_from(bitmap, 0, bit, limit)
76
77 #endif /* __UTIL_BITMAP_H__ */
78