mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-02-16 13:15:07 +00:00
feat: Add enum extension method for cycling to next enum value
This commit is contained in:
@@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Added
|
### Added
|
||||||
|
- Added enum extension method for cycling to the next enum value
|
||||||
- Added GetLocalTimeZoneName method to IcdEnvironment
|
- Added GetLocalTimeZoneName method to IcdEnvironment
|
||||||
- Added MatchAny method to RegexUtils
|
- Added MatchAny method to RegexUtils
|
||||||
- Added OnSystemDeviceAddedRemoved and associated raise methods to IcdEnvironment for NETSTANDARD
|
- Added OnSystemDeviceAddedRemoved and associated raise methods to IcdEnvironment for NETSTANDARD
|
||||||
|
|||||||
@@ -32,5 +32,17 @@ namespace ICD.Common.Utils.Tests.Extensions
|
|||||||
{
|
{
|
||||||
Assert.AreEqual(expected, value.HasFlags(flags));
|
Assert.AreEqual(expected, value.HasFlags(flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase(eTestEnum.A, eTestEnum.B)]
|
||||||
|
[TestCase(eTestEnum.B, eTestEnum.C)]
|
||||||
|
[TestCase(eTestEnum.C, eTestEnum.A)]
|
||||||
|
[TestCase(eTestEnum.A | eTestEnum.B, null)]
|
||||||
|
public void CycleNextTest(eTestEnum value, eTestEnum? expected)
|
||||||
|
{
|
||||||
|
if (EnumUtils.HasMultipleFlags(value))
|
||||||
|
Assert.Catch(typeof(InvalidOperationException), () => value.CycleNext());
|
||||||
|
else
|
||||||
|
Assert.AreEqual(expected, value.CycleNext());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using ICD.Common.Properties;
|
using ICD.Common.Properties;
|
||||||
|
|
||||||
namespace ICD.Common.Utils.Extensions
|
namespace ICD.Common.Utils.Extensions
|
||||||
@@ -83,5 +85,25 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
{
|
{
|
||||||
return EnumUtils.ToStringUndefined(extends);
|
return EnumUtils.ToStringUndefined(extends);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the next defined enum value for the enum type.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="extends"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static T CycleNext<T>(this T extends)
|
||||||
|
where T : struct, IConvertible
|
||||||
|
{
|
||||||
|
if (EnumUtils.IsFlagsEnum(typeof(T)) && !EnumUtils.HasSingleFlag(extends))
|
||||||
|
throw new InvalidOperationException(string.Format("Cannot cycle enum with multiple flags - {0}", extends));
|
||||||
|
|
||||||
|
IEnumerable<T> values = EnumUtils.GetValues<T>();
|
||||||
|
IList<T> list = values as IList<T> ?? values.ToArray();
|
||||||
|
|
||||||
|
int index = list.BinarySearch(extends);
|
||||||
|
|
||||||
|
return index == list.Count - 1 ? list[0] : list[index + 1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -349,6 +349,22 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
|
|
||||||
#region Binary Search
|
#region Binary Search
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the index of the item in the list.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="extends"></param>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[PublicAPI]
|
||||||
|
public static int BinarySearch<T>([NotNull] this IList<T> extends, T item)
|
||||||
|
{
|
||||||
|
if (extends == null)
|
||||||
|
throw new ArgumentNullException("extends");
|
||||||
|
|
||||||
|
return extends.BinarySearch(item, Comparer<T>.Default);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the index of the item in the list.
|
/// Returns the index of the item in the list.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user