bitmap.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. #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) (((bits) + (RT_BITMAP_BITS_MIN) - 1) / (RT_BITMAP_BITS_MIN))
  16. #define RT_BITMAP_BIT_LEN(nr) (nr * RT_BITMAP_BITS_MIN)
  17. #define RT_DECLARE_BITMAP(name, bits) rt_bitmap_t name[RT_BITMAP_LEN(bits)]
  18. rt_inline void rt_bitmap_set_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
  19. {
  20. bitmap[bit / RT_BITMAP_BITS_MIN] |= (1UL << (bit & (RT_BITMAP_BITS_MIN - 1)));
  21. }
  22. rt_inline rt_bool_t rt_bitmap_test_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
  23. {
  24. return !!(bitmap[bit / RT_BITMAP_BITS_MIN] & (1UL << (bit & (RT_BITMAP_BITS_MIN - 1))));
  25. }
  26. rt_inline void rt_bitmap_clear_bit(rt_bitmap_t *bitmap, rt_uint32_t bit)
  27. {
  28. bitmap[bit / RT_BITMAP_BITS_MIN] &= ~(1UL << (bit & (RT_BITMAP_BITS_MIN - 1)));
  29. }
  30. rt_inline rt_size_t rt_bitmap_next_set_bit(rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit)
  31. {
  32. rt_size_t bit;
  33. for (bit = start; bit < limit && !rt_bitmap_test_bit(bitmap, bit); ++bit)
  34. {
  35. }
  36. return bit;
  37. }
  38. rt_inline rt_size_t rt_bitmap_next_clear_bit(rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit)
  39. {
  40. rt_size_t bit;
  41. for (bit = start; bit < limit && rt_bitmap_test_bit(bitmap, bit); ++bit)
  42. {
  43. }
  44. return bit;
  45. }
  46. #define rt_bitmap_for_each_bit_from(state, bitmap, from, bit, limit) \
  47. for ((bit) = rt_bitmap_next_##state##_bit((bitmap), (from), (limit)); \
  48. (bit) < (limit); \
  49. (bit) = rt_bitmap_next_##state##_bit((bitmap), (bit + 1), (limit)))
  50. #define rt_bitmap_for_each_set_bit_from(bitmap, from, bit, limit) \
  51. rt_bitmap_for_each_bit_from(set, bitmap, from, bit, limit)
  52. #define rt_bitmap_for_each_set_bit(bitmap, bit, limit) \
  53. rt_bitmap_for_each_set_bit_from(bitmap, 0, bit, limit)
  54. #define rt_bitmap_for_each_clear_bit_from(bitmap, from, bit, limit) \
  55. rt_bitmap_for_each_bit_from(clear, bitmap, from, bit, limit)
  56. #define rt_bitmap_for_each_clear_bit(bitmap, bit, limit) \
  57. rt_bitmap_for_each_clear_bit_from(bitmap, 0, bit, limit)
  58. #endif /* __UTIL_BITMAP_H__ */