Files
core_zero/tjp/core/containers/QueueThreadSafe.hpp
Timothy Prepscius 996151a56a flatten 20260225
2026-02-25 12:43:06 -05:00

81 lines
1.4 KiB
C++
Executable File

// 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<typename T, typename MutexType = Mutex>
class QueueThreadSafe
{
public:
List<T> 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<typename ... Args>
size_t emplace_back(Args&& ...args)
{
auto lk = lock_of(mutex);
queue.emplace_back(std::forward<Args>(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<typename F>
auto with(F &&f) {
auto lk = lock_of(mutex);
return f(queue);
}
} ;
} // namespace utilities
} // namespace