using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Catamaran { /// /// Параметризованный набор объектов /// /// internal class SetBoatsGeneric where T : class { /// /// Массив объектов, которые храним /// private readonly List _places; /// /// Количество объектов в массиве /// public int Count => _places.Count; private readonly int _maxCount; /// /// Конструктор /// /// public SetBoatsGeneric(int count) { _maxCount = count; _places = new List(); } /// /// Добавление объекта в набор /// /// Добавляемая лодка /// public int Insert(T boat) { for (int i = 0; i < _maxCount; i++) { if (i == Count) { _places.Insert(i, boat); return i; } } throw new StorageOverflowException(_maxCount); } /// /// Добавление объекта в набор на конкретную позицию /// /// Добавляемая лодка /// Позиция /// public int Insert(T boat, int position) { // TODO проверка позиции if (position < 0 || position >= _maxCount) { return -1 ; } // TODO проверка, что элемент массива по этой позиции пустой,если нет, то // проверка, что после вставляемого элемента в массиве есть пустой элемент // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента if (position == Count) { _places.Insert(position, boat); return position; } else { for (int i = position + 1; i < _maxCount; i++) { if (i == Count) { for (int j = i - 1; j >= position; j--) { _places[j + 1] = _places[j]; } _places.Insert(position, boat); return position; } } throw new StorageOverflowException(_maxCount); } // TODO вставка по позиции } /// /// Удаление объекта из набора с конкретной позиции /// /// /// public T Remove(int position) { // TODO проверка позиции if (position < 0 || position >= Count) throw new BoatNotFoundException(); // TODO удаление объекта из массива, присовив элементу массива значение null var result = _places[position]; _places.RemoveAt(position); return result; } /// /// Получение объекта из набора по позиции /// /// /// public T this[int position] { // TODO проверка позиции get { if (position >= 0 && position < _maxCount && position < Count) { return _places[position]; } else { return null; } } set { if (position > 0 || position < Count) { Insert(value, position); } } } /// /// Проход по набору до первого пустого /// /// public IEnumerable GetBoats() { foreach (var boat in _places) { if (boat != null) { yield return boat; } else { yield break; } } } } }