pascalabcnet/TreeConverter/Collections/extandable_collection.cs

214 lines
5.6 KiB
C#
Raw Permalink Normal View History

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-05-14 22:35:07 +03:00
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public class extendable_collection<T> : System.Collections.Generic.IEnumerable<T>
{
/// <summary>
/// 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-05-14 22:35:07 +03:00
/// </summary>
/// <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-05-14 22:35:07 +03:00
/// </summary>
/// <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-05-14 22:35:07 +03:00
/// </summary>
/// <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-05-14 22:35:07 +03:00
/// </summary>
/// <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-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;
}
}
}