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