Skip to content

Commit

Permalink
Merge pull request #2200 from teo-tsirpanis/patch-1
Browse files Browse the repository at this point in the history
Refactor `EnumUtils` and make it AOT-friendly.
  • Loading branch information
JimBobSquarePants authored Aug 10, 2022
2 parents d33b364 + 1cc618a commit 4a0a5cf
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions src/ImageSharp/Common/Helpers/EnumUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,14 @@ internal static class EnumUtils
/// <param name="defaultValue">The default value to return.</param>
/// <returns>The <typeparamref name="TEnum"/>.</returns>
public static TEnum Parse<TEnum>(int value, TEnum defaultValue)
where TEnum : Enum
where TEnum : struct, Enum
{
foreach (TEnum enumValue in Enum.GetValues(typeof(TEnum)))
DebugGuard.IsTrue(Unsafe.SizeOf<TEnum>() == sizeof(int), "Only int-sized enums are supported.");

TEnum valueEnum = Unsafe.As<int, TEnum>(ref value);
if (Enum.IsDefined(valueEnum))
{
TEnum current = enumValue;
if (value == Unsafe.As<TEnum, int>(ref current))
{
return enumValue;
}
return valueEnum;
}

return defaultValue;
Expand All @@ -41,8 +40,10 @@ public static TEnum Parse<TEnum>(int value, TEnum defaultValue)
/// <param name="flag">The flag.</param>
/// <returns>The <see cref="bool"/>.</returns>
public static bool HasFlag<TEnum>(TEnum value, TEnum flag)
where TEnum : Enum
where TEnum : struct, Enum
{
DebugGuard.IsTrue(Unsafe.SizeOf<TEnum>() == sizeof(int), "Only int-sized enums are supported.");

uint flagValue = Unsafe.As<TEnum, uint>(ref flag);
return (Unsafe.As<TEnum, uint>(ref value) & flagValue) == flagValue;
}
Expand Down

0 comments on commit 4a0a5cf

Please sign in to comment.