//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 loyalsoft. All rights reserved.
// Homepage: http://www.game7000.com/
// Feedback: http://www.game7000.com/
//------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace GameFramework
{
///
/// 游戏框架多值字典类。
///
/// 指定多值字典的主键类型。
/// 指定多值字典的值类型。
public sealed class GameFrameworkMultiDictionary : IEnumerable>>, IEnumerable
{
private readonly GameFrameworkLinkedList m_LinkedList;
private readonly Dictionary> m_Dictionary;
///
/// 初始化游戏框架多值字典类的新实例。
///
public GameFrameworkMultiDictionary()
{
m_LinkedList = new GameFrameworkLinkedList();
m_Dictionary = new Dictionary>();
}
///
/// 获取多值字典中实际包含的主键数量。
///
public int Count
{
get
{
return m_Dictionary.Count;
}
}
///
/// 获取多值字典中指定主键的范围。
///
/// 指定的主键。
/// 指定主键的范围。
public GameFrameworkLinkedListRange this[TKey key]
{
get
{
GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange);
m_Dictionary.TryGetValue(key, out range);
return range;
}
}
///
/// 清理多值字典。
///
public void Clear()
{
m_Dictionary.Clear();
m_LinkedList.Clear();
}
///
/// 检查多值字典中是否包含指定主键。
///
/// 要检查的主键。
/// 多值字典中是否包含指定主键。
public bool Contains(TKey key)
{
return m_Dictionary.ContainsKey(key);
}
///
/// 检查多值字典中是否包含指定值。
///
/// 要检查的主键。
/// 要检查的值。
/// 多值字典中是否包含指定值。
public bool Contains(TKey key, TValue value)
{
GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange);
if (m_Dictionary.TryGetValue(key, out range))
{
return range.Contains(value);
}
return false;
}
///
/// 尝试获取多值字典中指定主键的范围。
///
/// 指定的主键。
/// 指定主键的范围。
/// 是否获取成功。
public bool TryGetValue(TKey key, out GameFrameworkLinkedListRange range)
{
return m_Dictionary.TryGetValue(key, out range);
}
///
/// 向指定的主键增加指定的值。
///
/// 指定的主键。
/// 指定的值。
public void Add(TKey key, TValue value)
{
GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange);
if (m_Dictionary.TryGetValue(key, out range))
{
m_LinkedList.AddBefore(range.Terminal, value);
}
else
{
LinkedListNode first = m_LinkedList.AddLast(value);
LinkedListNode terminal = m_LinkedList.AddLast(default(TValue));
m_Dictionary.Add(key, new GameFrameworkLinkedListRange(first, terminal));
}
}
///
/// 从指定的主键中移除指定的值。
///
/// 指定的主键。
/// 指定的值。
/// 是否移除成功。
public bool Remove(TKey key, TValue value)
{
GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange);
if (m_Dictionary.TryGetValue(key, out range))
{
for (LinkedListNode current = range.First; current != null && current != range.Terminal; current = current.Next)
{
if (current.Value.Equals(value))
{
if (current == range.First)
{
LinkedListNode next = current.Next;
if (next == range.Terminal)
{
m_LinkedList.Remove(next);
m_Dictionary.Remove(key);
}
else
{
m_Dictionary[key] = new GameFrameworkLinkedListRange(next, range.Terminal);
}
}
m_LinkedList.Remove(current);
return true;
}
}
}
return false;
}
///
/// 从指定的主键中移除所有的值。
///
/// 指定的主键。
/// 是否移除成功。
public bool RemoveAll(TKey key)
{
GameFrameworkLinkedListRange range = default(GameFrameworkLinkedListRange);
if (m_Dictionary.TryGetValue(key, out range))
{
m_Dictionary.Remove(key);
LinkedListNode current = range.First;
while (current != null)
{
LinkedListNode next = current != range.Terminal ? current.Next : null;
m_LinkedList.Remove(current);
current = next;
}
return true;
}
return false;
}
///
/// 返回循环访问集合的枚举数。
///
/// 循环访问集合的枚举数。
public Enumerator GetEnumerator()
{
return new Enumerator(m_Dictionary);
}
///
/// 返回循环访问集合的枚举数。
///
/// 循环访问集合的枚举数。
IEnumerator>> IEnumerable>>.GetEnumerator()
{
return GetEnumerator();
}
///
/// 返回循环访问集合的枚举数。
///
/// 循环访问集合的枚举数。
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
///
/// 循环访问集合的枚举数。
///
[StructLayout(LayoutKind.Auto)]
public struct Enumerator : IEnumerator>>, IEnumerator
{
private Dictionary>.Enumerator m_Enumerator;
internal Enumerator(Dictionary> dictionary)
{
if (dictionary == null)
{
throw new GameFrameworkException("Dictionary is invalid.");
}
m_Enumerator = dictionary.GetEnumerator();
}
///
/// 获取当前结点。
///
public KeyValuePair> Current
{
get
{
return m_Enumerator.Current;
}
}
///
/// 获取当前的枚举数。
///
object IEnumerator.Current
{
get
{
return m_Enumerator.Current;
}
}
///
/// 清理枚举数。
///
public void Dispose()
{
m_Enumerator.Dispose();
}
///
/// 获取下一个结点。
///
/// 返回下一个结点。
public bool MoveNext()
{
return m_Enumerator.MoveNext();
}
///
/// 重置枚举数。
///
void IEnumerator.Reset()
{
((IEnumerator>>)m_Enumerator).Reset();
}
}
}
}