81 lines
1.4 KiB
C++
Executable File
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
|