// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; namespace PascalABCCompiler.Collections { /// /// Расширяемая коллекция. Элементы из нее нельзя удалять. /// /// [Serializable] public class extendable_collection : System.Collections.Generic.IEnumerable { /// /// Enumerator для списка элементов. /// public class enumerator : System.Collections.Generic.IEnumerator { private int i = -1; private readonly extendable_collection enumerable_list; public enumerator(extendable_collection expr_list) { enumerable_list = expr_list; } public T Current { get { return enumerable_list[i]; } } public void Dispose() { } object System.Collections.IEnumerator.Current { get { return this.Current; } } public bool MoveNext() { i++; if (i >= enumerable_list._elements.Count) { return false; } return true; } public void Reset() { i = -1; } } protected readonly System.Collections.Generic.List _elements = new System.Collections.Generic.List(); protected T[] _elements_as_arr = null; /// /// Добавить элемент к списку. /// /// Добавляемый элемент. public void AddElement(T element) { _elements.Add(element); _elements_as_arr = null; } public void RemoveElement(T element) { _elements.Remove(element); _elements_as_arr = null; } /// /// Добавляет список элементов к списку. /// /// Список добавляемых элементов. public void AddRange(extendable_collection elements) { _elements.AddRange(elements._elements); _elements_as_arr = null; } public void AddRange(T[] elements) { _elements.AddRange(elements); _elements_as_arr = null; } //ssyy public int IndexOf(T element) { return _elements.IndexOf(element); } //\ssyy public void AddElementFirst(T element) { _elements.Insert(0, element); _elements_as_arr = null; } public void AddRangeFirst(extendable_collection elements) { _elements.InsertRange(0, elements._elements); _elements_as_arr = null; } public void AddRangeFirst(T[] elements) { _elements.InsertRange(0, elements); _elements_as_arr = null; } /// /// Возвращает массив элементов, хранящихся в коллкции. /// /// Массив элементов public T[] ToArray() { if (_elements_as_arr == null) _elements_as_arr = _elements.ToArray(); return _elements_as_arr; //return _elements.ToArray(); } /// /// Индексирует элементы коллекции. /// /// Номер элемента. /// Элемент с указанным номером. public T this[int num] { get { return _elements[num]; } } /// /// Число элементов в коллекции. /// public int Count { get { return _elements.Count; } } public System.Collections.Generic.IEnumerator GetEnumerator() { return new enumerator(this); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } [Serializable] public class extended_collection : extendable_collection { public void remove(T element) { _elements.Remove(element); _elements_as_arr = null; } public void remove_at(int index) { _elements.RemoveAt(index); _elements_as_arr = null; } public bool Contains(T elem) { return _elements.Contains(elem); } public T this[int i] { get { return _elements[i]; } set { _elements[i] = value; _elements_as_arr = null; } } public void remove_range(int index,int count) { _elements.RemoveRange(index, count); _elements_as_arr = null; } public void Clear() { _elements.Clear(); _elements_as_arr = null; } } }