Introducing macro bits_value_indexed().
[dmxpainter.git] / src / util / bits.h
1 #pragma once
2
3 #include <inttypes.h>
4
5 // Set a byte bit-by-bit.
6 #define bits_uint8(b7, b6, b5, b4, b3, b2, b1, b0) (uint8_t)( \
7   ((uint8_t)b7 << 7) | \
8   ((uint8_t)b6 << 6) | \
9   ((uint8_t)b5 << 5) | \
10   ((uint8_t)b4 << 4) | \
11   ((uint8_t)b3 << 3) | \
12   ((uint8_t)b2 << 2) | \
13   ((uint8_t)b1 << 1) | \
14   ((uint8_t)b0 << 0) | \
15   0 )
16
17 // Set and clear bits based on a mask.
18 // Hmmm... why don't we have to take care of
19 // http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intpromote
20 #define bits_mask_on(var, mask)  (var |= (mask))
21 #define bits_mask_off(var, mask) (var &= ~(mask))
22
23 // A nicer name for a useful macor.
24 #define bits_value(v) _BV(v)
25 #define bits_value_indexed(v, i) bits_value(v ## i)
26
27 // Set and clear a single bit.
28 #define bits_on(var, bit)  bits_mask_on( var, bits_value(bit))
29 #define bits_off(var, bit) bits_mask_off(var, bits_value(bit))