#region Copyright & License Information /* * Copyright (c) The OpenRA Developers and Contributors * 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.Concurrent; using System.Collections.Generic; namespace OpenRA.Primitives { public class ConcurrentCache : IReadOnlyDictionary { readonly ConcurrentDictionary cache; readonly Func loader; public ConcurrentCache(Func loader, IEqualityComparer c) { if (loader == null) throw new ArgumentNullException(nameof(loader)); this.loader = loader; cache = new ConcurrentDictionary(c); } public ConcurrentCache(Func loader) : this(loader, EqualityComparer.Default) { } public U this[T key] => cache.GetOrAdd(key, loader); public IEnumerable Keys => cache.Keys; public IEnumerable Values => cache.Values; 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 IEnumerator> GetEnumerator() { return cache.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } }