From 2b8f2a125abec7d85999c49a18a010d359cfd01c Mon Sep 17 00:00:00 2001 From: Drew Tingen Date: Wed, 14 Jun 2023 05:46:00 -0400 Subject: [PATCH] feat[EnumUtils]: add GetinverseFlags method --- ICD.Common.Utils.Tests/EnumUtilsTest.cs | 10 ++++++++++ ICD.Common.Utils/EnumUtils.cs | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ICD.Common.Utils.Tests/EnumUtilsTest.cs b/ICD.Common.Utils.Tests/EnumUtilsTest.cs index fa60630..ba998d9 100644 --- a/ICD.Common.Utils.Tests/EnumUtilsTest.cs +++ b/ICD.Common.Utils.Tests/EnumUtilsTest.cs @@ -186,6 +186,16 @@ namespace ICD.Common.Utils.Tests value); } + [TestCase(eTestFlagsEnum.A, eTestFlagsEnum.B | eTestFlagsEnum.C | eTestFlagsEnum.D)] + [TestCase(eTestFlagsEnum.BandC, eTestFlagsEnum.A | eTestFlagsEnum.D)] + [TestCase(eTestFlagsEnum.A | eTestFlagsEnum.B | eTestFlagsEnum.C | eTestFlagsEnum.D, eTestFlagsEnum.None)] + [TestCase(eTestFlagsEnum.None, eTestFlagsEnum.A | eTestFlagsEnum.B | eTestFlagsEnum.C | eTestFlagsEnum.D)] + [TestCase(eTestFlagsEnum.D, eTestFlagsEnum.A | eTestFlagsEnum.BandC)] + public void GetInverseFlagsTest(eTestFlagsEnum expected, eTestFlagsEnum value) + { + Assert.AreEqual(expected, EnumUtils.GetInverseFlags(value)); + } + [Test] public void HasFlagGenericTest() { diff --git a/ICD.Common.Utils/EnumUtils.cs b/ICD.Common.Utils/EnumUtils.cs index 1f16c0c..5ff5dde 100644 --- a/ICD.Common.Utils/EnumUtils.cs +++ b/ICD.Common.Utils/EnumUtils.cs @@ -448,7 +448,20 @@ namespace ICD.Common.Utils if (type == null) throw new ArgumentNullException("type"); - return GetValuesUncached(type).Aggregate(0, (current, value) => current | (int)value); + return GetValues(type).Aggregate(0, (current, value) => current | (int)value); + } + + /// + /// Gets an enum value of the given type with the inverse of the flags set + /// + /// + /// + /// + public static T GetInverseFlags(T value) + where T : struct, IConvertible + { + int output = GetFlagsAllValue(typeof(T)) & ~(int)(object)value; + return (T)Enum.ToObject(typeof(T), output); } ///