// License: Modified MIT (NON-AI) // See the LICENSE file in the root directory for license information. // Copyright 2025 Timothy Prepscius #pragma once #include "List.h" #include "../threads/Lock.h" namespace tjp { namespace core { // this container is used in asio queue operations - // where the front is always popped and read from the same thread // this needs to be worked on, maybe a with_front(F &&f) template class QueueThreadSafe { public: List queue; mutable MutexType mutex; public: T &front() { auto lk = lock_of(mutex); return queue.front(); } size_t push_back(const T &t) { auto lk = lock_of(mutex); queue.push_back(t); return queue.size(); } size_t push_back(T &&t) { auto lk = lock_of(mutex); queue.emplace_back(std::move(t)); return queue.size(); } template size_t emplace_back(Args&& ...args) { auto lk = lock_of(mutex); queue.emplace_back(std::forward(args)...); return queue.size(); } size_t pop_front() { auto lk = lock_of(mutex); debug_assert(!queue.empty()); queue.pop_front(); return queue.size(); } size_t size() const { auto lk = lock_of(mutex); return queue.size(); } bool empty() const { auto lk = lock_of(mutex); return queue.empty(); } template auto with(F &&f) { auto lk = lock_of(mutex); return f(queue); } } ; } // namespace utilities } // namespace