using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; namespace BizHawk.Common { /// /// A dictionary that creates new values on the fly as necessary so that any key you need will be defined. /// /// dictionary keys /// dictionary values [Serializable] public class WorkingDictionary : Dictionary where V : new() { public new V this[K key] { get { V temp; if (!TryGetValue(key, out temp)) { temp = this[key] = new V(); } return temp; } set { base[key] = value; } } public WorkingDictionary() { } protected WorkingDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } } /// /// A dictionary that contains a name parameter, which is required /// [Serializable] public class NamedDictionary : Dictionary { public NamedDictionary(string name) { Name = name; } public string Name { get; private set; } protected NamedDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } } /// /// a Dictionary-of-lists with key K and values List<V> /// [Serializable] public class Bag : BagBase>, List> { } /// /// a Dictionary-of-lists with key K and values List<V> /// [Serializable] public class SortedBag : BagBase>, List> { } /// /// base class for Bag and SortedBag /// /// dictionary keys /// list values /// dictionary type /// list type [Serializable] public class BagBase : IEnumerable where D : IDictionary, new() where L : IList, IEnumerable, new() { readonly D dictionary = new D(); public void Add(K key, V val) { this[key].Add(val); } public bool ContainsKey(K key) { return dictionary.ContainsKey(key); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator GetEnumerator() { return dictionary.Values.SelectMany(lv => lv).GetEnumerator(); } public IEnumerable KeyValuePairEnumerator { get { return dictionary; } } /// /// Gets the list of keys contained herein /// public IList Keys { get { return new List(dictionary.Keys); } } public L this[K key] { get { L slot; if (!dictionary.TryGetValue(key, out slot)) { dictionary[key] = slot = new L(); } return slot; } set { dictionary[key] = value; } } } }