/
Xakka
/
CPP2
Обзор
Документация
Войти
/
Xakka
/
CPP2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/s21_queue.tpp
226 строк
6 KB
moshedur
master: release 1.0
04 янв 2025, 23:35
04 янв 2025, 23:35
1c45f0a
Код
Авторство
О чём код?
#include <cstdarg> #include "s21_queue.h" namespace s21 { /** * Конструктор по умолчанию, создает пустую очередь * @tparam value_type тип хранимых данных */ template <typename value_type> s21_queue<value_type>::s21_queue() : m_size(0), m_node(nullptr) {} /** * Конструктор на базе списке инициализации * @tparam value_type тип хранимых данных * @param items указатель на список инициализаторов */ template <typename value_type> s21_queue<value_type>::s21_queue(std::initializer_list<value_type> const &items) : m_size(0), m_node(nullptr) { for (auto item : items) { push(item); } } /** * Конструктор копирования * @tparam value_type тип хранимых данных * @param q указатель на источник данных */ template <typename value_type> s21_queue<value_type>::s21_queue(const s21_queue &q) : m_size(0), m_node(nullptr) { Node *tmp = q.m_node; while (tmp) { push(tmp->value); tmp = tmp->next; } } /** * Конструктор переноса * @tparam value_type тип хранимых данных * @param q указатель на источник данных */ template <typename value_type> s21_queue<value_type>::s21_queue(s21_queue &&q) noexcept { m_node = q.m_node; m_size = q.m_size; q.m_node = nullptr; q.m_size = 0; } /** * Деструктор * @tparam value_type тип хранимых данных */ template <typename value_type> s21_queue<value_type>::~s21_queue() { Node *tmp = m_node; while (tmp) { Node *tmp_next = tmp->next; delete tmp; tmp = tmp_next; } m_node = nullptr; m_size = 0; } /** * Оператор присвоения переносом * @tparam value_type тип хранимых данных * @param q указатель на источник данных * @return контейнер */ template <typename value_type> s21_queue<value_type> &s21_queue<value_type>::operator=( s21_queue &&q) noexcept { if (this == &q) { return *this; } m_node = q.m_node; m_size = q.m_size; q.m_node = nullptr; q.m_size = 0; return *this; } /** * Оператор присвоения копированием * @tparam value_type тип хранимых данных * @param q указатель на источник данных * @return контейнер */ template <typename value_type> s21_queue<value_type> &s21_queue<value_type>::operator=(const s21_queue &q) { if (this == &q) { return *this; } while (m_node) { pop(); } Node *tmp = q.m_node; while (tmp) { push(tmp->value); tmp = tmp->next; } return *this; } /** * Доступ к первому элементу * @tparam value_type тип хранимых данных * @return */ template <typename value_type> typename s21_queue<value_type>::const_reference s21_queue<value_type>::front() { return m_node->value; } /** * Доступ к последнему элементу * @tparam value_type тип хранимых данных * @return указатель на элемент */ template <typename value_type> typename s21_queue<value_type>::const_reference s21_queue<value_type>::back() { if (!m_node) { throw std::out_of_range("Node does not exist"); } return m_node->tail->value; } /** * Проверяет, пуст ли контейнер * @tparam value_type тип хранимых данных * @return true, если контейнер пуст - иначе false */ template <typename value_type> bool s21_queue<value_type>::empty() { return m_size ? false : true; } /** * Возвращает количество элементов * @tparam value_type тип хранимых данных * @return количество элементов */ template <typename value_type> typename s21_queue<value_type>::size_type s21_queue<value_type>::size() { return m_size; } /** * Вставляет элемент в конец * @tparam value_type тип хранимых данных * @param value хранимые данные */ template <typename value_type> void s21_queue<value_type>::push( typename s21_queue<value_type>::const_reference value) { Node *tmp = new Node(); if (m_node) { tmp->prev = m_node->tail; m_node->tail->next = tmp; m_node->tail = tmp; } else { m_node = tmp; m_node->tail = tmp; } tmp->value = value; m_size++; } /** * Удаляет первый элемент * @tparam value_type тип хранимых данных */ template <typename value_type> void s21_queue<value_type>::pop() { if (m_node) { Node *tmp = m_node->next; if (tmp) { tmp->tail = m_node->tail; } delete m_node; m_node = tmp; m_size--; } else { throw std::out_of_range("Node does not exist"); } } /** * Меняет местами содержимое * @tparam value_type тип хранимых данных * @param other указатель на источник данных */ template <typename value_type> void s21_queue<value_type>::swap(s21_queue<value_type> &other) { Node *n_tmp = m_node; size_type s_tmp = m_size; m_node = other.m_node; m_size = other.m_size; other.m_node = n_tmp; other.m_size = s_tmp; } /** * Добавляет новые элементы в конец очереди * @tparam value_type тип хранимых данных * @param args * @param ... */ template <typename value_type> template <typename... Args> void s21_queue<value_type>::insert_many_back(Args &&...args) { for (auto data : {args...}) { push(data); } } } // namespace s21 template class s21::s21_queue<int>;