1 unstable release

Uses new Rust 2024

new 0.0.10-beta.3 Apr 20, 2025

#1140 in Rust patterns

MIT/Apache

33KB
483 lines

🚧 Warning: Experimental Crate! 🚧

This crate is currently in beta and experimental.
It is subject to breaking changes in future releases.
Use it at your own risk, and keep in mind that the API may change in future versions.

BitFlags

A crate to manage bitflags with enums.

Features

  • Easily create and manage bitflags using enums.
  • Provides intuitive methods for adding, removing, and toggling flags.
  • Supports bitwise operations (|, &, ^, !) for combining and manipulating flags.
  • Implements iteration over active flags.

Defining a BitFlags

#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
enum TeamFlag {
    Blue,
    Red,
    Yellow,
}

impl MaxValue for TeamFlag {
    const MAX: Self = Self::Yellow;
}

impl From<TeamFlag> for u8 {
    fn from(value: TeamFlag) -> Self {
        value as u8
    }
}

impl TryFrom<u8> for TeamFlag {
    type Error = ();
    fn try_from(value: u8) -> Result<Self, Self::Error> {
        match value {
            0 => Ok(TeamFlag::Blue),
            1 => Ok(TeamFlag::Red),
            2 => Ok(TeamFlag::Yellow),
            _ => Err(()),
        }
    }
}

type Team = BitFlags<TeamFlag, u8>;

Basic Operations

fn main() 
{
    let mut team = Team::ZERO | TeamFlag::Blue | TeamFlag::Red;
    // same as
    // let mut team = Team::ZERO.added(TeamFlag::Blue).added(TeamFlag::Red);

    team ^= TeamFlag::Red;
    // same as
    // team.toggle(TeamFlag::Red);
    
    assert!(team.have(TeamFlag::Blue));
    assert!(!team.have(TeamFlag::Red));
    assert!(!team.have(TeamFlag::Yellow));

    team |= TeamFlag::Yellow;
    assert!(team.have(TeamFlag::Yellow));
}

Iteration

fn main() 
{
    let mut teams = Team::ZERO | TeamFlag::Blue | TeamFlag::Red;

    // iteration :
    for team in teams
    {
        
    }
}

Dependencies