using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace AlicizaX
{
///
/// 游戏框架链表范围。
///
/// 指定链表范围的元素类型。
[StructLayout(LayoutKind.Auto)]
public readonly struct GameFrameworkLinkedListRange : IEnumerable, IEnumerable
{
private readonly LinkedListNode m_First;
private readonly LinkedListNode m_Terminal;
///
/// 初始化游戏框架链表范围的新实例。
///
/// 链表范围的开始结点。
/// 链表范围的终结标记结点。
public GameFrameworkLinkedListRange(LinkedListNode first, LinkedListNode terminal)
{
if (first == null || terminal == null || first == terminal)
{
throw new GameFrameworkException("Range is invalid.");
}
m_First = first;
m_Terminal = terminal;
}
///
/// 获取链表范围是否有效。
///
public bool IsValid
{
get
{
return m_First != null && m_Terminal != null && m_First != m_Terminal;
}
}
///
/// 获取链表范围的开始结点。
///
public LinkedListNode First
{
get
{
return m_First;
}
}
///
/// 获取链表范围的终结标记结点。
///
public LinkedListNode Terminal
{
get
{
return m_Terminal;
}
}
///
/// 获取链表范围的结点数量。
///
public int Count
{
get
{
if (!IsValid)
{
return 0;
}
int count = 0;
for (LinkedListNode current = m_First; current != null && current != m_Terminal; current = current.Next)
{
count++;
}
return count;
}
}
///
/// 检查是否包含指定值。
///
/// 要检查的值。
/// 是否包含指定值。
public bool Contains(T value)
{
for (LinkedListNode current = m_First; current != null && current != m_Terminal; current = current.Next)
{
if (current.Value.Equals(value))
{
return true;
}
}
return false;
}
///
/// 返回循环访问集合的枚举数。
///
/// 循环访问集合的枚举数。
public Enumerator GetEnumerator()
{
return new Enumerator(this);
}
///
/// 返回循环访问集合的枚举数。
///
/// 循环访问集合的枚举数。
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
///
/// 返回循环访问集合的枚举数。
///
/// 循环访问集合的枚举数。
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
///
/// 循环访问集合的枚举数。
///
[StructLayout(LayoutKind.Auto)]
public struct Enumerator : IEnumerator, IEnumerator
{
private readonly GameFrameworkLinkedListRange m_GameFrameworkLinkedListRange;
private LinkedListNode m_Current;
private T m_CurrentValue;
internal Enumerator(GameFrameworkLinkedListRange range)
{
if (!range.IsValid)
{
throw new GameFrameworkException("Range is invalid.");
}
m_GameFrameworkLinkedListRange = range;
m_Current = m_GameFrameworkLinkedListRange.m_First;
m_CurrentValue = default(T);
}
///
/// 获取当前结点。
///
public T Current
{
get
{
return m_CurrentValue;
}
}
///
/// 获取当前的枚举数。
///
object IEnumerator.Current
{
get
{
return m_CurrentValue;
}
}
///
/// 清理枚举数。
///
public void Dispose()
{
}
///
/// 获取下一个结点。
///
/// 返回下一个结点。
public bool MoveNext()
{
if (m_Current == null || m_Current == m_GameFrameworkLinkedListRange.m_Terminal)
{
return false;
}
m_CurrentValue = m_Current.Value;
m_Current = m_Current.Next;
return true;
}
///
/// 重置枚举数。
///
void IEnumerator.Reset()
{
m_Current = m_GameFrameworkLinkedListRange.m_First;
m_CurrentValue = default(T);
}
}
}
}