diff options
| author | guo <[email protected]> | 2023-07-06 16:52:30 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-06 16:52:30 +0800 |
| commit | 78867912c114966d49e003db2ffb3407a5017b46 (patch) | |
| tree | e8b34c99bbf57feb4e1e976993d01ef6f9d3fd13 /components/utilities/libadt/bitmap | |
| parent | c7be260665c9c753b343141968755d47deadd753 (diff) | |
| parent | fa10a99c3ccecd6113d30842a05e1b853cf7d1cb (diff) | |
Merge pull request #7788 from ErikChanHub/master
【dd2.0】Support Open Firmware API
Diffstat (limited to 'components/utilities/libadt/bitmap')
| -rwxr-xr-x | components/utilities/libadt/bitmap/SConscript | 9 | ||||
| -rwxr-xr-x | components/utilities/libadt/bitmap/bitmap.h | 77 |
2 files changed, 86 insertions, 0 deletions
diff --git a/components/utilities/libadt/bitmap/SConscript b/components/utilities/libadt/bitmap/SConscript new file mode 100755 index 0000000000..739ff3b090 --- /dev/null +++ b/components/utilities/libadt/bitmap/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = list() +CPPPATH = [cwd] +group = [] + +group = DefineGroup('LIBADT', src, depend = ['RT_USING_ADT_BITMAP'], CPPPATH = CPPPATH) +Return('group') diff --git a/components/utilities/libadt/bitmap/bitmap.h b/components/utilities/libadt/bitmap/bitmap.h new file mode 100755 index 0000000000..72fe54333a --- /dev/null +++ b/components/utilities/libadt/bitmap/bitmap.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-6-27 GuEe-GUI first version + */ + +#ifndef __UTIL_BITMAP_H__ +#define __UTIL_BITMAP_H__ + +#include <rtdef.h> + +typedef rt_ubase_t rt_bitmap_t; + +#define RT_BITMAP_BITS_MIN (sizeof(rt_bitmap_t) * 8) +#define RT_BITMAP_LEN(bits) (((bits) + (RT_BITMAP_BITS_MIN) - 1) / (RT_BITMAP_BITS_MIN)) +#define RT_BITMAP_BIT_LEN(nr) (nr * RT_BITMAP_BITS_MIN) +#define RT_DECLARE_BITMAP(name, bits) rt_bitmap_t name[RT_BITMAP_LEN(bits)] + +rt_inline void rt_bitmap_set_bit(rt_bitmap_t *bitmap, rt_uint32_t bit) +{ + bitmap[bit / RT_BITMAP_BITS_MIN] |= (1UL << (bit & (RT_BITMAP_BITS_MIN - 1))); +} + +rt_inline rt_bool_t rt_bitmap_test_bit(rt_bitmap_t *bitmap, rt_uint32_t bit) +{ + return !!(bitmap[bit / RT_BITMAP_BITS_MIN] & (1UL << (bit & (RT_BITMAP_BITS_MIN - 1)))); +} + +rt_inline void rt_bitmap_clear_bit(rt_bitmap_t *bitmap, rt_uint32_t bit) +{ + bitmap[bit / RT_BITMAP_BITS_MIN] &= ~(1UL << (bit & (RT_BITMAP_BITS_MIN - 1))); +} + +rt_inline rt_size_t rt_bitmap_next_set_bit(rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit) +{ + rt_size_t bit; + + for (bit = start; bit < limit && !rt_bitmap_test_bit(bitmap, bit); ++bit) + { + } + + return bit; +} + +rt_inline rt_size_t rt_bitmap_next_clear_bit(rt_bitmap_t *bitmap, rt_size_t start, rt_size_t limit) +{ + rt_size_t bit; + + for (bit = start; bit < limit && rt_bitmap_test_bit(bitmap, bit); ++bit) + { + } + + return bit; +} + +#define rt_bitmap_for_each_bit_from(state, bitmap, from, bit, limit) \ + for ((bit) = rt_bitmap_next_##state##_bit((bitmap), (from), (limit)); \ + (bit) < (limit); \ + (bit) = rt_bitmap_next_##state##_bit((bitmap), (bit + 1), (limit))) + +#define rt_bitmap_for_each_set_bit_from(bitmap, from, bit, limit) \ + rt_bitmap_for_each_bit_from(set, bitmap, from, bit, limit) + +#define rt_bitmap_for_each_set_bit(bitmap, bit, limit) \ + rt_bitmap_for_each_set_bit_from(bitmap, 0, bit, limit) + +#define rt_bitmap_for_each_clear_bit_from(bitmap, from, bit, limit) \ + rt_bitmap_for_each_bit_from(clear, bitmap, from, bit, limit) + +#define rt_bitmap_for_each_clear_bit(bitmap, bit, limit) \ + rt_bitmap_for_each_clear_bit_from(bitmap, 0, bit, limit) + +#endif /* __UTIL_BITMAP_H__ */ |
