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;
}
}
}
}