Rasagar/Library/PackageCache/com.unity.test-framework/UnityEditor.TestRunner/GUI/Controls/FlagEnumUtility.cs
2024-08-26 23:07:20 +03:00

75 lines
2.8 KiB
C#

using System;
using UnityEngine;
namespace UnityEditor.TestTools.TestRunner.GUI.Controls
{
/// <summary>
/// Provides methods for dealing with common enumerator operations.
/// </summary>
internal static class FlagEnumUtility
{
/// <summary>
/// Checks for the presence of a flag in a flag enum value.
/// </summary>
/// <param name="value">The value to check for the presence of the flag.</param>
/// <param name="flag">The flag whose presence is to be checked.</param>
/// <typeparam name="T">The flag enum type.</typeparam>
/// <returns></returns>
internal static bool HasFlag<T>(T value, T flag) where T : Enum
{
ValidateUnderlyingType<T>();
var intValue = (int)(object)value;
var intFlag = (int)(object)flag;
return (intValue & intFlag) == intFlag;
}
/// <summary>
/// Sets a flag in a flag enum value.
/// </summary>
/// <param name="value">The value where the flag should be set.</param>
/// <param name="flag">The flag to be set.</param>
/// <typeparam name="T">The flag enum type.</typeparam>
/// <returns>The input value with the flag set.</returns>
internal static T SetFlag<T>(T value, T flag) where T : Enum
{
ValidateUnderlyingType<T>();
var intValue = (int)(object)value;
var intFlag = (int)(object)flag;
var result = intValue | intFlag;
return (T)Enum.ToObject(typeof(T), result);
}
/// <summary>
/// Removes a flag in a flag enum value.
/// </summary>
/// <param name="value">The value where the flag should be removed.</param>
/// <param name="flag">The flag to be removed.</param>
/// <typeparam name="T">The flag enum type.</typeparam>
/// <returns>The input value with the flag removed.</returns>
internal static T RemoveFlag<T>(T value, T flag) where T : Enum
{
ValidateUnderlyingType<T>();
var intValue = (int)(object)value;
var intFlag = (int)(object)flag;
var result = intValue & ~intFlag;
return (T)Enum.ToObject(typeof(T), result);
}
/// <summary>
/// Validates that the underlying type of an enum is integer.
/// </summary>
/// <typeparam name="T">The enum type.</typeparam>
/// <exception cref="ArgumentException">Thrown if the underlying type of the enum type parameter is not integer.</exception>
private static void ValidateUnderlyingType<T>() where T : Enum
{
if (Enum.GetUnderlyingType(typeof(T)) != typeof(int))
{
throw new ArgumentException("Argument underlying type must be integer.");
}
}
}
}