[−][src]Macro bit_fiddler::set
Macro for setting single, multiple or range of bits. It accepts multiple patterns for different use cases. It doesn't do any overflow or underflow checks. Behaviour on passing invalid args is undefined.
For all patterns, first arg is the bitmap. Bitmap can be passed in 2 ways:
In first case, it will return the resultant bitmap after setting bits without making any changes to the bitmap passed.
let bitmap: u8 = 0b_0000_0000; let res = set!(bitmap, u8, ...); assert_eq!(bitmap, 0b_0000_0000); // Stays same println!("{:#b}", res); // new bitmap with set bits
In this case, bitmap can also be a literal:
// bits will be set on 0b_0000_0101 and moved to res let res = set!(0b_0000_0101, u8, ...);
In the second case, we use in
before the bitmap.
This pattern will make changes to the bitmap itself and
return nothing.
let mut bitmap = 0b_0000_0000; set!(in bitmap, u8, ...); // bits were set in bitmap
Another common thing in these patterns is rev
.
All patterns support this. Putting rev
before the
bits being set makes the macro set the bits from left hand side.
Without rev
, bits will be set from right hand side.
For example,
let mut bitmap = 0; // Setting 2nd bit from rhs set!(in bitmap, u8, 2); assert_eq!(bitmap, 0b_0000_0100); // Setting 2nd bit from lhs set!(in bitmap, u8, rev 2); assert_eq!(bitmap, 0b_0010_0100);
Setting Bit Ranges
[<start_pos>..<end_pos>]
and [start = <start_pos>, count = <count>]
patterns are used for setting range of bits.
If range has 0 bits (e.g., [3..3] or [start = 3, count = 0]), the behaviour is undefined and may panic.
Examples
use bit_fiddler::set; // Set third bit from the right and return the resulting bitmap. let bitmap = 0; let x = set!(bitmap, u8, 2); assert_eq!(x, 0b100); // Set third bit from the right in the passed bitmap itself. let mut bitmap = 0; set!(in bitmap, u8, 2); assert_eq!(bitmap, 0b100); // Set third bit from the left and return the resulting bitmap. let bitmap: u8 = 0; let x = set!(bitmap, u8, rev 2); assert_eq!(x, 0b_0010_0000); // Set third bit from the left in the passed bitmap itself. let mut bitmap: u8 = 0; set!(in bitmap, u8, rev 2); assert_eq!(bitmap, 0b_0010_0000); // Set second, third & fourth bit from the right and return the resulting bitmap. let bitmap = 0; let x = set!(bitmap, u8, [1, 2, 3]); assert_eq!(x, 0b1110); // Set second, third & fourth bit from the right in the passed bitmap itself. let mut bitmap = 0; set!(in bitmap, u8, [1, 2, 3]); assert_eq!(bitmap, 0b1110); // Set second, third & fourth bit from the left and return the resulting bitmap. let bitmap: u8 = 0; let x = set!(bitmap, u8, rev [1, 2, 3]); assert_eq!(x, 0b0111_0000); // Set second, third & fourth bit from the left in the passed bitmap itself. let mut bitmap: u8 = 0; set!(in bitmap, u8, rev [1, 2, 3]); assert_eq!(bitmap, 0b0111_0000); // Set second & third (1 and 2) bit from the right and return the resulting bitmap. let bitmap = 0; let x = set!(bitmap, u8, [1..3]); assert_eq!(x, 0b110); // Set second & third bit (1 and 2) from the right in the passed bitmap itself. let mut bitmap = 0; set!(in bitmap, u8, [1..3]); assert_eq!(bitmap, 0b110); // Starting from second bit, set 2 bits from the right and return the resulting bitmap. let bitmap = 0; let x = set!(bitmap, u8, [start = 1, count = 2]); assert_eq!(x, 0b110); // Starting from second bit, set 2 bits from the right in the passed bitmap itself. let mut bitmap = 0; set!(in bitmap, u8, [start = 1, count = 2]); assert_eq!(bitmap, 0b110); // Set second & third bit (1 and 2) from the left and return the resulting bitmap. let bitmap: u8 = 0; let x = set!(bitmap, u8, rev [1..3]); assert_eq!(x, 0b_0110_0000); // Set second & third bit (1 and 2) from the left in the passed bitmap itself. let mut bitmap: u8 = 0; set!(in bitmap, u8, rev [1..3]); assert_eq!(bitmap, 0b_0110_0000); // Starting from second bit, set 2 bits from the left and return the resulting bitmap. let bitmap: u8 = 0; let x = set!(bitmap, u8, rev [start = 1, count = 2]); assert_eq!(x, 0b_0110_0000); // Starting from second bit, set 2 bits from the left in the passed bitmap itself. let mut bitmap: u8 = 0; set!(in bitmap, u8, rev [start = 1, count = 2]); assert_eq!(bitmap, 0b_0110_0000);