#pragma once #include #include #include #include #include "log_message.hpp" namespace app { /** * @brief Потокобезопасная очередь сообщений. * * Используется для передачи сообщений от потока, * принимающего ввод пользователя, к потоку, * выполняющему запись в журнал. */ class MessageQueue { public: /** * @brief Добавляет сообщение в очередь. * * Метод является потокобезопасным. * * После остановки очереди новые сообщения не принимаются. * * @param message Сообщение для передачи. */ void push(LogMessage message); /** * @brief Извлекает сообщение из очереди. * * Если очередь пуста, метод блокирует вызывающий поток * до появления нового сообщения или до остановки очереди. * * После остановки очереди и обработки всех оставшихся сообщений * возвращается std::nullopt. * * Метод является потокобезопасным. * * @return Следующее сообщение или std::nullopt, если очередь остановлена. */ [[nodiscard]] std::optional pop(); /** * @brief Останавливает очередь. * * Пробуждает все ожидающие потоки. После вызова stop() * новые сообщения не принимаются. * * Метод является потокобезопасным. */ void stop(); /** * @brief Проверяет, пуста ли очередь. * * Метод является потокобезопасным. * * @return true, если очередь не содержит сообщений. * @return false, если очередь содержит хотя бы одно сообщение. */ [[nodiscard]] bool empty() const; private: /** * @brief Очередь сообщений. */ std::queue queue_; /** * @brief Признак остановки очереди. */ bool stopped_{false}; /** * @brief Мьютекс для синхронизации доступа к очереди. */ mutable std::mutex mutex_; /** * @brief Условная переменная для ожидания новых сообщений. */ std::condition_variable conditionVariable_; }; } // namespace app