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