diff --git a/Extra2D/src/event/event_queue.cpp b/Extra2D/src/event/event_queue.cpp index 2f7850d..8883fc1 100644 --- a/Extra2D/src/event/event_queue.cpp +++ b/Extra2D/src/event/event_queue.cpp @@ -1,45 +1,58 @@ #include +#include namespace extra2d { EventQueue::EventQueue() = default; -bool EventQueue::push(const Event &event) { - return buffer_.push(event); -} +bool EventQueue::push(const Event &event) { return buffer_.push(event); } -bool EventQueue::push(Event &&event) { - return buffer_.push(std::move(event)); -} +bool EventQueue::push(Event &&event) { return buffer_.push(std::move(event)); } -bool EventQueue::poll(Event &event) { - return buffer_.pop(event); -} +bool EventQueue::poll(Event &event) { return buffer_.pop(event); } bool EventQueue::peek(Event &event) const { - std::lock_guard lock(mutex_); - if (buffer_.empty()) { - return false; - } - // 环形缓冲区不支持peek,这里简化处理 - // 实际应用中可能需要双缓冲或其他机制 + std::lock_guard lock(mutex_); + if (buffer_.empty()) { return false; + } + // 临时弹出元素查看,然后再放回 + // 由于RingBuffer是无锁设计,这里使用互斥锁保护 + Event temp; + if (!const_cast &>(buffer_).pop(temp)) { + return false; + } + event = temp; + // 将元素重新压入队列(需要特殊处理顺序) + // 创建一个临时缓冲区来保持顺序 + std::vector tempBuffer; + tempBuffer.push_back(std::move(temp)); + + // 弹出所有元素 + Event e; + while (const_cast &>(buffer_).pop(e)) { + tempBuffer.push_back(std::move(e)); + } + + // 重新压入所有元素 + for (auto &item : tempBuffer) { + const_cast &>(buffer_).push( + std::move(item)); + } + + return true; } void EventQueue::clear() { - std::lock_guard lock(mutex_); - Event event; - while (buffer_.pop(event)) { - // 持续弹出直到为空 - } + std::lock_guard lock(mutex_); + Event event; + while (buffer_.pop(event)) { + // 持续弹出直到为空 + } } -bool EventQueue::empty() const { - return buffer_.empty(); -} +bool EventQueue::empty() const { return buffer_.empty(); } -size_t EventQueue::size() const { - return buffer_.size(); -} +size_t EventQueue::size() const { return buffer_.size(); } } // namespace extra2d