Skip to content

Enum Extensions

Shmellyorc edited this page Aug 31, 2026 · 1 revision

EnumExtensions provides extension methods for bitwise operations on flag-based enumerations, allowing for intuitive flag manipulation without explicit casting.


Overview

Feature Description
Set Flag Add a flag to an enum value
Clear Flag Remove a flag from an enum value
Toggle Flag Toggle a flag on an enum value
Has All Check if all specified flags are set
Has Any Check if any specified flag is set
Has Only Check if exactly one flag is set
Has None Check if no flags are set

Methods

SetFlag

Adds a flag to an enum value.

[Flags]
public enum MyFlags
{
    None = 0,
    Option1 = 1 << 0,
    Option2 = 1 << 1,
    Option3 = 1 << 2
}

var flags = MyFlags.Option1;
flags = flags.SetFlag(MyFlags.Option2);
// Result: Option1 | Option2

ClearFlag

Removes a flag from an enum value.

var flags = MyFlags.Option1 | MyFlags.Option2;
flags = flags.ClearFlag(MyFlags.Option1);
// Result: Option2

ToggleFlag

Toggles a flag on an enum value.

var flags = MyFlags.Option1;
flags = flags.ToggleFlag(MyFlags.Option2);
// Result: Option1 | Option2

flags = flags.ToggleFlag(MyFlags.Option2);
// Result: Option1

HasAllFlags

Determines whether all specified flags are set.

var flags = MyFlags.Option1 | MyFlags.Option2;

bool hasAll = flags.HasAllFlags(MyFlags.Option1 | MyFlags.Option2);
// Returns: true

bool hasAll2 = flags.HasAllFlags(MyFlags.Option1 | MyFlags.Option3);
// Returns: false

HasAnyFlag

Determines whether any of the specified flags are set.

var flags = MyFlags.Option1;

bool hasAny = flags.HasAnyFlag(MyFlags.Option1 | MyFlags.Option2);
// Returns: true

bool hasAny2 = flags.HasAnyFlag(MyFlags.Option2 | MyFlags.Option3);
// Returns: false

HasOnlyFlag

Determines whether exactly one specific flag is set.

var flags = MyFlags.Option1;

bool hasOnly = flags.HasOnlyFlag(MyFlags.Option1);
// Returns: true

bool hasOnly2 = flags.HasOnlyFlag(MyFlags.Option2);
// Returns: false

HasNoFlags

Determines whether no flags are set (value is zero).

var flags = MyFlags.None;
bool hasNone = flags.HasNoFlags();  // Returns: true

flags = MyFlags.Option1;
bool hasNone2 = flags.HasNoFlags();  // Returns: false

Examples

Game States

[Flags]
public enum GameState
{
    None = 0,
    Playing = 1 << 0,
    Paused = 1 << 1,
    Dialog = 1 << 2,
    Menu = 1 << 3,
    Loading = 1 << 4
}

private GameState _state;

public void EnterDialog()
{
    // While in dialog, game is paused
    _state = _state.SetFlag(GameState.Dialog);
    _state = _state.SetFlag(GameState.Paused);
}

public void ExitDialog()
{
    // Exit dialog, resume game
    _state = _state.ClearFlag(GameState.Dialog);
    _state = _state.ClearFlag(GameState.Paused);
}

public bool IsInGame()
{
    return _state.HasAnyFlag(GameState.Playing | GameState.Paused | GameState.Dialog);
}

Character Stats

[Flags]
public enum CharacterEffects
{
    None = 0,
    Poisoned = 1 << 0,
    Burning = 1 << 1,
    Frozen = 1 << 2,
    Slowed = 1 << 3,
    Hasted = 1 << 4,
    Shielded = 1 << 5
}

private CharacterEffects _effects;

public void ApplyEffect(CharacterEffects effect)
{
    _effects = _effects.SetFlag(effect);
}

public void RemoveEffect(CharacterEffects effect)
{
    _effects = _effects.ClearFlag(effect);
}

public void ToggleEffect(CharacterEffects effect)
{
    _effects = _effects.ToggleFlag(effect);
}

public bool HasEffect(CharacterEffects effect)
{
    return _effects.HasAllFlags(effect);
}

public bool HasAnyEffect()
{
    return !_effects.HasNoFlags();
}

public bool IsOnlySlowed()
{
    return _effects.HasOnlyFlag(CharacterEffects.Slowed);
}

Input Binding Modifiers

[Flags]
public enum KeyModifiers
{
    None = 0,
    Shift = 1 << 0,
    Control = 1 << 1,
    Alt = 1 << 2,
    Super = 1 << 3
}

public bool IsKeyDown(KeyboardKey key, KeyModifiers requiredModifiers)
{
    var currentModifiers = GetCurrentModifiers();
    
    // Check if all required modifiers are pressed
    if (!currentModifiers.HasAllFlags(requiredModifiers))
        return false;
    
    // Check if any extra modifiers are pressed (if we want exact match)
    // if (!currentModifiers.HasOnlyFlag(requiredModifiers))
    //     return false;
    
    return SFKeyboard.IsKeyPressed(key);
}

Collision Layers

[Flags]
public enum CollisionLayer
{
    None = 0,
    Player = 1 << 0,
    Enemy = 1 << 1,
    Projectile = 1 << 2,
    Terrain = 1 << 3,
    Pickup = 1 << 4,
    Trigger = 1 << 5
}

public bool CanCollide(CollisionLayer layerA, CollisionLayer layerB)
{
    // Check if the two collision layers should interact
    var playerCollidesWith = CollisionLayer.Enemy | CollisionLayer.Pickup | CollisionLayer.Trigger;
    var enemyCollidesWith = CollisionLayer.Player | CollisionLayer.Projectile | CollisionLayer.Terrain;
    
    if (layerA == CollisionLayer.Player)
        return playerCollidesWith.HasAnyFlag(layerB);
    
    if (layerA == CollisionLayer.Enemy)
        return enemyCollidesWith.HasAnyFlag(layerB);
    
    return true;
}

Summary

Method Description
SetFlag Adds a flag to an enum value
ClearFlag Removes a flag from an enum value
ToggleFlag Toggles a flag on an enum value
HasAllFlags Checks if all specified flags are set
HasAnyFlag Checks if any specified flag is set
HasOnlyFlag Checks if exactly one flag is set
HasNoFlags Checks if no flags are set

Back to Home

Clone this wiki locally