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;
}
}
}
}