[−][src]Derive Macro modular_bitfield::BitfieldSpecifier
#[derive(BitfieldSpecifier)] { // Attributes available to this derive: #[bits] }
Derive macro for Rust enums
to implement Specifier
trait.
This allows such an enum to be used as a field of a #[bitfield]
struct.
The annotated enum must not have any variants with associated data and
by default must have a number of variants that is equal to the power of 2.
If a user wants to circumvent the latter restriction they can add
#[bits = N]
below the #[derive(BitfieldSpecifier)]
line in order to
signal to the code generation that the enum may have a relaxed number
of variants.
Example
Example: Basic Usage
In the following we define a MaybeWeekday
enum that lists all weekdays
as well as an invalid day so that we have a power-of-two number of variants.
use modular_bitfield::prelude::*; #[derive(BitfieldSpecifier)] pub enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, None }
Example: #[bits = N]
If we want to get rid of the None
variant we need to add #[bits = 3]
:
#[derive(BitfieldSpecifier)] #[bits = 3] pub enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
Example: Discriminants
It is possible to explicitly assign discriminants to some of the days. In our case this is useful since our week starts at sunday:
#[derive(BitfieldSpecifier)] #[bits = 3] pub enum Weekday { Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6, Sunday = 0, }
Example: Use in #[bitfield]
Given the above Weekday
enum that starts at Sunday
and uses 3 bits in total
we can now use it in a #[bitfield]
annotated struct as follows:
#[bitfield] pub struct MeetingTimeSlot { day: Weekday, from: B6, to: B6, expired: bool, }
The above MeetingTimeSlot
uses exactly 16 bits and defines our Weekday
enum as
compact day
bitfield. The from
and to
require 6 bits each and finally the
expired
flag requires a single bit.
Example: Interacting
A user can interact with the above MeetingTimeSlot
and Weekday
definitions in
the following ways:
let mut slot = MeetingTimeSlot::new() .with_day(Weekday::Friday) .with_from(14) // 14:00 CEST .with_to(15); // 15:00 CEST assert_eq!(slot.day(), Weekday::Friday); assert_eq!(slot.from(), 14); assert_eq!(slot.to(), 15); assert!(!slot.expired());