using ProjectCruiser.Drawnings; using ProjectCruiser.Exceptions; namespace ProjectCruiser.CollectionGenericObjects { /// /// Параметризованный набор объектов /// /// Параметр: ограничение - ссылочный тип public class MassiveGenericObjects : ICollectionGenericObjects where T : class { /// /// Массив объектов, которые храним /// private T?[] _collection; public int Count => _collection.Length; public int MaxCount { get { return _collection.Length; } set { if (value > 0) { if (_collection.Length > 0) { Array.Resize(ref _collection, value); } else { _collection = new T?[value]; } } } } public CollectionType GetCollectionType => CollectionType.Massive; /// /// Конструктор /// public MassiveGenericObjects() { _collection = Array.Empty(); } public T? Get(int position) { // TODO проверка позиции // TODO выбром позиций, если выход за границы массива // TODO выбром позиций, если объект пустой if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position); if (_collection[position] == null) throw new ObjectNotFoundException(position); return _collection[position]; } public int Insert(T obj, IEqualityComparer? comparer = null) { // TODO вставка в свободное место набора // TODO выброc позиций, если переполнение // TODO выброc позиций, если такой объект есть в коллекции for (int i = 0; i < Count; i++) { if (comparer.Equals((_collection[i] as DrawningCruiser), (obj as DrawningCruiser))) throw new ObjectAlreadyInCollectionException(i); } for (int i = 0; i < Count; i++) { if (_collection[i] == null) { _collection[i] = obj; return i; } } throw new CollectionOverflowException(Count); } public int Insert(T obj, int position, IEqualityComparer? comparer = null) { // TODO выброc позиций, если такой объект есть в коллекции // TODO проверка позиции // TODO выбром позиций, если выход за границы массива // TODO проверка, что элемент массива по этой позиции пустой, если нет, то // ищется свободное место после этой позиции и идет вставка туда // если нет после, ищем до // TODO выбром позиций, если переполнение // TODO вставка for (int i = 0; i < Count; i++) { if (comparer.Equals((_collection[i] as DrawningCruiser), (obj as DrawningCruiser))) throw new ObjectAlreadyInCollectionException(i); } if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position); if (_collection[position] != null) { bool pushed = false; for (int index = position + 1; index < Count; index++) { if (_collection[index] == null) { position = index; pushed = true; break; } } if (!pushed) { for (int index = position - 1; index >= 0; index--) { if (_collection[index] == null) { position = index; pushed = true; break; } } } if (!pushed) { throw new CollectionOverflowException(Count); } } _collection[position] = obj; return position; } public T Remove(int position) { // TODO проверка позиции // TODO удаление объекта из массива, присвоив элементу массива значение null // TODO выбром позиций, если выход за границы массива // TODO выбром позиций, если объект пустой if (position < 0 || position >= Count) throw new PositionOutOfCollectionException(position); if (_collection[position] == null) throw new ObjectNotFoundException(position); T? temp = _collection[position]; _collection[position] = null; return temp; } public IEnumerable GetItems() { for (int i = 0; i < _collection.Length; ++i) { yield return _collection[i]; } } public void CollectionSort(IComparer comparer) { Array.Sort(_collection, comparer); } } }