From ad9095167319fb076e064aafef8485401f4b0955 Mon Sep 17 00:00:00 2001
From: Garifullin-Farid <95081032+Garifullin-Farid@users.noreply.github.com>
Date: Sun, 17 Mar 2024 16:11:32 +0400
Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86?=
 =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ICollectionGenericObjects.cs              |  49 ++++++++
 .../MassiveGenericObjects.cs                  | 113 ++++++++++++++++++
 2 files changed, 162 insertions(+)
 create mode 100644 ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs
 create mode 100644 ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs

diff --git a/ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs
new file mode 100644
index 0000000..812597b
--- /dev/null
+++ b/ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs
@@ -0,0 +1,49 @@
+namespace ProjectTank.CollectionGenericObjects
+{
+    /// <summary>
+    /// Интерфейс описания действий для набора хранимых данных
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public interface ICollectionGenericObjects<T>
+        where T : class
+    {
+        /// <summary>
+        /// Количество объектов в коллекции
+        /// </summary>
+        int Count { get; }
+
+        /// <summary>
+        /// Установка максимального количества элементов
+        /// </summary>
+        int SetMaxCount { set; }
+
+        /// <summary>
+        /// Добавление объекта в коллекцию
+        /// </summary>
+        /// <param name="obj">Добавляемый объект</param>
+        /// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
+        int Insert(T obj);
+
+        /// <summary>
+        /// Добавление объекта в коллекцию на конкретную позицию
+        /// </summary>
+        /// <param name="obj">Добавляемый объект</param>
+        /// <param name="position">Позиция</param>
+        /// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
+        int Insert(T obj, int position);
+
+        /// <summary>
+        /// Удаление объекта из коллекции с конкретной позиции
+        /// </summary>
+        /// <param name="position">Позиция</param>
+        /// <returns>true - удаление прошло удачно, false - удаление не удалось</returns>
+        T? Remove(int position);
+
+        /// <summary>
+        /// Получение объекта по позиции
+        /// </summary>
+        /// <param name="position">Позиция</param>
+        /// <returns>Объект</returns>
+        T? Get(int position);
+    }
+}
diff --git a/ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs
new file mode 100644
index 0000000..4326cf4
--- /dev/null
+++ b/ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs
@@ -0,0 +1,113 @@
+using ProjectTank.CollectionGenericObjects;
+/// <summary>
+/// Параметризованный набор объектов
+/// </summary>
+/// <typeparam name="T">Параметр: ограничение - ссылочный тип</typeparam>
+public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
+    where T : class
+{
+    /// <summary>
+    /// Массив объектов, которые храним
+    /// </summary>
+    private T?[] _collection;
+
+    public int Count => _collection.Length;
+
+    public int SetMaxCount { set { if (value > 0) { _collection = new T?[value]; } } }
+
+    /// <summary>
+    /// Конструктор
+    /// </summary>
+    public MassiveGenericObjects()
+    {
+        _collection = Array.Empty<T?>();
+    }
+
+    public T? Get(int position)
+    {
+        if (position >= 0 && position < Count)
+        {
+            return _collection[position];
+        }
+
+        return null;
+    }
+
+    public int Insert(T obj)
+    {
+        // вставка в свободное место набора
+        for (int i = 0; i < Count; i++)
+        {
+            if (_collection[i] == null)
+            {
+                _collection[i] = obj;
+                return i;
+            }
+        }
+
+        return -1;
+    }
+
+    public int Insert(T obj, int position)
+    {
+        // проверка позиции
+        if (position < 0 || position >= Count)
+        {
+            return -1;
+        }
+
+        // проверка, что элемент массива по этой позиции пустой, если нет, то
+        //	ищется свободное место после этой позиции и идет вставка туда
+        // если нет после, ищем до
+        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)
+            {
+                return position;
+            }
+        }
+
+        // вставка
+        _collection[position] = obj;
+        return position;
+    }
+
+    public T? Remove(int position)
+    {
+        //  проверка позиции
+        if (position < 0 || position >= Count)
+        {
+            return null;
+        }
+
+        if (_collection[position] == null) return null;
+
+        T? temp = _collection[position];
+        _collection[position] = null;
+        return temp;
+    }
+}
\ No newline at end of file