#pragma once #include "drape_frontend/message.hpp" #include "drape/pointers.hpp" #include "base/condition.hpp" #include #include #include #include namespace df { //#define DEBUG_MESSAGE_QUEUE class MessageQueue { public: MessageQueue(); ~MessageQueue(); /// if queue is empty then return NULL drape_ptr PopMessage(bool waitForMessage); void PushMessage(drape_ptr && message, MessagePriority priority); void CancelWait(); void ClearQuery(); using TFilterMessageFn = std::function)>; void FilterMessages(TFilterMessageFn needFilterMessageFn); #ifdef DEBUG_MESSAGE_QUEUE bool IsEmpty() const; size_t GetSize() const; #endif private: void CancelWaitImpl(); mutable std::mutex m_mutex; std::condition_variable m_condition; bool m_isWaiting; using TMessageNode = std::pair, MessagePriority>; std::deque m_messages; std::deque> m_lowPriorityMessages; }; } // namespace df