using System; using System.Collections.Generic; using Microsoft.Xna.Framework.Input; namespace MLEM.Misc { /// /// A helper class that allows easier usage of values. /// [Obsolete("EnumHelper has been moved into the DynamicEnums library: https://www.nuget.org/packages/DynamicEnums")] public static class EnumHelper { /// /// All values of the enum. /// [Obsolete("This field has been moved to InputHandler.AllButtons")] public static readonly Buttons[] Buttons = EnumHelper.GetValues(); /// /// All values of the enum. /// [Obsolete("This field has been moved to InputHandler.AllKeys")] public static readonly Keys[] Keys = EnumHelper.GetValues(); /// /// Returns an array containing all of the values of the given enum type. /// Note that this method is a version-independent equivalent of .NET 5's Enum.GetValues<TEnum>. /// /// The type whose enum to get /// An enumerable of the values of the enum, in declaration order. public static T[] GetValues() where T : struct, Enum { #if NET6_0_OR_GREATER return Enum.GetValues(); #else return (T[]) Enum.GetValues(typeof(T)); #endif } /// /// Returns all of the defined values from the given enum type which are contained in . /// Note that, if combined flags are defined in , and contains them, they will also be returned. /// /// The combined flags whose individual flags to return. /// Whether the enum value 0 should also be returned, if contains one. /// The type of enum. /// All of the flags that make up . public static IEnumerable GetFlags(T combinedFlag, bool includeZero = true) where T : struct, Enum { foreach (var flag in EnumHelper.GetValues()) { if (combinedFlag.HasFlag(flag) && (includeZero || Convert.ToInt64(flag) != 0)) yield return flag; } } /// /// Returns all of the defined unique flags from the given enum type which are contained in . /// Any combined flags (flags that aren't powers of two) which are defined in will not be returned. /// /// The combined flags whose individual flags to return. /// The type of enum. /// All of the unique flags that make up . public static IEnumerable GetUniqueFlags(T combinedFlag) where T : struct, Enum { var uniqueFlag = 1; foreach (var flag in EnumHelper.GetValues()) { var flagValue = Convert.ToInt64(flag); // GetValues is always ordered by binary value, so we can be sure that the next flag is bigger than the last while (uniqueFlag < flagValue) uniqueFlag <<= 1; if (flagValue == uniqueFlag && combinedFlag.HasFlag(flag)) yield return flag; } } } }