using System; using System.Runtime.CompilerServices; namespace Avalonia { /// /// Provides extension methods for enums. /// public static class EnumExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] [Obsolete("This method is obsolete. Use HasAllFlags instead.")] public static bool HasFlagCustom(this T value, T flag) where T : unmanaged, Enum => value.HasAllFlags(flag); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe bool HasAllFlags(this T value, T flags) where T : unmanaged, Enum { if (sizeof(T) == 1) { var byteValue = Unsafe.As(ref value); var byteFlags = Unsafe.As(ref flags); return (byteValue & byteFlags) == byteFlags; } else if (sizeof(T) == 2) { var shortValue = Unsafe.As(ref value); var shortFlags = Unsafe.As(ref flags); return (shortValue & shortFlags) == shortFlags; } else if (sizeof(T) == 4) { var intValue = Unsafe.As(ref value); var intFlags = Unsafe.As(ref flags); return (intValue & intFlags) == intFlags; } else if (sizeof(T) == 8) { var longValue = Unsafe.As(ref value); var longFlags = Unsafe.As(ref flags); return (longValue & longFlags) == longFlags; } else throw new NotSupportedException("Enum with size of " + Unsafe.SizeOf() + " are not supported"); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe bool HasAnyFlag(this T value, T flags) where T : unmanaged, Enum { if (sizeof(T) == 1) { var byteValue = Unsafe.As(ref value); var byteFlags = Unsafe.As(ref flags); return (byteValue & byteFlags) != 0; } else if (sizeof(T) == 2) { var shortValue = Unsafe.As(ref value); var shortFlags = Unsafe.As(ref flags); return (shortValue & shortFlags) != 0; } else if (sizeof(T) == 4) { var intValue = Unsafe.As(ref value); var intFlags = Unsafe.As(ref flags); return (intValue & intFlags) != 0; } else if (sizeof(T) == 8) { var longValue = Unsafe.As(ref value); var longFlags = Unsafe.As(ref flags); return (longValue & longFlags) != 0; } else throw new NotSupportedException("Enum with size of " + Unsafe.SizeOf() + " are not supported"); } } }