2015-06-01 22:15:17 +03:00
|
|
|
|
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
|
|
|
|
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
2015-05-14 22:35:07 +03:00
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PascalABCCompiler.Collections
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Расширяемая коллекция. Элементы из нее нельзя удалять.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class extendable_collection<T> : System.Collections.Generic.IEnumerable<T>
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Enumerator для списка элементов.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class enumerator : System.Collections.Generic.IEnumerator<T>
|
|
|
|
|
|
{
|
|
|
|
|
|
private int i = -1;
|
|
|
|
|
|
|
|
|
|
|
|
private readonly extendable_collection<T> enumerable_list;
|
|
|
|
|
|
|
|
|
|
|
|
public enumerator(extendable_collection<T> 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<T> _elements =
|
|
|
|
|
|
new System.Collections.Generic.List<T>();
|
|
|
|
|
|
protected T[] _elements_as_arr = null;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Добавить элемент к списку.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// <param name="expression">Добавляемый элемент.</param>
|
2015-05-14 22:35:07 +03:00
|
|
|
|
public void AddElement(T element)
|
|
|
|
|
|
{
|
|
|
|
|
|
_elements.Add(element);
|
|
|
|
|
|
_elements_as_arr = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Добавляет список элементов к списку.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// <param name="elements">Список добавляемых элементов.</param>
|
2015-05-14 22:35:07 +03:00
|
|
|
|
public void AddRange(extendable_collection<T> 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<T> elements)
|
|
|
|
|
|
{
|
|
|
|
|
|
_elements.InsertRange(0, elements._elements);
|
|
|
|
|
|
_elements_as_arr = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void AddRangeFirst(T[] elements)
|
|
|
|
|
|
{
|
|
|
|
|
|
_elements.InsertRange(0, elements);
|
|
|
|
|
|
_elements_as_arr = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Возвращает массив элементов, хранящихся в коллкции.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// <returns>Массив элементов</returns>
|
2015-05-14 22:35:07 +03:00
|
|
|
|
public T[] ToArray()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_elements_as_arr == null)
|
|
|
|
|
|
_elements_as_arr = _elements.ToArray();
|
|
|
|
|
|
return _elements_as_arr;
|
|
|
|
|
|
//return _elements.ToArray();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Индексирует элементы коллекции.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// <param name="num">Номер элемента.</param>
|
|
|
|
|
|
/// <returns>Элемент с указанным номером.</returns>
|
2015-05-14 22:35:07 +03:00
|
|
|
|
public T this[int num]
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _elements[num];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-12-28 14:25:15 +03:00
|
|
|
|
/// Число элементов в коллекции.
|
2015-05-14 22:35:07 +03:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int Count
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _elements.Count;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public System.Collections.Generic.IEnumerator<T> GetEnumerator()
|
|
|
|
|
|
{
|
|
|
|
|
|
return new enumerator(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
|
|
|
|
|
{
|
|
|
|
|
|
return this.GetEnumerator();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class extended_collection<T> : extendable_collection<T>
|
|
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|