using System; using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; using Dalamud.Utility; namespace KamiToolKit.Extensions; internal static class EnumExtensions { extension(Enum enumValue) { public string Description => enumValue.GetDescription(); private string GetDescription() { var attribute = enumValue.GetAttribute(); return attribute?.Description ?? enumValue.ToString(); } } extension(ref T flagValue) where T : unmanaged, Enum { public void SetFlags(params T[] flags) { foreach (var flag in flags) { flagValue.SetFlag(flag, true); } } public void ClearFlags(params T[] flags) { foreach (var flag in flags) { flagValue.SetFlag(flag, false); } } private unsafe void SetFlag(T flag, bool enable) { switch (sizeof(T)) { case 1: flagValue.SetFlag(flag, enable); break; case 2: flagValue.SetFlag(flag, enable); break; case 4: flagValue.SetFlag(flag, enable); break; case 8: flagValue.SetFlag(flag, enable); break; default: throw new NotSupportedException("Unsupported enum size"); } } private void SetFlag(T flag, bool enable) where TUnderlying : unmanaged, IBinaryInteger { ref var value = ref Unsafe.As(ref flagValue); var mask = Unsafe.As(ref flag); if (enable) value |= mask; else value &= ~mask; } } }