#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System; using System.Collections.Generic; namespace OpenRA.Primitives { public class Cache : IReadOnlyDictionary { readonly Dictionary cache; readonly Func loader; public Cache(Func loader, IEqualityComparer c) { if (loader == null) throw new ArgumentNullException(nameof(loader)); this.loader = loader; cache = new Dictionary(c); } public Cache(Func loader) : this(loader, EqualityComparer.Default) { } public U this[T key] => cache.GetOrAdd(key, loader); public bool ContainsKey(T key) { return cache.ContainsKey(key); } public bool TryGetValue(T key, out U value) { return cache.TryGetValue(key, out value); } public int Count => cache.Count; public void Clear() { cache.Clear(); } public ICollection Keys => cache.Keys; public ICollection Values => cache.Values; IEnumerable IReadOnlyDictionary.Keys => cache.Keys; IEnumerable IReadOnlyDictionary.Values => cache.Values; public IEnumerator> GetEnumerator() { return cache.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } }