#pragma once // system includes #include // espressif includes #include #include // local includes #include "esputils.h" #include "delayedconstruction.h" #include "recursive_mutex_semaphore.h" #include "recursivelockhelper.h" namespace espcpputils { template class LockingQueue { public: void push(const T &val); void push(T &&val); std::optional tryPop(); void clear(); std::size_t size() const { return m_size; } private: espcpputils::recursive_mutex_semaphore m_lock; std::vector m_queue; std::size_t m_size{}; // double-buffered to allow for reading without taking a lock }; template void LockingQueue::push(const T &val) { RecursiveLockHelper helper{m_lock.handle}; m_queue.push_back(val); m_size = m_queue.size(); } template void LockingQueue::push(T &&val) { RecursiveLockHelper helper{m_lock.handle}; m_queue.emplace_back(std::move(val)); m_size = m_queue.size(); } template std::optional LockingQueue::tryPop() { RecursiveLockHelper helper{m_lock.handle}; if (m_queue.empty()) return std::nullopt; std::optional temp = std::move(m_queue.front()); m_queue.erase(std::begin(m_queue)); m_size = m_queue.size(); return temp; } template void LockingQueue::clear() { RecursiveLockHelper helper{m_lock.handle}; m_queue.clear(); } } // namespace espcpputils