#pragma once #include #include #include namespace advss { template class MessageBuffer { public: bool Empty(); void Clear(); void AppendMessage(const T &); std::optional ConsumeMessage(); private: std::deque _buffer; std::mutex _mutex; }; template inline bool MessageBuffer::Empty() { std::lock_guard lock(_mutex); return _buffer.empty(); } template inline void MessageBuffer::Clear() { std::lock_guard lock(_mutex); _buffer.clear(); } template inline void MessageBuffer::AppendMessage(const T &message) { std::lock_guard lock(_mutex); _buffer.emplace_back(message); } template inline std::optional MessageBuffer::ConsumeMessage() { std::lock_guard lock(_mutex); if (_buffer.empty()) { return {}; } T message = _buffer.at(0); _buffer.pop_front(); return message; } } // namespace advss