using System; using System.Collections; using System.Collections.Generic; namespace UniGLTF { public sealed class CacheEnum { public static T Parse(string name, bool ignoreCase = false) where T : struct, Enum { if(ignoreCase) { return CacheParse.ParseIgnoreCase(name); } else { return CacheParse.Parse(name); } } public static T TryParseOrDefault(string name, bool ignoreCase = false, T defaultValue=default(T)) where T : struct, Enum { try { if(ignoreCase) { return CacheParse.ParseIgnoreCase(name); } else { return CacheParse.Parse(name); } } catch { return defaultValue; } } public static T[] GetValues() where T : struct, Enum { return CacheValues.Values; } private static class CacheParse where T : struct, Enum { private static Dictionary _values = new Dictionary(); private static Dictionary _ignoreCaseValues = new Dictionary(StringComparer.OrdinalIgnoreCase); static CacheParse() { } public static T ParseIgnoreCase(string name) { if(_ignoreCaseValues.TryGetValue(name, out var value)) { return value; } else { T result; value = Enum.TryParse(name, true, out result) ? result : throw new ArgumentException(nameof(result)); _ignoreCaseValues.Add(name, value); return value; } } public static T Parse(string name) { if(_values.TryGetValue(name, out var value)) { return value; } else { T result; value = Enum.TryParse(name, false, out result) ? result : throw new ArgumentException(nameof(result)); _values.Add(name, value); return value; } } } private static class CacheValues where T : struct, Enum { public static readonly T[] Values; static CacheValues() { Values = Enum.GetValues(typeof(T)) as T[]; } } } }