bitmap.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * RT-Thread RuiChing
  3. *
  4. * COPYRIGHT (C) 2024-2025 Shanghai Real-Thread Electronic Technology Co., Ltd.
  5. * All rights reserved.
  6. *
  7. * The license and distribution terms for this file may be
  8. * found in the file LICENSE in this distribution.
  9. */
  10. #ifndef __UTIL_BITMAP_H__
  11. #define __UTIL_BITMAP_H__
  12. #include <rtdef.h>
  13. typedef rt_ubase_t rt_bitmap_t;
  14. #define RT_BITMAP_BITS_MIN (sizeof(rt_bitmap_t) * 8)
  15. #define RT_BITMAP_LEN(bits) \
  16. (((bits) + (RT_BITMAP_BITS_MIN) - 1) / (RT_BITMAP_BITS_MIN))
  17. #define RT_BITMAP_BIT_LEN(nr) (nr * RT_BITMAP_BITS_MIN)
  18. #define RT_BITMAP_DECLARE(name, bits) rt_bitmap_t name[RT_BITMAP_LEN(bits)]
  19. rt_inline void rt_bitmap_set_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
  20. {
  21. bitmap[bit / RT_BITMAP_BITS_MIN] |=
  22. (1UL << (bit & (RT_BITMAP_BITS_MIN - 1)));
  23. }
  24. rt_inline rt_bool_t rt_bitmap_test_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
  25. {
  26. return !!(bitmap[bit / RT_BITMAP_BITS_MIN] &
  27. (1UL << (bit & (RT_BITMAP_BITS_MIN - 1))));
  28. }
  29. rt_inline void rt_bitmap_clear_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
  30. {
  31. bitmap[bit / RT_BITMAP_BITS_MIN] &=
  32. ~(1UL << (bit & (RT_BITMAP_BITS_MIN - 1)));
  33. }
  34. rt_inline rt_size_t rt_bitmap_next_set_bit(
  35. rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit)
  36. {
  37. rt_size_t bit;
  38. for (bit = start; bit < limit && !rt_bitmap_test_bit(bitmap, bit); ++bit) {
  39. }
  40. return bit;
  41. }
  42. rt_inline rt_size_t rt_bitmap_next_clear_bit(
  43. rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit)
  44. {
  45. rt_size_t bit;
  46. for (bit = start; bit < limit && rt_bitmap_test_bit(bitmap, bit); ++bit) { }
  47. return bit;
  48. }
  49. #define rt_bitmap_for_each_bit_from(state, bitmap, from, bit, limit) \
  50. for ((bit) = rt_bitmap_next_##state##_bit((bitmap), (from), (limit)); \
  51. (bit) < (limit); \
  52. (bit) = rt_bitmap_next_##state##_bit((bitmap), (bit + 1), (limit)))
  53. #define rt_bitmap_for_each_set_bit_from(bitmap, from, bit, limit) \
  54. rt_bitmap_for_each_bit_from(set, bitmap, from, bit, limit)
  55. #define rt_bitmap_for_each_set_bit(bitmap, bit, limit) \
  56. rt_bitmap_for_each_set_bit_from(bitmap, 0, bit, limit)
  57. #define rt_bitmap_for_each_clear_bit_from(bitmap, from, bit, limit) \
  58. rt_bitmap_for_each_bit_from(clear, bitmap, from, bit, limit)
  59. #define rt_bitmap_for_each_clear_bit(bitmap, bit, limit) \
  60. rt_bitmap_for_each_clear_bit_from(bitmap, 0, bit, limit)
  61. #endif /* __UTIL_BITMAP_H__ */