12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #ifndef BITMAP_H
- #define BITMAP_H
- #define BITS_IN_LONG (sizeof(unsigned long)*8)
- #define LONGS(x) ((x + BITS_IN_LONG - 1) & -BITS_IN_LONG)
- /* Every bitmap gets its own type */
- #define DECLARE_BITMAP(name, x) unsigned long name[LONGS(x)]
- static inline int test_bit(unsigned int nr, unsigned long *bitmap)
- {
- unsigned long offset = nr / BITS_IN_LONG;
- unsigned long bit = nr & (BITS_IN_LONG-1);
- return (bitmap[offset] >> bit) & 1;
- }
- static inline void set_bit(unsigned int nr, unsigned long *bitmap)
- {
- unsigned long offset = nr / BITS_IN_LONG;
- unsigned long bit = nr & (BITS_IN_LONG-1);
- bitmap[offset] |= 1UL << bit;
- }
- static inline void clear_bit(unsigned int nr, unsigned long *bitmap)
- {
- unsigned long offset = nr / BITS_IN_LONG;
- unsigned long bit = nr & (BITS_IN_LONG-1);
- bitmap[offset] &= ~(1UL << bit);
- }
- static inline int test_and_set_bit(unsigned int nr, unsigned long *bitmap)
- {
- unsigned long offset = nr / BITS_IN_LONG;
- unsigned long bit = nr & (BITS_IN_LONG-1);
- unsigned long old = bitmap[offset];
- unsigned long mask = 1UL << bit;
- bitmap[offset] = old | mask;
- return (old & mask) != 0;
- }
- static inline int test_and_clear_bit(unsigned int nr, unsigned long *bitmap)
- {
- unsigned long offset = nr / BITS_IN_LONG;
- unsigned long bit = nr & (BITS_IN_LONG-1);
- unsigned long old = bitmap[offset];
- unsigned long mask = 1UL << bit;
- bitmap[offset] = old & ~mask;
- return (old & mask) != 0;
- }
- #endif /* BITMAP_H */
|