flatten 20260225
This commit is contained in:
80
tjp/core/containers/QueueThreadSafe.hpp
Executable file
80
tjp/core/containers/QueueThreadSafe.hpp
Executable file
@@ -0,0 +1,80 @@
|
||||
// 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
|
||||
Reference in New Issue
Block a user